Winapi:プラグインでのcreateWindow

私はプラグイン(他のアプリケーションによって読み込まれているDLL)を開発しています。アプリケーションがダイアログを表示できるように HWND を返す特別な関数があります。問題は、どこの hInstance (関数にパラメータとして渡されない)を取得できるかわからないことです。

私は何かを理解していないように見える、私はこのすべてのものに新しいので、質問が愚かであれば許してください。

UPD: tried to get hInstance with getModuleHandle:

void* createLoginDialog() {
    HINSTANCE hIns = (HINSTANCE) GetModuleHandle(L"comapping");
    HWND hWnd = CreateWindow(L"Popup",
                        L"Enter login",
                        WS_POPUP,
                        20,
                        20,
                        20,
                        20,
                        NULL,
                        NULL,
                        hIns,
                        NULL);
    return hWnd;
}

私はまだアクセス違反を取得しています。

1

2 答え

<コード> CreateWindow の場合、 hInstance 引数はオプションです。これは、ここで NULL を渡すことが有効であることを意味します。しかし、Simon Richterがこの答えに対するコメントで指摘しているように、引数はグローバルに登録されているのは NULL のみです。

DLLを作成する場合は、 DllMain エントリーポイントはあなた自身で機能します。この関数はWindowsによって呼び出され、関数のハンドルを最初の引数として渡します。ウィンドウを作成するときに、このハンドルをどこかに記憶して再利用することができます。

3
追加された
@Frerich、 NULL を渡すとメモリ違反が発生する
追加された 著者 Eugeny89,
@ SimonRichter、「DLLのインスタンスを使用する」とはどういう意味ですか?
追加された 著者 Eugeny89,
@SimonRichter:ああ、興味深い - 私はこれを知らなかった。私は決して NULL を自分で渡したことはないので、この要件に気付かなかった。これを指摘してくれてありがとう。私はこの要求に言及するために私の答えを増やすでしょう。
追加された 著者 Frerich Raabe,
@ SimonRichter:そうだ。したがって、カスタムクラスやカスタムウィンドウプロシージャを使用しないと仮定すると、使用されるウィンドウクラスの HINSTANCE ハンドルを取得するには、 GetClassInfo そのハンドルを CreateWindow に渡しますか?
追加された 著者 Frerich Raabe,
クラスがグローバルに登録されている場合はオプションです。これは悪いスタイルです。 DLLのインスタンスを使用することは正しいアプローチです。これは、このウィンドウが正しく動作するためにDLLが必要であることをシステムに通知するためです。
追加された 著者 Simon Richter,
ウィンドウクラスを登録するときは、ウィンドウプロシージャを含むモジュールのインスタンスハンドルを使用する必要があります。これがDLLの場合は、 DllMain で指定されたハンドルを使用します。同じハンドルを CreateWindow に渡す必要があります。
追加された 著者 Simon Richter,

それを得るためのいくつかの方法:

  • HINSTANCEにキャストしたDllMain()エントリポイントに渡された最初の引数
  • DLL名を使用してHINSTANCEにキャストしたGetModuleHandle()
  • VirtualQuery()。関数のアドレスを渡します。返されたMEMORY_BASIC_INFORMATION.BaseAddressをHINSTANCEにキャストします。 Windowsの32ビット版と64ビット版の両方で動作します。
3
追加された
ありがとうございました!私は GetModuleHandle を使用しようとしましたが、依然としてアクセス違反が発生しています。私は質問を更新しました
追加された 著者 Eugeny89,