実現したいこと
プログラムソースにおいて使用頻度の少ないモジュールを、C++Builder のVCLと親和性が高いBPLとして切り出し、ダイナミックリンクによる運用を検討中です。そこでBPLを使用しない通常の実験用サンプルを作成し、それをどのようにBPL化すれば良いか確認したいと考えていますが、解決に至っていませんので是非ご教授ください。
発生している問題・分からないこと
【ソース(1)】が元のサンプルソースで正しく動作しています。メニューからジャンプするForm2モジュールをBPLとして切り出したいと考えています。
現在模索中のソースが【ソース(2)】で、ビルド後に実行すると、
ShowMessage(L"Failed to find ShowForm2 function in the BPL.");
が実行されるので、MyBPL.bplが読み込まれてイルと考えられますが、
TShowForm2 ShowForm2 = (TShowForm2)GetProcAddress(hLib, "ShowForm2");
がうまく動作してないようです。どのようにしたら良いかご教授ください。
分割した【ソース(2)】において、MyBPL.bpl や Sampleのビルドでは特にエラーは発生していません。
該当のソースコード
C++Builder (VCL)
1//【ソース(1)】(元のソース)2//■メインソース(SampleU.cpp)3省略 4void __fastcall TForm1::N2Click(TObject *Sender)5{6 Form2->ShowModal();7}8//---------------------------------------------------------------------------9 10//■Form2モジュール11//---------------------------------------------------------------------------12#include <vcl.h>13#pragma hdrstop14#include "Unit2.h"15//---------------------------------------------------------------------------16#pragma package(smart_init)17#pragma resource "*.dfm"18TForm2 *Form2;19 20namespace MyBPL 21{22 void __fastcall ShowForm2()23 {24 Form2->ShowModal();25 }26}27//---------------------------------------------------------------------------28void __fastcall TForm2::Button1Click(TObject *Sender)29{30 Edit3->Text = IntToStr(StrToInt(Edit1->Text) + StrToInt(Edit2->Text));31}32//---------------------------------------------------------------------------
試したこと・調べたこと
上記の詳細・結果
//【ファイル(2)】(検討中) // TShowForm2関数ポインタ型の宣言 typedef void (*TShowForm2)(); //--------------------------------------------------------------------------- void __fastcall TForm1::N2Click(TObject *Sender) { // Form2->ShowModal(); //BPLをロードする HINSTANCE hLib = LoadLibraryA("MyBPL.bpl"); if (hLib) { TShowForm2 ShowForm2 = (TShowForm2)GetProcAddress(hLib, "ShowForm2"); if (ShowForm2) { // BPL内のForm2を表示する関数を呼び出す ShowForm2(); } else { ShowMessage(L"Failed to find ShowForm2 function in the BPL."); } FreeLibrary(hLib); } else { ShowMessage(L"Failed to load the BPL."); } } //--------------------------------------------------------------------------- //■MyBPL.bpl (Unit2.cpp) namespace MyBPL { void __fastcall ShowForm2() { Form2->ShowModal(); } } //--------------------------------------------------------------------------- void __fastcall TForm2::Button1Click(TObject *Sender) { Edit3->Text = IntToStr(StrToInt(Edit1->Text) + StrToInt(Edit2->Text)); } //--------------------------------------------------------------------------- //■MyBPL.cpp //--------------------------------------------------------------------------- #include <System.hpp> #pragma hdrstop USEFORM("Unit2.cpp", Form2); //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- // パッケージ ソース(MyBPL.cpp) //--------------------------------------------------------------------------- #pragma argsused extern "C" int _libmain(unsigned long reason) { return 1; } //---------------------------------------------------------------------------
補足
■使用ツール環境
・Windows10 Professional
・C++Builder 11 Update3 (VCL)
■補足
上記のソース(MyBPL.cpp)は自動的に作成されるファイルですが、USE*ステートメントが
USEFORM("Unit2.cpp", Form2);
1行のみで、このあたりが根本問題なのかなとも感じていますが、対処しかねています。
なお、本件をChatGPTやCopilotでも確認しましたが、解決に至っていません。
0 コメント