質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

Q&A

1回答

126閲覧

C++Builder VCLを含むプログラムの一部をBPLで切り出す方法を知りたい

yun.nishi

総合スコア5

C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

0グッド

0クリップ

投稿2024/04/15 08:36

実現したいこと

プログラムソースにおいて使用頻度の少ないモジュールを、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 hdrstop 14#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//---------------------------------------------------------------------------

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果
//【ファイル(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でも確認しましたが、解決に至っていません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

[香車]東上☆あらし☆海美「
直接、C++Builder 開発元の

https://www.embarcadero.com/jp/
Embarcadero Cross-Platform App Development Software(ja)

で、聞いたほうがいいと思います。

投稿2024/04/16 15:10

umimi

総合スコア233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yun.nishi

2024/04/19 10:08

アドバイスありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問