VCL コンポーネントを含む DLL の作成(C++)

提供: RAD Studio
移動先: 案内検索

パッケージと DLL の作成 への移動


DLL の利点の 1 つは、ある開発ツールで作成した DLL を、別の開発ツールで書いたアプリケーションで使用できることです。DLL が、呼び出し元のアプリケーションが利用する VCL コンポーネント(フォームなど)を含む場合には、C++ の命名規則に違反しない、呼び出し元アプリケーションが VCL ライブラリの動作をサポートするように要求しない、さらに標準の呼び出し規則を使用するエクスポート インターフェイス ルーチンを準備する必要があります。エクスポート可能な VCL コンポーネントを作成するには、実行時パッケージを使用します。詳細は、「パッケージとコンポーネントの操作 - 概要」を参照してください。

たとえば、次のような簡単なダイアログ ボックスを表示する DLL を作成する場合

CB6 DevelopersGuide EN img 4.png

ダイアログ ボックス DLL のコードは次のようになります。

// DLLMAIN.H
// ---------------------------------------------------------------------
#ifndef dllMainH
#define dllMainH
// ---------------------------------------------------------------------
#include <Classes.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Forms.hpp>

// ---------------------------------------------------------------------
class TYesNoDialog : public TForm {
__published: // IDE-managed Components

	TLabel *LabelText;
	TButton *YesButton;
	TButton *NoButton;

	void __fastcall YesButtonClick(TObject *Sender);
	void __fastcall NoButtonClick(TObject *Sender);

private: // User declarations

	bool returnValue;

public: // User declarations

	virtual __fastcall TYesNoDialog(TComponent *Owner);
	bool __fastcall GetReturnValue();
};

// exported interface function
extern "C" __declspec(dllexport) bool InvokeYesNoDialog();
// ---------------------------------------------------------------------
extern TYesNoDialog *YesNoDialog;
// ---------------------------------------------------------------------
#endif
// DLLMAIN.CPP
// ---------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "dllMain.h"
// ---------------------------------------------------------------------
#pragma resource "*.dfm"
TYesNoDialog *YesNoDialog;

// ---------------------------------------------------------------------
__fastcall TYesNoDialog::TYesNoDialog(TComponent *Owner) : TForm(Owner) {
	returnValue = false;
}

// ---------------------------------------------------------------------
void __fastcall TYesNoDialog::YesButtonClick(TObject *Sender) {
	returnValue = true;
	Close();
}

// ---------------------------------------------------------------------
void __fastcall TYesNoDialog::NoButtonClick(TObject *Sender) {
	returnValue = false;
	Close();
}

// ---------------------------------------------------------------------
bool __fastcall TYesNoDialog::GetReturnValue() {
	return returnValue;
}

// ---------------------------------------------------------------------
// exported standard C++ interface function that calls into VCL
bool InvokeYesNoDialog() {
	bool returnValue;
	TYesNoDialog *YesNoDialog = new TYesNoDialog(NULL);
	YesNoDialog->ShowModal();
	returnValue = YesNoDialog->GetReturnValue();
	delete YesNoDialog;
	return returnValue;
}

この例にあるコードは、ダイアログを表示し、[はい]ボタンがクリックされると private データ メンバ returnValue に値 true を格納します。他のボタンが選択されると returnValue は false になります。public の GetReturnValue() 関数が、returnValue の現在値を取り出します。

ダイアログを呼び出し、どのボタンが押されたか調べるときは、呼び出し元のアプリケーションがエクスポート関数 InvokeYesNoDialog() を呼び出します。この関数は、C++ の命名規則を守るための C リンクと、標準的な C の呼び出し規約を使用するエクスポート関数として DLLMAIN.H で宣言されます。この関数は DLLMAIN.CPP で定義されます。

C の標準関数を DLL とのインターフェイスとして使用すると、C++Builder で作成されたかどうかに関係なく、どの呼び出し元のアプリケーションでも DLL を使用できます。ダイアログを作成するのに必要な VCL の機能は、DLL 自体にリンクされますが、呼び出し元のアプリケーションは、VCL の機能を認識する必要はありません。

VCL を使用する DLL を作成すると、必要な VCL コンポーネントが DLL にリンクされ、ある程度のオーバーヘッドが生じることに注意してください。このオーバーヘッドがアプリケーションの全体のサイズに与える影響を最小限に抑えるには、数個のコンポーネントを 1 つの DLL に組み込みます。これにより、DLL が使用する VCL サポート コンポーネントのコピーは 1 つだけになります。

関連項目