|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Используем Fax Service Extended COM Задача: объединить в один факс несколько документов IFaxDocument2::Bodies property и послать используя IFaxDocument2::ConnectedSubmit2 method При этом намеренно подсовываем некорректный документ (например .wav), и хотим узнать индекс паршивого документа (чтобы понять какой именно документ вышиб ф-цию). Метод ConnectedSubmit2 (ссылка выше) нам такую возможность вроде как предоставляет, ниже оригинал из MSDN. Код: plaintext 1. 2. 3. 4. 5.
plErrorBodyFile [out, retval]Type: LONG* A LONG representing the zero-based position of the submitted file that caused the fax send operation to fail. . To illustrate plErrorBodyFile, here is an example: The following list of files is submitted as the value of IFaxDocument2::Bodies: "MyTextFile.txt;AnotherTextFile.txt;MyPDFfile.pdf;MyWordFile.doc". Because the "*.pdf" extension is not supported, the send operation will fail and plErrorBodyFile will return as 2. Рисуем простенький код Vb.Net (С# фактически тоже самое, лазил в пример SDK) с заложенной ошибкой: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
И вот здесь нестыковка. Вот что есть в Interop: Код: vbnet 1. 2.
Вот такая чушь в VB.Net примере SDK Win7 (такая же для C#): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Ну т.е. по логике iErrorIndex это и есть plErrorBodyFile, да, если все хорошо, то iErrorIndex возвращает "-1" - нет "бракованных" файлов Но если плохо, то вываливаемся по Exeption "Operation failed" -и на этом все. Т.е. ничего кроме -1 в случае успеха эта хрень в принципе вернуть не может. Вопрос понятен: что я должен сделать с кодом чтобы получить plErrorBodyFile? Для сравнения C++ код, тот же SDK пример (простыня, не хотелось бы с этим связываться, делал один раз в VB6 CoCreateInstance, но это "нечто") выглядит так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 21:52 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Не, но это фигня какая-то C++ тест пример из SDK этот момент нормально отрабатывает: Код: vbnet 1. 2. 3.
А как этот plErrorBodyFile вытянуть из Код: vbnet 1. 2.
я не понимаю. Потому что если она валится в Exeption, то понятно что уже ничего не вернет. Т.е. какая курица так сделала и почему так? Если не удастся понять и как-то извлечь номер файла из VB-кода, то видится только один относит. простой вариант: в случае возврата этой ошибки в VB.Net (Operation Failed==80070483==-2147023741) запускать консольное приложение C++ с теми же исх. параметрами (файлами) А консольное приложение сделать так: переработать SDK Sample так чтобы он возвращал индекс файла в качестве Error Level (ExitCode). Ну либо оформить как Dll и вызов через API, либо полностью делегировать эту ф-цию в C++, но это умучаешься. Либо городить огород с CoInitialize/CoCreateInstance в .Net, но чет я не готов к подобным подвигам. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 09:29 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Дмитрий77, Какой еще exception если речь идёт про COM? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 09:49 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Дмитрий77, если только какая-нибудь обёртка ловит код возврата и генерирует исключение. ты про какой случай говоришь? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 09:49 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
hVosttДмитрий77, Какой еще exception если речь идёт про COM?самый обыкновенный- стандартный маршаллинг HRESULT ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:13 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
hVosttДмитрий77, если только какая-нибудь обёртка ловит код возврата и генерирует исключение. ты про какой случай говоришь? стандартый маршаллер так действует рекомендации MS- typelib поправить или сборку импортную покалечить (ilasm-ildasm) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:19 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:21 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
hVosttДмитрий77, Какой еще exception если речь идёт про COM? В первом посте код приведен. .ConnectedSubmit2 дает ошибку, уходим в Catch Не, можно On Error Resume Next как в VB6, а потом Err.Number/Err.Description, будут те же яйца только в профиль. Код: vbnet 1. 2. 3. 4. 5. 6.
Ты описание проблемы почитай полностью. Вот тебе этот COM прикреплен. 20788648 (брать надо из папки Vista_Win10) Ну либо просто добавь ссылку на "Microsoft Fax Service Extended COM Type Library". Надо получить plErrorBodyFile, я не знаю как это сделать из VB (да и из C# -пофиг). Ну как бы либо читай первый пост внимательно если есть желание врубиться, помочь, подсказать, высказаться по теме , ну либо не отвечай ничего что ли. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:23 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Изопропилрекомендации MS- typelib поправить или сборку импортную покалечить (ilasm-ildasm) Изопропил https://msdn.microsoft.com/en-us/library/8zbc969t(v=vs.90).aspx Я так понимаю, мне сюда копать? Т.е. я должен по сути переписать Interop (нужную ф-цию) таким образом, чтоб вместо вылета в Exeption, возвращался HRESULT, который я разбираю типа как при работе с API, S_OK - хорошо, все остальное плохо, ну и чтобы ловилось то что мне нужно ByRef (как в оригинале). Уловил верно? ilasm-ildasm это утилиты какие-то? Здесь подвопрос. У меня Interop "универсальный" под .Net 2.0.(чтоб работал под 2.0/3.5/4.5 Debug/Release x64/Win32) Возможно в скобках частично глупости и несущественное. Ну т.е. если я его туда-сюда курочу, то надо чтоб был "такой же". Как это соотносится с ilasm-ildasm? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:51 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
>ilasm-ildasm А где эти exe-шники лежат? И от какой студии их брать под .Net 2.0? 2005? 2005 у меня только C++ стоит (полная и Express). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:59 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Дмитрий77Т.е. я должен по сути переписать Interop (нужную ф-цию) таким образом, чтоб вместо вылета в Exeption, возвращался HRESULT, который я разбираю типа как при работе с API, Ну ок. Отловить эксепшен и прочитать код ошибки, не? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:01 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Дмитрий77, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:02 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:03 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Дмитрий77Ну как бы либо читай первый пост внимательно если есть желание врубиться, помочь, подсказать, высказаться по теме , ну либо не отвечай ничего что ли. Да пофиг, возвращается эксепшен, лови его и читай код ошибки. Не возвращается, получаей код ошибки. Какие ещё варианты? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:05 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
hVostt, с Try Catch все понятно и так (ну не объясняй мне этот .Net-овский детский сад пожалуйста). мне нужен не код ошибки, а индекс документа, который эту ошибку вызвал Код: plaintext 1. 2. 3. 4. 5.
>возвращается эксепшен, лови его и читай код ошибки. >Не возвращается, получаей код ошибки. эксепшен ловит только HRESULT, то чего мне надо он не ловит Изопропил кажется дело говорит. Пока нашел C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe (v.2.0.50727.42 -наверно пойдет с учетом сказанного) Что-то я там ilasm.exe не вижу. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:21 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
hVosttНу ок. Отловить эксепшен и прочитать код ошибки, не? кроме кода ошибки нужно значение выходного параметра ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:27 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Странно, ilasm.exe нигде нету, вообще никакого. Делал поиск в обоих Program Files. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:28 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Дмитрий77, ilasm живёт в C:\Windows\Microsoft.NET\Framework64\... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:30 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Дмитрий77>возвращается эксепшен, лови его и читай код ошибки. >Не возвращается, получаей код ошибки. эксепшен ловит только HRESULT, то чего мне надо он не ловит Изопропил кажется дело говорит. Хм.. может тогда лучше в CLI сделать свою обёртку? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:41 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
hVosttДмитрий77>возвращается эксепшен, лови его и читай код ошибки. >Не возвращается, получаей код ошибки. эксепшен ловит только HRESULT, то чего мне надо он не ловит Изопропил кажется дело говорит. Хм.. может тогда лучше в CLI сделать свою обёртку? исправлением или ручным созданием импорта обычно обходятся ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:45 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Изопропилисправлением или ручным созданием импорта обычно обходятся Ручное создание импорта это что? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:47 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Изопропилilasm живёт в C:\Windows\Microsoft.NET\Framework64\... Тогда наверно вот этот в самый раз: C:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe (v.2.0.50727.8745) Ну допустим сделал команду C:\Setup\Tests\Interop>ildasm Interop.FAXCOMEXLib.dll /out:Interop.FAXCOMEXLib.il Получился Interop.FAXCOMEXLib.il, по умолчанию ничем не открывается. Ты мне когда-то присоветовал ILSpy - есть такой на компе. Ну им в принципе и сам Interop можно открыть. А им (ILSpy) нельзя просто покурочить и пересохранить? File -> Save Code ? (в смысле без ilasm-ildasm) А чего и как курочить? Про IFaxDocument2-> ConnectedSubmit2 там на желтеньком справа написано Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:51 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
hVostt, при импорте tlb никакой мистики не происходит - сборка с описанием интеропа создаётся такую сборку можно и руками сделать(tlb и кривыми бывают) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 11:55 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
ИзопропилhVostt, при импорте tlb никакой мистики не происходит - сборка с описанием интеропа создаётся такую сборку можно и руками сделать(tlb и кривыми бывают) Ну так что ты имеешь в виду, руками сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 12:00 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Изопропил, ну я понял, il это текстовуха, открыл пока в блокноте На тему ConnectedSubmit2 есть в двух местах: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
и никаких намеков на Код: plaintext 1. 2. 3. 4. 5.
И че мне с этим делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 12:12 |
|
|
start [/forum/topic.php?fid=20&fpage=39&tid=1399711]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
1ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 160ms |
0 / 0 |