ホーム ] C++ネイティブDLL ] 試作第1号 ] 試作第2号 ]

上へ
C++ネイティブDLLの開発
VBから参照
配列の引き渡し

C++ネイティブDLL

VBから参照

最終更新日:2007/04/05  追加

●概要

 できたC++のDLLを、VBから参照でき、実行時にリンクできるようにしないといけない。

●原理

 DLL は、APIと同じ存在なので、APIの参照と同じである。つまり、Declare ステートメントで宣言する。例えば、

○C++ Exports の場合

   Declare Function XXXXX Lib "YYYYYY.dll" Alias "ZZZZZZZZ" (ByVal a As ・・・・・・・) As ・・・・

である。

  • XXXXX  は、VBで使用する関数名
  • "YYYYYY.dll"  は、C++で作成したDLL名
  • "ZZZZZZZZ" は、実際の内部にあるそれぞれの関数名

○DEFファイルの場合

 この場合は、Alias は不要で、DLL内部関数名をそのまま使用できる。

   Declare Function XXXXX Lib "YYYYYY.dll"  (ByVal a As ・・・・・・・) As ・・・・

である。

  • XXXXX  は、Exports されたDLL内部関数名(VBでの関数名にもなる)
  • "YYYYYY.dll"  は、C++で作成したDLL名

●C++ Exports の 内部関数名 "ZZZZZZZZ"

 これがくせ者で、C++でコードした関数名にはならない。既に述べたようにC++のオーバーロード対応のため、全ての内部関数名が異なるようにコンパイラが自動的に名称を付加している。またこの命名原理は不明なので、都度DLLの内部を調べる必要がある。これを調べるツールがある(dmpbin.exeがあるが、コンソールアプリなので非常に使いづらい)と聞くが、バイナリダンプすれば分かる。筆者はフリーソフトのバイナリダンプ(XDump)を使って調べた。

 上図が、既に紹介したDLLの開発の例として掲げたDLLのバイナリダンプ(末尾)である。四角で囲んだ部分が、内部名称リストで、この名称を指定しないとリンクできない。この例では、Convert関数は、

 "?Convert@ImageProcess@ImageProcessing@@SAXQADHHNN@Z"

となる。SAXQADHHNN は、関数の引数などを変更すると変化するようである。バイナリダンプでは、VBコードにコピーできないので、コンパイルすると一緒に生成されるexport ファイル(XXXXXXX.exp) を、メモ帳などで開いても良い。修飾された名称は、文字として表示されるし、コピー&ペーストできるので、こちらの方が良い。

 いずれにせよ、修飾された名称を得られれば、

Declare Function Convert Lib "ImageProcessing.dll" Alias "?Convert@ImageProcess@ImageProcessing@@SAXQADHHNN@Z" (ByRef BB As Byte, ByVal w As Integer, ByVal h As Integer, ByVal a As Double, ByVal b As Double) As Integer

などとなる。DLL仕様と内容が固まるまでは、Aliasの変動をVB側で対応すると言う面倒なこととなる。

●DEFファイルでの内部関数名

 DEFファイルによる方法でのDLLのバイナリダンプである。DEFファイルでEXPORTSした関数名がそのまま羅列されている。

 ImageProcessing.dll.Convert.HSRRGB.ImageColor.RGBHSL の文字列がそれである。

→筆者は、当初C++Exports法を採用していたが、途中で、DEFファイルに変更した。こちらがやはり簡便である。