1

我曾经使用以下函数在 Window XP 和 Windows 7 等 32 位 Windows 平台上注册我的 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;
}

非常感谢!

4

1 回答 1

5

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

你有选择:

  1. 做 regsvr32 做的事情。让您的代码同时包含 32 位和 64 位二进制文​​件,一旦您检测到 DLL 的错误位数,请运行子辅助进程来处理该 DLL。

  2. 只需让 regsvr32 为您完成,CreateProcess“regsvr32 the-DLL /s”它就会进行注册,或者启动另一个自己的孩子来注册不同的位数。

  3. (琐碎)让安装程序进行注册,并且那些已经知道如何处理位数。

于 2012-10-05T14:16:15.983 回答