Соврешенно одинаковый код на разных машинах с одинаковой ОС (NT4)
работает по-разному.
Ситуация следующая: В главном потоке создается COM-объект,указатель на интерфейс которого маршалится в рабочие потоки.
Так вот, при размаршаливании в рабочих потоках CoGetInterfaceAndReleaseStream возвращает DISP_E_BADVARTYPE, хотя он не должен вообще возвращать такого значения! Интерфейс унаследован от IUnknown.
У меня на машине код работает нормально (интерфейс нормально размаршаливается и рабочие потоки вовсю его используют),а у заказчика вышеописанная проблема!
С чем это может быть связано?
Я раньше тоже юзал эти функции для межпоточного маршалинга, но потом меня их глючность начала доставать и я перешел на GIT (IGlobalInterfaceTable) и не каких проблем.
Глюки проявлялись тоже (как у тебя) в этой же функции, правда код ошибки я не помню.
gfn>Так вот, при размаршаливании в рабочих потоках CoGetInterfaceAndReleaseStream возвращает DISP_E_BADVARTYPE, хотя он не должен вообще возвращать такого значения! Интерфейс унаследован от IUnknown.
gfn>С чем это может быть связано?
Это так или иначе связано с преобразованием VARIANTов через VariantChangeType или чтении этой информации из TLB.
Не используются ли в IDL файле типы, выходящие из ряда "нормальных", т.е. short, long, BSTR, SAFEARRAY и прочих, описанных в oleautomation? Или используются свои прокси/стабы?
Здравствуйте, Vi2, Вы писали:
Vi2>Это так или иначе связано с преобразованием VARIANTов через VariantChangeType или чтении этой информации из TLB.
Vi2>Не используются ли в IDL файле типы, выходящие из ряда "нормальных", т.е. short, long, BSTR, SAFEARRAY и прочих, описанных в oleautomation? Или используются свои прокси/стабы?
Здравствуйте, Tom, Вы писали:
Tom>В IDL всё нормально. Tom>Вообще значение похоже на ошибку при вызове внутри твоего метода... Tom>Протрасируй, вызов хоть приходит внутрь...
В том то и беда, что у меня все замечательно входит и выходит, как говорил Винни-Пух
А у заказчика до вызова метода интерфейса дело не доходит — рабочий поток его размаршалить не может.
gfn>В том то и беда, что у меня все замечательно входит и выходит, как говорил Винни-Пух gfn>А у заказчика до вызова метода интерфейса дело не доходит — рабочий поток его размаршалить не может.
Ну значит с праксёй проблемма.
Скорее всего у тебя так как у интерфейсов стоит атрибут dual, то зарегистрирована прокся от oleautomation маршалера. А твоя скомпилированная не регистрируется. По этому ессно размаршалить этот интерфейс oleautomation пракся не может. Убери dual как говорил Vi2...
Здравствуйте, Tom, Вы писали:
Tom>Ну значит с праксёй проблемма. Tom>Скорее всего у тебя так как у интерфейсов стоит атрибут dual, то зарегистрирована прокся от oleautomation маршалера. А твоя скомпилированная не регистрируется. По этому ессно размаршалить этот интерфейс oleautomation пракся не может. Убери dual как говорил Vi2...
Спасибо большое, действительно, похоже так все и было. Обманул меня клиент, сказал, что все зарегистрировал правильно.
gfn>...Обманул меня клиент, сказал, что все зарегистрировал правильно.
В этом проблема своих проксей/стабов. Их нужно регистрировать — обязательно, отдельно и после основного сервера (и, по уму, дерегистрировать перед). Неплохо справляется с этим специальный код регистрации/дерегистрации сервера, который и выполнял бы эту необходимую процедуру при запуске с ключами -RegServer и -UnregServer. Но это же писать надо...