Здравствуйте, Tom, Вы писали:
ДК>С чем это может быть связано? Tom>Например с тем, что CoInitializeEx(NULL, COINIT_MULTITHREADED) надо вызывать для каждого потока...
Разве? Для COINIT_MULTITHREADED?
Я сейчас попробовал выполнить это из того же потока, где вызвал CoInitializeEx. Результат — прежний.
Также поизголялся в бейсике:
Dim obj As AVIMAKERLib.AviMaker
Set obj = CreateObject("AVIMAKER.AviMaker")
Call obj.AboutBox
— не работает — на 2-й строке пишет ActiveX component can't create object
Dim obj As AVIMAKERLib.AviMaker
Set obj = new AVIMAKER.AviMaker
Call obj.AboutBox
Здравствуйте, Денис_К, Вы писали:
ДК>Здравствуйте, Tom, Вы писали:
ДК>>С чем это может быть связано? Tom>>Например с тем, что CoInitializeEx(NULL, COINIT_MULTITHREADED) надо вызывать для каждого потока...
ДК>Разве? Для COINIT_MULTITHREADED?
Именно для каждого потока:
Initializes the COM library for use by the calling thread, sets the thread's concurrency model, and creates a new apartment for the thread if one is required.
ДК>Я сейчас попробовал выполнить это из того же потока, где вызвал CoInitializeEx. Результат — прежний. ДК>Также поизголялся в бейсике: ДК>
ДК> Dim obj As AVIMAKERLib.AviMaker
ДК> Set obj = CreateObject("AVIMAKER.AviMaker")
ДК> Call obj.AboutBox
ДК>
ДК> — не работает — на 2-й строке пишет ActiveX component can't create object
Это может быть потому, что указан не правильный ProgID. т.е строчка "AVIMAKER.AviMaker" неверна. Что бы найти правильный ProgID можно поискать его в реестре в ключе "HKEY_CLASSES_ROOT\твой прог айди"
ДК> ДК>
ДК> Dim obj As AVIMAKERLib.AviMaker
ДК> Set obj = new AVIMAKER.AviMaker
ДК> Call obj.AboutBox
ДК>
ДК> — работает.
Потому что используется раннее связывание и обьект создаётся не по ProgID а по CLSID.
PS: Вообще то басик работает в STA аппартаменте, так что для чистоты эксперимента вызывай CoInitialize(0) (для каждого потока ессно в котором будешь работать с COM-ом.)
PPS: Для твоего случая нет необзходимости использовать CoCreateInstanceEx. Обычно эта функция используется для создания "удалённых" обьектов DCOM.
PPPS: Насколько я вижу твой обьект выставляет дисп интерфейс. Возможно в этом и проблемма. Попробуй вызвать свой AboutBox через IDispatch->Invoke
Д_К>Есть ocx, я его импортирую таким образом:
Д_К>...
Д_К>hr в результате вызова AboutBox содержит E_UNEXPECTED.
Д_К>С чем это может быть связано?
Вполне может быть с тем, что это OCX, который отличается от обычного СОМ объекта тем, что может и не работать без установки контейнера. У меня мало опыта именно с ОСХ, но опыт Скриптов об этом говорит — без установки ***Site Скрипт просто не работает. И именно E_UNEXPECTED возвращает из всех методов.
Здравствуйте, Vi2, Вы писали:
Vi2>Вполне может быть с тем, что это OCX, который отличается от обычного СОМ объекта тем, что может и не работать без установки контейнера. У меня мало опыта именно с ОСХ, но опыт Скриптов об этом говорит — без установки ***Site Скрипт просто не работает. И именно E_UNEXPECTED возвращает из всех методов.
Похоже, дело действительно в этом. А можно ли как-то это обойти? Я хочу использовать этот OCX в виндовом сервисе.