2012-05-02 21 views
3

は、私たちはまったく同じ状況がある。このスレッド登録32ビットおよび64ビットの両方のDLL

How do I install both 32-bit and 64-bit versions of a COM DLL and "auto-select"?

に参照のうえです。名前空間拡張Dll 32bitと64bitで、同じプロジェクトのCLSID App IDが同じです。これらの2つのDLLを登録すると、完璧に動作します。登録を解除すると、いくつかのエラーが発生します。最初の登録簿は機能しますが、2番目の登録簿は失敗します。私はWindows(?)がDllがすでに登録抹消されていると思うので...

2つのDLLは異なるCLSIDおよび/またはApp IDを必要としますか?

敬具、 マイケル

EDIT:

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; 
} 
+0

「いくつかのエラー」は、何がうまくいかないかのアイデアを与えるはずです。 – sharptooth

+0

これは私にエラーコード0x8002801c –

答えて

1

Windowsが気にしない - それは、登録を行うregsvr32です: ここDllUnregisterServerのが何をするかです。 32ビットDLLの場合はregsvr32の32ビットバージョンを使用し、64ビットDLLの場合は64ビットバージョンを使用します。

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

これらの機能の1つが問題です。これをデバッグする必要があります。まず、プロセスモニタユーティリティを使用して、実行されるレジストリアクセスと期待どおりのものかを確認します。

+0

を与えてくれました。アプリケーションのメインフレームは自分でコード化されていませんでした。おそらく上記のコードで何かを見ることができます。 –

+0

@Jesse James:推測するのは不可能です。プロセスモニタを使用して少なくともアクセスを検証するのが良いスタートです。 – sharptooth

+0

OK、私は試してみましたが、regsvr32は約100.000のエントリを持っています。私はこれを解決するために何を見なければならないのか分かりません... –

0

answer from sharptoothに詳細を追加すると、regsvr32をexcecutingしてプログラムでDLLを登録解除すると、誤ったregsvr32ファイルが呼び出されている可能性があります。 64ビットdllの登録を解除するにはregsvr32をSystem32に、32ビット版を登録解除するにはSysWow64からregsvr32を呼び出してください。 SysWow64フォルダの場所を取得するために、関数GetSystemWow64Directoryを呼び出して呼び出すことができます。

+0

Windows 7ではこれを試していますが、32ビットと64ビットの両方を処理できますが、SysWow64 regsvr32.exeも呼び出そうとしました。 –

+0

この場合、sharptoothが示唆しているように、あなたのDllUnregisterServer関数に何か問題があるはずです。 – yms

+0

デバッグは難しいですが、hRes2の内容を見ることができません。常にそのシンボルを見つけることができません。しかしそれは_AtlModule.UnregisterServer(TRUE)です。それは正しく動作していません... –

関連する問題