C++Builder小ネタ集


はじめに

C++Builder固有のよくあるHow To集です。

Windowメッセージハンドラの追加

Delphiは言語機能で持ってるけど、C++ではウインドウ(フォーム)のメッセージマップを作成する必要があります。
以下はWM_DROPFILESを処理する例です。
TWMDropFiles型がVCLで宣言されていない場合は、一般的なTMessage型で受ける必要があります。

form1.h
class TForm1 : public TForm
{
protected:
  void WMDropFiles(TWMDropFiles& mes);  //実際の処理関数

  //メッセージマップ
  BEGIN_MESSAGE_MAP
    //                  メッセージ定数  処理関数の型   処理関数名
    VCL_MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles)
  END_MESSAGE_MAP(TForm)
}

DocWiki:新しいメッセージ処理メソッドの宣言

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")