Пишу сложный плагин для geomedia. Там есть странная dll-ка (pgeomath.dll): вроде как com подключается в референсах, но в реестре с нейц мало что связано. Есть от него tlb-ха но в ней стандартными средствами увидеь ничего не удается. VB нормально с ней работает как с com, видит все внутри без проблем. Проблема возникает тогда когда geomedia со своим фреймворком на тачке клиента ставится в папку отличную от той, в которой стоит у меня — мой activex не хочет даже регистрится — не находит референс. Подсовывание гадкой dll-ки в разные места ничего не дает. Библиотека pgeomath сама не регистрится как com. И как же мне быть?
В dll есть функции которые мне нужны:
когда в vb цепляю то есть функция в модуле GeometryMath функция StrokeGeometry — она-то мне и нужна
когда смотрю в dll — там вот что:
_GMAStrokeGeometry@8
_GMStrokeGeometry@8
пробовал по разному подключать через declare — пишет, что нет такой функции.
Что за хитрый объект и как с ним бороться. Все остальные объекты фреймворка — нормальные com-ы, видать потому что крутые функции производители хотели как-то защитить?... Файл прилагается.
http://www.rsdn.ru:80/File/43916/pgeomath.rar
Здравствуйте, BrainDrain, Вы писали:
BD>Пишу сложный плагин для geomedia. Там есть странная dll-ка (pgeomath.dll): вроде как com подключается в референсах, но в реестре с нейц мало что связано.
Твоя pgeomath.dll — это обычная стандартная DLL. Это не СОМ сервер, т.к. не содержит нужных СОМу точек входа. Также она не содержит ресурса с библиотекой типа (ресурс TypeLib), поэтому она не может быть "подключена в референсах".
То, что подключается через референс, — это pgeomath.tlb, которая описывает (все ли?) доступные функции из pgeomath.dll. Есть такой способ задания функций — через механизм библиотеки типа, а не через Declare для каждой используемой функции. Это удобно, но скрывает мехенизм.
BD>Есть от него tlb-ха, но в ней стандартными средствами увидеть ничего не удается. VB нормально с ней работает как с com, видит все внутри без проблем.
Твоя pgeomath.tlb является нормальной библиотекой типа и поэтому нормально смотрится всеми "стандартными средствами", в том числе и самим VB. Единственная трудность: твоя pgeomath.tlb зависит от PBasic.tlb и PCSS.tlb. От их регистрации зависит загрузка и регистрация pgeomath.tlb.
Т.к. у меня нет указанных tlb-шек, то вот что я имею:
VB информация:
Library PGeoMath
D:\Forums\RSDN\pgeomath\PGeoMath.tlb
Intergraph GeoMedia GeoMath 5.1
...
Sub SegmentIntersectSegment()
Member of PGeoMath.GeometryMath
Find the intersection of two segments
VC #import информация:
HRESULT __stdcall SegmentIntersectSegment(
__missing_type__,
__missing_type__,
__missing_type__,
__missing_type__,
__missing_type__,
long * IntersectionType );
OLE/COM Object Viewer информация:
[entry(0x60000007), helpstring("Find the intersection of two segments"), helpcontext(0x00002b66)]
HRESULT _stdcall SegmentIntersectSegment(
[in] <GetRefTypeInfo failed>* S1V1,
[in] <GetRefTypeInfo failed>* S1V2,
[in] <GetRefTypeInfo failed>* S2V1,
[in] <GetRefTypeInfo failed>* S2V2,
[out] <GetRefTypeInfo failed>** IntersectionPoint,
[out] long* IntersectionType);
BD>Проблема возникает тогда когда geomedia со своим фреймворком на тачке клиента ставится в папку отличную от той, в которой стоит у меня — мой activex не хочет даже регистрится — не находит референс.
А что твои "geomedia со своим фреймворком" не регистрируют эту tlb?
BD>Подсовывание гадкой dll-ки в разные места ничего не дает. Библиотека pgeomath сама не регистрится как com. И как же мне быть?
Нужно работать с pgeomath.tlb (и плюс PBasic.tlb и PCSS.tlb), а не с pgeomath.dll.
Здравствуйте, BrainDrain, Вы писали:
BD>Что за хитрый объект и как с ним бороться. Все остальные объекты фреймворка — нормальные com-ы, видать потому что крутые функции производители хотели как-то защитить?... Файл прилагается. http://www.rsdn.ru:80/File/43916/pgeomath.rar
В References своего проекта, нажми на <Browse> и выбери свою tlb-шку.
Sub StrokeGeometry(InputGeometry As Object, StrokedGeometry As Object)
Member of PGeoMath.GeometryMath
Здравствуйте, BrainDrain, Вы писали:
BD>Пишу сложный плагин для geomedia. Там есть странная dll-ка (pgeomath.dll): вроде как com подключается в референсах, но в реестре с нейц мало что связано. Есть от него tlb-ха но в ней стандартными средствами увидеь ничего не удается. VB нормально с ней работает как с com, видит все внутри без проблем. Проблема возникает тогда когда geomedia со своим фреймворком на тачке клиента ставится в папку отличную от той, в которой стоит у меня — мой activex не хочет даже регистрится — не находит референс. Подсовывание гадкой dll-ки в разные места ничего не дает. Библиотека pgeomath сама не регистрится как com. И как же мне быть?
BD>В dll есть функции которые мне нужны:
BD>когда в vb цепляю то есть функция в модуле GeometryMath функция StrokeGeometry — она-то мне и нужна
BD>когда смотрю в dll — там вот что:
BD>_GMAStrokeGeometry@8
BD>_GMStrokeGeometry@8
BD>пробовал по разному подключать через declare — пишет, что нет такой функции.
BD>Что за хитрый объект и как с ним бороться. Все остальные объекты фреймворка — нормальные com-ы, видать потому что крутые функции производители хотели как-то защитить?... Файл прилагается. http://www.rsdn.ru:80/File/43916/pgeomath.rar
Ясный перец, что я подключаю в референцах PGeoMath.tlb а не dll, но видимо из-за того что описание типов и реализация разделены, возникает такая проблема (когда у них тлб-ха была зарегена при установке GeoMedia по другому, отличному от моего пути) что на машине клиента при попытке regsvr32 мой_com, возникает ошибка "cannot load library". У меня на машине все ok. Поэтому я и хочув рантайме подключить dll-ку. Теперь из ваших слов я так понял нужно в рантайми tlb-ху? Но вот как? К тому же в dll (tlb) нет типов, а только модули и в них функции, поэтому getobject мне ничего не дает.
Здравствуйте, BrainDrain, Вы писали:
BD>Ясный перец, что я подключаю в референцах PGeoMath.tlb а не dll, но видимо из-за того что описание типов и реализация разделены, возникает такая проблема (когда у них тлб-ха была зарегена при установке GeoMedia по другому, отличному от моего пути) что на машине клиента при попытке regsvr32 мой_com, возникает ошибка "cannot load library". У меня на машине все ok. Поэтому я и хочув рантайме подключить dll-ку. Теперь из ваших слов я так понял нужно в рантайми tlb-ху? Но вот как? К тому же в dll (tlb) нет типов, а только модули и в них функции, поэтому getobject мне ничего не дает.
Механизм, который задействуется, неотличим от обычных Declare, только они все скрыты через "референц". Но пути поиска DLL не меняются. Что там у тебя написали, скорее всего, просто имя DLL (как в моем примере).
[uuid(610B38D0-577F-11D6-A449-004095426E66),version(1.0),helpstring("moddll 1.0 Type Library - Created in Monday")]
library moddllLib
{
[uuid(610B38D1-577F-11D6-A449-004095426E66),dllname("moddll.DLL")]
module somemodule
{
[helpstring("Test"),entry("_TestVarAnsi@4")] BSTR stdcall TestVarAnsi([in,out] LPSTR pStatus);
[helpstring("Test"),entry("_TestVarUni@4")] BSTR stdcall TestVarUni([in,out] LPWSTR pStatus);
};
};
Как бы то ни было, поиск этой DLL-ки будет осуществляться по путям, по которым обычно грузятся DLL (см. в MSDN LoadLibrary):
When no path is specified, the function searches for loaded modules whose base name matches the base name of the module to be loaded. If the name matches, the load succeeds. Otherwise, the function searches for the file in the following sequence:
The directory from which the application loaded.
The current directory.
Windows XP: If HKLM\System\CurrentControlSet\Control\SessionManager\SafeDllSearchMode is 1, the current directory is the last directory searched. The default value is 0.
The Windows system directory. Use the GetSystemDirectory function to get the path of this directory.
Windows NT/2000/XP: The name of this directory is System32.
Windows NT/2000/XP: The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is System.
The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
The directories that are listed in the PATH environment variable.
Проверь на работающей машине, как достигается твоя DLL из VB приложения, т.е. какой пункт загрузки используется. И сделай так же на неработающей.
PS
Я не уверен, грузит ли VB саму PGeoMath.tlb во время запуска приложения, но если грузит, то должны быть установлены все те TLB, от которых зависит PGeoMath.tlb. Иначе будет ошибка загрузки TLB.