首页 文章

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

提问于
浏览
1

我曾经使用以下函数在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 回答

  • 5

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

    你有选择:

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

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

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

相关问题