3

このスレを参考にしています

COM DLL の 32 ビット バージョンと 64 ビット バージョンの両方をインストールし、「自動選択」するにはどうすればよいですか?

私たちはまったく同じ状況にあります。同じプロジェクトからの同じ CLSID アプリ ID を持つ名前空間拡張 Dll 32 ビットおよび 64 ビット。これらの 2 つの Dll を登録すると、問題なく動作します。登録を解除すると、いくつかのエラーが発生します。最初の登録解除は機能しますが、2 番目は失敗します。Windows(?)はDllがすでに登録解除されていると考えていると思うので...

2 つの Dll には異なる CLSID やアプリ ID が必要ですか?

敬具、マイケル

編集: DllUnregisterServer の機能は次のとおりです。

STDAPI DllUnregisterServer(void){

    _AtlModule.UpdateRegistryAppId(FALSE);
    HRESULT hRes2 = _AtlModule.UnregisterServer(TRUE);
    if (hRes2 != S_OK)
        return hRes2;
    AFX_MANAGE_STATE(_afxModuleAddrThis);

    if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
        return ResultFromScode(SELFREG_E_CLASS);

     return NOERROR;
}
4

2 に答える 2

1

Windows は気にしませんregsvr32。登録を実行するのは Windows です。32 ビット DLL には の 32ビット バージョンを使用しregsvr32、64 ビット DLL には 64 ビット バージョンを使用します。

どちらのバージョンも、DLL をロードし、DllRegisterServer()/DllUnregisterServer()エントリ ポイントを見つけ、それを呼び出して、返された値を観察するだけです。中に入るものは何でもregsvr32ビジネスではありません。

あなたの問題は、それらの機能の1つが正しく機能しないことです。これをデバッグする必要があります。まず、Process Monitor ユーティリティを使用して、どのレジストリ アクセスが実行され、それが期待どおりかどうかを観察することをお勧めします。

于 2012-05-02T14:44:37.940 に答える
0

regsvr32 を実行してプログラムで dll の登録を解除している場合は、sharptooth からの回答にさらに情報を追加すると、間違った regsvr32 ファイルを呼び出している可能性があります。System3264 ビット dll の登録を解除するには から regsvr32 を呼び出しSysWow64、32 ビット バージョンの登録を解除するにはから regsvr32 を呼び出す必要があります。関数GetSystemWow64Directoryをp/Invoke して、SysWow64 フォルダーの場所を取得できます。

于 2012-05-02T14:53:57.257 に答える