VCLフォームを含むDLLを作る場合に必要なこと
DelphiあるいはC++ BuilderでVCLのフォームを含むDLLを作る際に必要なこととして、最初にメインフォームのハンドルを渡す必要がある。
プログラム本体側のApplicationと、DLL側のApplicationは別のインスタンスで、同期しない。
このため、DLLで何も考えず以下のコードを実行してフォームを表示すると別プロセスで表示しているように見えることになる。
// C++ Builderの場合
Form1 = new TForm1(Application->MainForm);
なので、あらかじめメインフォームのハンドルを渡す関数を作る。
アプリケーションからDLLの関数(init_dll_window_handle)を呼び出す形の例を示す。
// C++ Builderの場合 // アプリケーション側 init_dll_window_handle( Application->Handle ); // DLL側 void __fastcall init_dll_window_handle( HWND hWnd ) { Application->Handle = hWnd; }
これについてのドキュメントはTApplicationのHandleプロパティのドキュメントの下の方にちらっと載っているだけのようだ。
Application.HandleApplication->Handleと書いてあるのはタイプミスのようだ。
たまたま見つけなければ、気がつかなかった。