Top / Programming / C++Builder / C++ BuilderでDLLの使い方 / フォームを利用するDLL

フォームを利用するDLL

フォームを利用するDLLの作成方法と使用方法です。

チュートリアル

DLLプロジェクトの作成

  1. C++Builderのメインメニューから「ファイル」-「新規作成」-「その他」を選択します。
  2. 項目カテゴリの「C++Builderプロジェクト」を選択し、「ダイナミックリンクライブラリ」を選択します。
  3. 「OK」ボタンを押します。
  4. 新規ダイナミックライブラリの画面が表示されるので、次のように選択します。

    ソースの種類「C++」
    CVLを使う「チェックする」 VC++スタイルのDLL「チェックしない」

  5. 「OK」ボタンを押します。

以上で、プロジェクトが作成されます。

フォームの作成

  1. C++Builderのメインメニューから「ファイル」-「新規作成」-「フォーム」を選択します。
  2. フォームにTLabelを1つと、TBitBtnを3つ配置します。
  3. TBitBtnのKindプロパティをそれぞれbkYes、bkNo、bkCancelにします。
  4. 保存します。

DLLの関数の作成

フォームを使用する関数を作成します。

  1. フォームのヘッダファイルをincludeします。
  2. フォームを使用するコードを書きます。

次のようになります。

#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プロジェクトのソースコード

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;
}

アプリケーションプロジェクトの作成

  1. C++Builderのメインメニューから「ファイル」-「新規作成」-「その他」を選択します。
  2. 項目カテゴリの「C++Builderプロジェクト」を選択し、「コンソールアプリケーション」を選択します。

DLLの読み込み

DLLを読み込みます。

HMODULE dll = LoadLibrary("Project1.dll");
if (dll == NULL)
{
  std::puts("DLLの読み込みに失敗しました。");
  return 0;
}

DLLの関数のアドレスの取得

DLLの関数のアドレスを取得します。

FARPROC proc = GetProcAddress(dll, "ShowForm");
if (proc == NULL)
{
  std::puts("関数のアドレスの取得に失敗しました。");
  return 0;
}

DLLの関数の使用

DLLの関数を使用します。

typedef int WINAPI (*TShowFormProc)(wchar_t*);

TShowFormProc func = reinterpret_cast<TShowFormProc>(proc);
std::cout << func(L"テスト") << std::endl;

DLLの破棄

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;
}

おすすめの書籍

更新履歴