powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
12 сообщений из 12, страница 1 из 1
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38948053
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вкратце.
Есть библиотека 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.
  Dim objFaxDocument As As Object
...
  Dim g_objFaxServer As Object = CreateObject("FAXCOMEX.FaxServer")
  g_objFaxServer.Connect("")
  Dim objFaxDocument As Object = CreateObject("FAXCOMEX.FaxDocument")



Хорошо, создаю обертку Interop.FAXCOMEXLib.dll (на Win 8.1, под Net.2, в 2013-й вылеченной студии, т.е. обертка правильной версии .Net), первый вариант кода такой:
Код: vbnet
1.
2.
3.
4.
5.
6.
  Dim g_objFaxServer As FAXCOMEXLib.FaxServer
...
  g_objFaxServer = New FAXCOMEXLib.FaxServer
  g_objFaxServer.Connect("")
  Dim objFaxDocument As FAXCOMEXLib.FaxDocument
  objFaxDocument = New FAXCOMEXLib.FaxDocument


На XP ругается:
Невозможно привести COM-объект "FAXCOMEXLib.FaxServerClass" к интерфейсному типу "FAXCOMEXLib.IFaxServer2"
Извернулся
Код: vbnet
1.
2.
3.
4.
5.
6.
  Dim g_objFaxServer As FAXCOMEXLib.IFaxServer
...
  g_objFaxServer = New FAXCOMEXLib.FaxServer
  g_objFaxServer.Connect("")
  Dim objFaxDocument As FAXCOMEXLib.IFaxDocument
  objFaxDocument = New FAXCOMEXLib.FaxDocument

Стало работать и на XP тоже.

Ну допустим, а дальше мне понадобится:
Код: vbnet
1.
Dim WithEvents g_objFaxServer As FAXCOMEXLib.FaxServer


IFaxServer с WithEvents не объявишь, нету у него "events", нужен объект.

Пытался так:
Код: vbnet
1.
2.
3.
4.
5.
6.
  Dim WithEvents g_objFaxServer As FAXCOMEXLib.FaxServer
...
  g_objFaxServer = TryCast(New FAXCOMEXLib.FaxServer, FAXCOMEXLib.IFaxServer)
  g_objFaxServer.Connect("")
  Dim objFaxDocument As FAXCOMEXLib.FaxDocument
  objFaxDocument = TryCast(New FAXCOMEXLib.FaxDocument, FAXCOMEXLib.IFaxDocument)


Ни фига, требует IFaxServer2 и IFaxDocument2.

Как этому Interop.FAXCOMEXLib.dll в коде объяснить, что надо привязываться к IFaxServer и IFaxDocument (без двоек на конце)?
Кроме конечно варианта попытки изготовления Interop на XP в какой-либо старой студии, чтоб не знала про двойку (попытку делал - не удачно, и считаю это плохой идеей). Интерфейсы которые без двоек годятся и для XP и для всего остального, которые с двойками - для XP не годятся. (на VB6 во всяком случае для exe-шников скомпилированных на XP таких проблем не было, они работали везде).

Фишка в том, что 8-рошный Interop содержит все необходимое для работы на XP, но его тупо "ведет" на "вторые" интерфейсы. При попытке явно подсунуть в проекте ссылку на XP-шную dll (с целью создания Interop без двоек) меняет на более свежую ссылку.

Или все, задница? Свой "Interop" я для этой штуки не напишу, там черт ногу сломит.
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38948283
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
1. Забить на XP.
2. Делать отдельные сборки для XP и старших версий.
3. В коде смотреть, что за ОС переводить управление на специфичную ветвь кода.
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38948596
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ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 чтобы это сделать "в своей среде" естественно невозможно.
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38948622
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Тогда используй позднее связывание.
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38948638
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВТогда используй позднее связывание.
Не вариант.
Код: vbnet
1.
Dim WithEvents g_objFaxServer As FAXCOMEXLib.FaxServer



Interop. "старого образца" надо как-то делать. Как?

P.S. В одном модуле да, я использую позднее связывание.
А в другом мне нужны события и без раннего никак.
Есть еще вариант оставить этот модуль на VB6 (GUI там нету). Но уж если переписываю на .Net, то сборная солянка это неправильно.
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38948695
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77ЕвгенийВТогда используй позднее связывание.
Не вариант.
Код: vbnet
1.
Dim WithEvents g_objFaxServer As FAXCOMEXLib.FaxServer



Interop. "старого образца" надо как-то делать. Как?

P.S. В одном модуле да, я использую позднее связывание.
А в другом мне нужны события и без раннего никак.
Есть еще вариант оставить этот модуль на VB6 (GUI там нету). Но уж если переписываю на .Net, то сборная солянка это неправильно.
Ну и что? Инициализация события это вызов метода со специальным именем типа add_[Имя события], которому передается 1 параметр, объект-делегат. Который в свою очередь указывает на метод с определенной сигнатурой.
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38948745
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВДмитрий77ЕвгенийВТогда используй позднее связывание.
Не вариант.
Код: vbnet
1.
Dim WithEvents g_objFaxServer As FAXCOMEXLib.FaxServer



Ну и что? Инициализация события это вызов метода со специальным именем типа 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).
Короче пока забью, доделаю модуль что сейчас занимаюсь, потом буду экспериментировать.
Ну раз никто не шарит.
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38949155
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче нетривиально но лечится.

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 отсутствует -нет не нужна).

Как то так.
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38949166
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Тупо подменять Interop нельзя (будет ругаться), делается так:
Для фиксации версии библиотеки (в т.ч. COM-interop врапперов) люди обычно используют указаный в конфиге bindingRedirect .
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38949700
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныДмитрий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.
Microsoft Fax Service Extended COM Type Library v.1.0


То бишь
oldVersion="1.0.0.0"
newVersion="1.0.0.0"
А начинка извините разная на Виста-8.1 она навороченная, а на XP-урезанная,
при этом начинка XP полностью совместима с dll которая на Виста-8.1, но не наоборот.

И именно по причине "одинакового номера версии 1.0.0.0" COM объекта пришлось делать кучу движений чтобы изготовить Interop "старого образца").
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38950277
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77И именно по причине "одинакового номера версии 1.0.0.0" COM объекта пришлось делать кучу движений чтобы изготовить Interop "старого образца").напиши разработчикам, что они лошары :)

еще можно не ждать их реакции, а экспортировать idl из библиотеки, заменить эту строчку на 2.0.0.0, скомилировать tlb и подключаться к ней вместо dll.
dll при этом регистрировать вроде бы не нужно.
...
Рейтинг: 0 / 0
COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
    #38950841
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyнапиши разработчикам, что они лошары :)
Кому? MS?
У них походу многие COM по принципу "вечно первой версии" сделаны. И определенная логика в этом есть.

Ну, сделал же я в итоге "универсальный Interop" и ладно. Работа в общем разовая. Я сомневаюсь что в "новой модели" есть что-то супер-пупер относительно "старой", кроме запутанности с IInterface2.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / COM, класс Lib.xxx и интерфейсы Lib.Ixxx и Lib.Ixxx2 Как привязать Lib.xxx к Lib.Ixxx?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]