フォームを利用するDLLの作成方法と使用方法です。
新規ダイナミックライブラリの画面が表示されるので、次のように選択します。
ソースの種類「C++」
CVLを使う「チェックする」
VC++スタイルのDLL「チェックしない」
「OK」ボタンを押します。
以上で、プロジェクトが作成されます。
フォームを使用する関数を作成します。
次のようになります。
#include "Unit1.h"
#include <memory>
extern "C" int WINAPI __declspec(dllexport) ShowForm(wchar_t* Message)
{
std::unique_ptr<TForm1> form(new TForm1(Application));
form->Label1->Caption = Message;
return form->ShowModal();
}
DLLプロジェクトのソースコードはこのようになります。
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "Unit1.h"
#include <memory>
#pragma argsused
extern "C" int WINAPI __declspec(dllexport) ShowForm(wchar_t* Message)
{
std::unique_ptr<TForm1> form(new TForm1(Application));
form->Label1->Caption = Message;
return form->ShowModal();
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
DLLを読み込みます。
HMODULE dll = LoadLibrary("Project1.dll");
if (dll == NULL)
{
std::puts("DLLの読み込みに失敗しました。");
return 0;
}
DLLの関数のアドレスを取得します。
FARPROC proc = GetProcAddress(dll, "ShowForm");
if (proc == NULL)
{
std::puts("関数のアドレスの取得に失敗しました。");
return 0;
}
DLLの関数を使用します。
typedef int WINAPI (*TShowFormProc)(wchar_t*);
TShowFormProc func = reinterpret_cast<TShowFormProc>(proc);
std::cout << func(L"テスト") << std::endl;
FreeLibrary(dll);
ソースコード全体は次のようになります
#pragma hdrstop
#include <tchar.h>
#include <windows.h>
#include <iostream>
typedef int WINAPI (*TShowFormProc)(wchar_t*);
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE dll = LoadLibrary("Project1.dll");
if (dll == NULL)
{
std::puts("DLLの読み込みに失敗しました。");
return 0;
}
FARPROC proc = GetProcAddress(dll, "ShowForm");
if (proc == NULL)
{
std::puts("関数のアドレスの取得に失敗しました。");
return 0;
}
TShowFormProc func = reinterpret_cast<TShowFormProc>(proc);
std::cout << func(L"テスト") << std::endl;
FreeLibrary(dll);
return 0;
}
Borland C++Builder 6実用プログラミング―オブジェクトとその再利用の方法
C++BuilderによるDLL、VCLパッケージ、COM/ActiveXの利用方法が解説されています。
DLLの利用方法についても、Variant配列やSafeArrayを受け渡しする方法やBDEデータベースハンドルを共有する方法など、非常に専門的な内容を取り扱っています。