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

C++ 如何在不同的目标平台上以编程方式智能注册32位COM/DLL组件?,c++,windows,com,64-bit,C++,Windows,Com,64 Bit,我曾经使用以下函数在32位Windows平台(如Windows XP和Windows 7)上注册我的32位COM/DLL组件。它很好用。但在64位Windows 7上运行时,该函数无法成功注册。结果如预期 int RegisterComponent(LPCTSTR lpszDllName) { // Load the library HINSTANCE hLib = LoadLibrary(lpszDllName); if (hLib == NULL) {

我曾经使用以下函数在32位Windows平台(如Windows 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组件


多谢各位

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

您可以选择:

  • 做regsvr32做的事情。让您的代码同时使用32位和64位二进制文件,一旦检测到DLL的位错误,请运行子帮助程序处理该DLL

  • 只需让regsvr32为您执行此操作,
    CreateProcess
    “regsvr32-the-DLL/s”,它将执行注册,或者启动另一个子系统来注册不同的位

  • (琐碎的)让安装人员进行注册,这些人已经知道如何处理比特


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

    您可以选择:

  • 做regsvr32做的事情。让您的代码同时使用32位和64位二进制文件,一旦检测到DLL的位错误,请运行子帮助程序处理该DLL

  • 只需让regsvr32为您执行此操作,
    CreateProcess
    “regsvr32-the-DLL/s”,它将执行注册,或者启动另一个子系统来注册不同的位

  • (琐碎的)让安装人员进行注册,这些人已经知道如何处理比特

  • int RegisterComponent(LPCTSTR lpszDllName)
    {  
        if ( IsWow64() )
        {  
           ...
        }
        else
        {  
           ... 
        }
    
        return 0;
    }