|
(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 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Просто третий параметр туда дописать? По логике то что в оригинале является 3-м параметром ([out, retval] LONG *plErrorBodyFile), за его отсутствием вбухивается в то что ф-ция в Interop возвращает (-1 при успехе она возвращает), а HRESULT вбухивается в Exeption (Err.Number). Знать бы еще тот китайский на котором это дописать. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 12:34 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Дмитрий77Просто третий параметр туда дописать? По логике то что в оригинале является 3-м параметром ([out, retval] LONG *plErrorBodyFile), за его отсутствием вбухивается в то что ф-ция в Interop возвращает (-1 при успехе она возвращает), а HRESULT вбухивается в Exeption (Err.Number). Знать бы еще тот китайский на котором это дописать. Взял бы и написал на CLI обётку и не мучался :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 12:36 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 12:43 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
hVosttВзял бы и написал на CLI обётку и не мучался :) Да я как бы не мучаюсь, я понять хочу. Ты имеешь ввиду CoInitialize/CoCreateInstance? Задолбаешься. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 12:43 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Дмитрий77, Preserve Signature смотри ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 12:49 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 12:58 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
ИзопропилДмитрий77, Preserve Signature смотри LONG *plErrorBodyFile , [out] int32& plErrorBodyFile сойдет? попробуем-с... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 13:03 |
|
(COM) Разная интерпретация одного и того же метода в С++ и Vb.Net/C#(Interop)
|
|||
---|---|---|---|
#18+
Изопропил, все получилось, круто. Код: vbnet 1. 2.
Код: 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. 29. 30. 31. 32. 33. 34.
Возвращает: Код: vbnet 1. 2.
(совсем другое дело - вместо тупого исключения "Operation failed") Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 13:34 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1399711]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 305ms |
total: | 457ms |
0 / 0 |