いろんなものはつながっている

C++で作成したDLLをEXCEL VBAからよびだせるようにする

C++用に作成したDLLをEXCELでも使いたいと思い、EXCEL VBAから呼び出せるようにしてみた。

関数の装飾名の問題呼び出し規約の問題を考慮する必要があるので、

ヘッダーファイルを

extern "C" __declspec(dllexport) bool _stdcall Sample();

とし

実装ファイルを

#include <windows.h>

extern "C" __declspec(dllexport) bool _stdcall Sample()
{
  MessageBox(NULL, TEXT("テスト"), TEXT("テスト"), MB_OK);
  
  return true;
}

として、関数名に装飾がつかないようにし、呼び出し規約もEXCEL VBAにそろえた。

しかし、EXCEL VBAで

Declare Function Sample Lib "cdll.dll" () As Boolean

Sub test()
    
  Sample
    
End Sub

として実行すると、
よびだせないとエラーになってしまう。

dumpbin /exports

でエクスポートされている関数を調べてみると関数名が装飾されてしまっている。

__stdcallあり

ここでしめされている例と比較してみると、呼び出し規約が_stdcallでないことぐらいなので、ためしに_stdcallをとってみると

__stdcallなし

関数名が装飾されていない。

defファイル

LIBRARY cdll
EXPORTS	
 Sample

をつかってエクスポートする関数を指定したところ、呼び出し規約を_stdcallとしても関数名が装飾されずにエクスポートすることができた。

ちなみにdefファイルをVisual Studioで設定するには
[リンカ]-[入力]-[モジュール定義ファイル]
にdefファイルを指定する。

msdnをみると

__stdcall 名前付け規則では、関数名の前にアンダースコア (_) を付け、関数名の最後にアット マーク (@) を付けます。

とある。

extern “C”で関数名に装飾をつけないようにするが有効なのは呼び出し規約が__cdeclのときだけみたいだ。

このあたりのはなしはここに詳しく書いてあった。

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク