如何在不同的目标平台上以编程方式智能地注册32位COM/DLL组件?

Gol*_*Lee 1 c++ windows com 64-bit

我曾经使用以下函数在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;
}
Run Code Online (Sandbox Code Playgroud)

我可以使用以下命令手动注册32位COM组件:C:\ Windows\SysWOW64> regsvr32

如何在不同的目标平台(例如,X86和X64)上以编程方式智能地注册32位COM/DLL组件?

int RegisterComponent(LPCTSTR lpszDllName)
{  
    if ( IsWow64() )
    {  
       ...
    }
    else
    {  
       ... 
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

非常感谢你!

Rom*_* R. 5

32位DLL可以加载到32位进程中,64位DLL可以加载到64位进程中.您的代码(连续)可以是32位或64位.也就是说,如果不启动正确的位数处理,则无法注册不同位的DLL.

你有选择:

  1. 执行regsvr32的功能.将代码放在32位和64位二进制文​​件中,一旦检测到错误的DLL位,就运行子辅助进程来处理该DLL.

  2. 只需让regsvr32为你做,CreateProcess"regsvr32-DLL/s"它会进行注册,或者启动另一个自己的子进程来注册不同的位数.

  3. (Trivial)有安装程序做注册,那些已经知道如何处理位数.