はじめに
C++Builder固有のよくあるHow To集です。
Windowメッセージハンドラの追加
Delphiは言語機能で持ってるけど、C++ではウインドウ(フォーム)のメッセージマップを作成する必要があります。
以下はWM_DROPFILES
を処理する例です。
TWMDropFiles
型がVCLで宣言されていない場合は、一般的なTMessage
型で受ける必要があります。
class TForm1 : public TForm
{
protected:
void WMDropFiles(TWMDropFiles& mes); //実際の処理関数
//メッセージマップ
BEGIN_MESSAGE_MAP
// メッセージ定数 処理関数の型 処理関数名
VCL_MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles)
END_MESSAGE_MAP(TForm)
}
DLLとの暗黙的リンク
暗黙的リンクとは、実行ファイルのロード時にDLLが必要なリンク方式で、LoadLibrary()
を使わない方式です。
使用するDLLが存在しない場合は、実行ファイルは起動出来ません。
DLLとリンクするためには、インポートライブラリ(.lib)が必要です。
インポートライブラリはリンカに入力ファイルとして指定します。
一般的に配布されているDLLにはVC++で生成されたインポートライブラリが添付されていますが、フォーマットが違うためC++Builderのリンカでは使用できません。
インポートライブラリは使用したいDLLから簡単に生成出来ますが、32bit/64bitで方法が異なります。
インポートライブラリの生成(32bit)
32bit版のインポートライブラリはimplib.exe
で生成します。
FTDIのD2XX-API DLLのインポートライブラリ生成の例です。
>implib ftd2xx.lib ftd2xx.dll
DocWiki:Win32 用インポート ライブラリ ツール:IMPLIB.EXE
インポートライブラリの生成(64bit)
64bit版のインポートライブラリはmkexp.exe
で生成します。
64bit版は.libではなく、.aを生成します。
>mkexp.exe ftd2xx.a ftd2xx64.dll
DocWiki:64 ビット Windows 版 C++ インポート ライブラリ ツール:MKEXP.EXE
リンク方法(プロジェクトに追加)
生成したインポートライブラリ(.lib/.a)をプロジェクトに追加すれば、リンク時に使用されます。
ただし、この方法では32bit固有のインポートライブラリを追加しているので32bit/64bitの両方に対応できません。
リンク方法(pragmaで指定)
#pragma comment (lib, "<ライブラリ名>")
をソース中で指定すれば、32bit/64bitの両方に対応できます。
32bit版リンカでは.libが、64bit版では.aが適切に読み込まれます。
インポートライブラリ(.lib/.a)はプロジェクトディレクトリに置く必要があります。
#pragma comment (lib, "ftd2xx")