1

次の関数を使用して、32 ビットの COM/DLL コンポーネントを Window XP や Windows 7 などの 32 ビット Windows プラットフォームに登録したことがあります。正常に動作します。ただし、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

32 ビットの COM/DLL コンポーネントをさまざまなターゲット プラットフォーム (X86 や X64 など) でプログラムによってスマートに登録する方法は?

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 に「regsvr32 the-DLL /s」と実行させるだけで、CreateProcess登録を行うか、独自の別の子を起動して異なるビット数を登録します。

  3. (些細なこと)インストーラーに登録をしてもらい、それらはビットネスの扱い方をすでに知っています。

于 2012-10-05T14:16:15.983 に答える