Сбой CoCreateInstance компонента COM + с 0x8007007e «Указанный модуль не найден»

0

У меня есть компонент COM+, работающий как сервер в процессе (приложение библиотеки) в каталоге COM+ под 64-разрядной версией Windows Server 2008 или 64-разрядной версией Windows 7. Если я установлю 32-разрядную версию компонента в C:\Windows\System32 и запустить:

HRESULT hr = CoCreateInstance(CLSID_MyClsID, NULL, CLSCTX_INPROC_SERVER, IID_MyInterface, reinterpret_cast<void**>(&_interfaceInstance));

из 32-битного приложения все работает. Аналогично, если я устанавливаю 64-разрядную версию компонента под C:\и вызываю CoCreateInstance из 64-битного приложения, он работает так, как ожидалось. Однако, если я устанавливаю 64-разрядную версию компонента под C:\Windows\System32 и пытаюсь вызвать CoCreateInstance из 64-битного приложения, возвращаемое значение равно 0x8007007e, что означает, что "указанный модуль не найден". Я особенно осторожно отношусь к незарегистрированности компонента перед его перемещением. Я также проверил, что ключи InProcServer в реестре указывают на фактический путь к DLL COM+. Я не могу понять, почему все работает, за исключением 64-разрядной установки под C:\Windows\System32??? Любые мысли или идеи чрезвычайно ценились.

Теги:
com+

1 ответ

2
Лучший ответ

Установка вашего компонента в C:\Windows\System32 кажется плохой идеей в целом: эта папка принадлежит ОС и не предназначена для установки пользовательских программ.

Тем не менее, вы, вероятно, укушены переадресацией файловой системы: когда 32-разрядная программа имеет доступ к C:\Windows\System32, она фактически перенаправляется на C:\Windows\SysWOW64. Если ваш установщик 32-разрядный, он фактически не записывает ваш 64-разрядный компонент в ожидаемую папку. Когда ваше 64-битное приложение запускается, он пытается найти компонент в "реальной" папке System32 и не сможет его найти.

Я бы рекомендовал установить две разные версии вашего компонента в подпапки x86 и x64 новой папки в %ProgramFiles%.

  • 0
    Также есть перенаправление реестра, которое вас укусит. Ответ заключается в использовании 64-разрядного установщика, если вы устанавливаете 64-разрядный компонент.
  • 0
    Привет, спасибо за ответы, высоко ценится. Мы вообще не используем установщики при тестировании разработки, и компонент, и исполняемый файл просто копируются в их соответствующие местоположения. Мы также написали логику регистрации COM. Однако я подозреваю, что вы оба на 100% на деньгах, когда говорите, что в попытках Windows найти компонент происходит какое-то перенаправление. Я думаю, что мы должны пересмотреть решение об установке на System32. Большое спасибо еще раз.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню