6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DelphiAdvent Calendar 2021

Day 23

C++Builder小ネタ集

Last updated at Posted at 2021-12-22

はじめに

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)をプロジェクトに追加すれば、リンク時に使用されます。
image.png
ただし、この方法では32bit固有のインポートライブラリを追加しているので32bit/64bitの両方に対応できません。

リンク方法(pragmaで指定)

#pragma comment (lib, "<ライブラリ名>")をソース中で指定すれば、32bit/64bitの両方に対応できます。
32bit版リンカでは.libが、64bit版では.aが適切に読み込まれます。
インポートライブラリ(.lib/.a)はプロジェクトディレクトリに置く必要があります。

#pragma comment (lib, "ftd2xx")
6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?