2017-11-09 27 views
0

VB6 DLLをコンパイルすると、コンパイラはエクスポートされたDllRegisterServer()関数をDLLに追加します。VB6コンパイラによって生成されるDllRegisterServerは何をしますか?

この機能は正確には何ですか?私は、その目的は、すべてのCOMの魔法が機能するよう、レジストリにエントリを追加することであると考えられることを理解しない

...

Instructs an in-process server to create its registry entries for all classes supported in this server module.

しかし、私にそれを呼び出しますそれが何のための特定の、詳細な仕様に興味を持っています。私はこれに関するMSDNのドキュメントを発見していない。それのようなものが存在しますか?誰かがそのコードを分解し、その結果を文書化したか?


編集:私はこのことに興味が一つの理由は、私はそれが完全に/正常に動作しない(します。regsvr32が成功を報告しても)、私はこれらの潜在的な障害を理解したい場合があると思いますということですモードが良い。

+1

これは具体的には記載されていませんが、非常に標準的なCOMです。VBでサポートされているスレッドモデルを使用してInprocServer32(https://msdn.microsoft.com/en-us/library/windows/desktop/ms682390.aspx) TLBを登録してください。重要なのは、(ファイルを削除する前に)変更をロールバックするためにDllUnregisterサーバーを実行する必要があることです。実際に詳細が必要な場合は、https://www.nirsoft.net/utils/registry_changes_view.htmlなどのレジストリ差分ツールを使用できます。 –

+0

WiX Toolset(wixtoolset.org)をダウンロードし、DLLを「Heat」 ( "レジストリ変更を収穫する")ツール。これは、DLLに対応するすべてのレジストリ変更を含むXMLファイルを生成します。 '-svb6'フラグを渡すと、DLLに特有のものではなく、特に興味深いVBランタイムの一般的なキーが抑制されます(インストーラには含めないでください)。インストーラを作成するためにWiXを使用しない場合でも、「ヒート」は非常に有益で、バージョン間の変更を追跡するのに役立ちます。 –

+0

この機能について特別なことは何もなく、レジストリエントリを書き込むだけです。何かがあなたのために働かないなら、あなたはそれが何であるか教えてください。最も頻繁に起こるのは、いくつかのサードパーティのocx(コントロール)が欠けているケースです。 – Nikolay

答えて

0

この関数は、DLLをWindowsレジストリに登録するために使用されます。たとえば、DLL名でregsvr32.exeを呼び出すと、DLLがロードされ、regsvr32.exeユーティリティがDllRegisterServer()関数を呼び出します。関数がCOMの観点から行うべきことは、COMクライアントがCoCreateInstance()を通じてCOMオブジェクトを作成して使用できるように、WindowsレジストリにPROGID、CLSID、およびTypeLibエントリを作成することです。

関連する問題