我曾经使用以下函数在32位Windows平台(如Window XP和Windows 7)上注册我的32位COM / DLL组件 . 它工作正常 . 但是在64位Windows 7上运行时,该功能无法成功注册 . 结果如预期!
int RegisterComponent(LPCTSTR lpszDllName)
{
// Load the library
HINSTANCE hLib = LoadLibrary(lpszDllName);
if (hLib == NULL)
{
return -2;
}
typedef HRESULT (CALLBACK *HCRET)(void);
HCRET lpfnDllRegisterServer;
// Find the entry point
lpfnDllRegisterServer = (HCRET)GetProcAddress(hLib, "DllRegisterServer");
if (lpfnDllRegisterServer == NULL)
{
return -3;
}
// Call the function by function pointer..
if (FAILED((*lpfnDllRegisterServer)()))
{
//DLL Registration failed..
return -4;
}
FreeLibrary(hLib);
return 0;
}
我可以使用以下命令手动注册32位COM组件:C:\ Windows \ SysWOW64> regsvr32
如何在不同的目标平台(例如,X86和X64)上以编程方式智能地注册32位COM / DLL组件?
int RegisterComponent(LPCTSTR lpszDllName)
{
if ( IsWow64() )
{
...
}
else
{
...
}
return 0;
}
非常感谢你!
1 回答
32位DLL可以加载到32位进程中,64位DLL可以加载到64位进程中 . 您的代码(连续)可以是32位或64位 . 也就是说,如果不启动正确的位数处理,则无法注册不同位的DLL .
你有选择:
执行regsvr32的功能 . 将代码放在32位和64位二进制文件中,一旦检测到错误的DLL位,就运行子辅助进程来处理该DLL .
只需让regsvr32为你做,
CreateProcess
"regsvr32 the-DLL /s"它会进行注册,或者启动另一个自己的子节点来注册不同的位数 .9(Trivial)让安装程序做注册,那些已经知道如何处理位数 .