|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
Вкратце. Есть библиотека Microsoft Fax Service Extended COM Type Library v.1.0 (fxscomex.dll) Есть на всех ОС (нету только если вин факс сервер не установлен, версия всегда 1.0) Есть различия между XP и тем что начинается от Висты Например, Есть объект FaxServer , ему соответствуют интерфейсы IFaxServer и IFaxServer2 (начиная с Висты) Есть объект FaxDocument, ему соответствуют интерфейсы IFaxDocument и IFaxDocument2 (начиная с Висты) ну и все остальное в таком же духе. Вот так естественно код инвариантен относительно XP/выше (позднее связывание): Код: vbnet 1. 2. 3. 4. 5.
Хорошо, создаю обертку Interop.FAXCOMEXLib.dll (на Win 8.1, под Net.2, в 2013-й вылеченной студии, т.е. обертка правильной версии .Net), первый вариант кода такой: Код: vbnet 1. 2. 3. 4. 5. 6.
На XP ругается: Невозможно привести COM-объект "FAXCOMEXLib.FaxServerClass" к интерфейсному типу "FAXCOMEXLib.IFaxServer2" Извернулся Код: vbnet 1. 2. 3. 4. 5. 6.
Стало работать и на XP тоже. Ну допустим, а дальше мне понадобится: Код: vbnet 1.
IFaxServer с WithEvents не объявишь, нету у него "events", нужен объект. Пытался так: Код: vbnet 1. 2. 3. 4. 5. 6.
Ни фига, требует IFaxServer2 и IFaxDocument2. Как этому Interop.FAXCOMEXLib.dll в коде объяснить, что надо привязываться к IFaxServer и IFaxDocument (без двоек на конце)? Кроме конечно варианта попытки изготовления Interop на XP в какой-либо старой студии, чтоб не знала про двойку (попытку делал - не удачно, и считаю это плохой идеей). Интерфейсы которые без двоек годятся и для XP и для всего остального, которые с двойками - для XP не годятся. (на VB6 во всяком случае для exe-шников скомпилированных на XP таких проблем не было, они работали везде). Фишка в том, что 8-рошный Interop содержит все необходимое для работы на XP, но его тупо "ведет" на "вторые" интерфейсы. При попытке явно подсунуть в проекте ссылку на XP-шную dll (с целью создания Interop без двоек) меняет на более свежую ссылку. Или все, задница? Свой "Interop" я для этой штуки не напишу, там черт ногу сломит. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2015, 04:14 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
Дмитрий77, 1. Забить на XP. 2. Делать отдельные сборки для XP и старших версий. 3. В коде смотреть, что за ОС переводить управление на специфичную ветвь кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2015, 11:06 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
ЕвгенийВ1. Забить на XP. Да, и еще 2003-й сервер. Не рассматриваем. ЕвгенийВ3. В коде смотреть, что за ОС переводить управление на специфичную ветвь кода. Смотреть что за OS не проблема, а вот "переводить управление на специфичную ветвь кода" -в данном случае пока только красивые слова. ЕвгенийВ2. Делать отдельные сборки для XP и старших версий. Разумно. Более того, грамотно сделанная "Interop-сборка для XP" предположительно будет работать везде. IFaxServer поддерживается везде, IFaxServer2 является Inherited от IFaxServer но отсутствует на XP Вопрос как этот "XP-Interop" сделать. Т.е. мне надо сделать Interop на базе любой fxscomex.dll взятой из XP. При этом совместимый с exe-шниками VS2013 и заданной версии .Net. 1. Interop-ы сделанные в лоб из XP-шной dll с использованием C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe либо C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\TlbImp.exe (они типа делают не под 4-й .Net, а под 2-3.5) с проектом не работают. 2. В 2013-й я TlbImp.exe не нашел. И в любом случае надо понимать как ему указать версию .Net ну и там x86/AnyCPU если таковой и есть. Ultimate 2013 у меня стоит, т.е. кухня с "версиями .Net для Interop" фурычит корректно. 3. Пристыковать на дурака XP-шную fxscomex.dll на 8-ке к проекту в качестве ссылки (чтоб он смухлевал нужный мне Interop) не получается. Ставишь галку на XP-шной, он ее заменяет на имеющуюся из 8-ки. (название и "версия" COM одинаковы на XP и 8-ке). Вот как его обмануть? Все что надо - это Interop под XP-реализацию dll, который класть в папку с exe (все GUID-ы там совпадают кроме того что стрелки неправильно переведены на несуществующие в XP IInterface2 вместо IInterface(без 2) -достаточен думаю жесткий перевод на IInterface(без 2) -и для 8-ок тоже). Установить 2013-ю студию на XP чтобы это сделать "в своей среде" естественно невозможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2015, 13:53 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
Дмитрий77, Тогда используй позднее связывание. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2015, 14:06 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
ЕвгенийВТогда используй позднее связывание. Не вариант. Код: vbnet 1.
Interop. "старого образца" надо как-то делать. Как? P.S. В одном модуле да, я использую позднее связывание. А в другом мне нужны события и без раннего никак. Есть еще вариант оставить этот модуль на VB6 (GUI там нету). Но уж если переписываю на .Net, то сборная солянка это неправильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2015, 14:17 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
Дмитрий77ЕвгенийВТогда используй позднее связывание. Не вариант. Код: vbnet 1.
Interop. "старого образца" надо как-то делать. Как? P.S. В одном модуле да, я использую позднее связывание. А в другом мне нужны события и без раннего никак. Есть еще вариант оставить этот модуль на VB6 (GUI там нету). Но уж если переписываю на .Net, то сборная солянка это неправильно. Ну и что? Инициализация события это вызов метода со специальным именем типа add_[Имя события], которому передается 1 параметр, объект-делегат. Который в свою очередь указывает на метод с определенной сигнатурой. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2015, 15:01 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
ЕвгенийВДмитрий77ЕвгенийВТогда используй позднее связывание. Не вариант. Код: vbnet 1.
Ну и что? Инициализация события это вызов метода со специальным именем типа add_[Имя события], которому передается 1 параметр, объект-делегат. Который в свою очередь указывает на метод с определенной сигнатурой. Что значит ну и что? Вот здесь писали Interop ручками для позднего связывания. VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно? Нехило так. Для двух несчастных событий, где без этого вообще можно было обойтись. Надеюсь не предлагаешь тоже самое делать для факс-сервера. Там очень много всего, нереально и неоправдано, можешь заглянуть ради интереса. Вот здесь бодались чтоб 2013-я студия правильно генерила Interop-ы для заданных версий .Net. Сборка создана в более поздней версии среды выполнения чем текущая -как бодаться Не, ну конечно надо искать способ сделать Interop на базе XP-шной dll и именно в VS2013 сразу заготовить под все возможные сборки если получится понять как (т.е. в моем случае это (x86/x64/AnyCPU)x(Net2.0/Net4.5) ). Думаю Net2.0 AnyCPU Interop-сборка на базе XP-шной dll достаточно на все случаи жизни. Возможно временно удалить Fax & Scan на 8-ке, м.б. почистить GAS или как этот бред там называется - чтоб не цеплялся за 8-шную версию dll при компиляции Interop и подсунуть старую dll (использоваться конечно должна всегда своя родная зарегистрированная на данной OS). Короче пока забью, доделаю модуль что сейчас занимаюсь, потом буду экспериментировать. Ну раз никто не шарит. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2015, 15:36 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
Короче нетривиально но лечится. 1. Изготавливаем правильный Interop. 1) Удаляем признаки родной (восьмерочной) fxscomex.dll на develop-системе. Для этого тупо удаляем "Windows Fax and Scan" через компоненты виндов и перегружаем комп. 2) Берем первую попавшуюся fxscomex.dll из XP и регистрируем ее через regsvr32. 3) После этого можем добавить XP-шную fxscomex.dll в ссылки + копировать локально и запускаем проект на исполнение. Он конечно вылетит но суть в том что получим правильный Interop "старого образца". 4) Самым правильным будет тот который получается в конфигурации AnyCPU+Net2.0 напр. Debug (его потом можно жрать в любых конфигурациях и версиях Net). Вынимаем его из папки bin\Debug и сохраняем в надежном месте. 5) Восстанавливаем систему, т.е. делаем regsvr32 /u для XP-шной dll и устанавливаем "Windows Fax and Scan". Тупо подменять Interop нельзя (будет ругаться), делается так: 2. Используем этот Interop При ваянии проекта вместо ссылки на dll из списка явно добавляем ссылку на заначенный Interop (сделанный из XP-dll под Any CPU под .Net2) + копировать локально . Все. Будет работать в любых конфигурациях AnyCPU/x86/x64 Debug/Release под любую версию .Net 2.0-4.5 и на любых OS XP-8.1 XP-шная модель COM совместима с последующими, а вот обратной совместимости нет. Обертку надо делать под младшую .Net (2.0), т.к. она на ура кушается старшими .Net, а вот обертка старшей версии в 2.0 не кушается. (здесь еще были сомнения, обязательна ли установка .Net2 если exe 4.5, а обертка под 2.0, проверил на 2012R2 где .Net2 отсутствует -нет не нужна). Как то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2015, 03:52 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
Дмитрий77Тупо подменять Interop нельзя (будет ругаться), делается так: Для фиксации версии библиотеки (в т.ч. COM-interop врапперов) люди обычно используют указаный в конфиге bindingRedirect . ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2015, 06:21 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныДмитрий77Тупо подменять Interop нельзя (будет ругаться)... Давай объясню что имел ввиду, поленился расписывать. Смотрим сюда: 17584532 Пункт 1 понятно - я создал "Interop старого образца" из XP-dll А дальше делаем так (уже после "восстановления" родного восьмерочного fxscomex.dll т.е. Fax & Scan): 1) Создаем новый проект 2) Ссылаемся обычным образом на Microsoft Fax Service Extended COM Type Library v.1.0 (fxscomex.dll) + копировать локально Он создаст "Interop нового образца" из 8.1-dll 3) Переносим на XP-компьютер 2 файла: proga.exe + "Interop нового образца". Он будет ругаться. 4) А теперь пытаемся тупо подменить "Interop нового образца" на "Interop старого образца" (на XP машине). И он все равно будет ругаться и хотеть IFaxServer 2 (после подмены Interop на "старого образца"). А правильно: авторвместо ссылки на dll из списка явно добавляем ссылку на заначенный Interop (сделанный из XP-dll под Any CPU под .Net2) + копировать локально . А теперь о твоем комментарии. Сон Веры ПавловныДля фиксации версии библиотеки (в т.ч. COM-interop врапперов) люди обычно используют указаный в конфиге bindingRedirect . Ну во-первых не понимаю о каком конфиге идет речь, где он есть, где его редактировать и т.п. Во-вторых интуитивно подозреваю что в данном конкретном случае это не поможет. Потому что COM всегда Код: vbnet 1.
То бишь oldVersion="1.0.0.0" newVersion="1.0.0.0" А начинка извините разная на Виста-8.1 она навороченная, а на XP-урезанная, при этом начинка XP полностью совместима с dll которая на Виста-8.1, но не наоборот. И именно по причине "одинакового номера версии 1.0.0.0" COM объекта пришлось делать кучу движений чтобы изготовить Interop "старого образца"). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2015, 14:15 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
Дмитрий77И именно по причине "одинакового номера версии 1.0.0.0" COM объекта пришлось делать кучу движений чтобы изготовить Interop "старого образца").напиши разработчикам, что они лошары :) еще можно не ждать их реакции, а экспортировать idl из библиотеки, заменить эту строчку на 2.0.0.0, скомилировать tlb и подключаться к ней вместо dll. dll при этом регистрировать вроде бы не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2015, 14:27 |
|
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
|
|||
---|---|---|---|
#18+
Antonariyнапиши разработчикам, что они лошары :) Кому? MS? У них походу многие COM по принципу "вечно первой версии" сделаны. И определенная логика в этом есть. Ну, сделал же я в итоге "универсальный Interop" и ладно. Работа в общем разовая. Я сомневаюсь что в "новой модели" есть что-то супер-пупер относительно "старой", кроме запутанности с IInterface2. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2015, 20:49 |
|
|
start [/forum/topic.php?fid=20&fpage=86&tid=1401590]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
24ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
others: | 26ms |
total: | 178ms |
0 / 0 |