У меня есть компонент 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??? Любые мысли или идеи чрезвычайно ценились.
Установка вашего компонента в C:\Windows\System32
кажется плохой идеей в целом: эта папка принадлежит ОС и не предназначена для установки пользовательских программ.
Тем не менее, вы, вероятно, укушены переадресацией файловой системы: когда 32-разрядная программа имеет доступ к C:\Windows\System32
, она фактически перенаправляется на C:\Windows\SysWOW64
. Если ваш установщик 32-разрядный, он фактически не записывает ваш 64-разрядный компонент в ожидаемую папку. Когда ваше 64-битное приложение запускается, он пытается найти компонент в "реальной" папке System32
и не сможет его найти.
Я бы рекомендовал установить две разные версии вашего компонента в подпапки x86
и x64
новой папки в %ProgramFiles%
.