C++で作られたDLLを、外部で呼び出す必要があったのでメモ。
とりあえず サンプルとして こんなC++のコードを書き、DLLを作った
// example.cpp #include <stdio.h> #include <windows.h> BOOL WINAPI DLLMain(HINSTANCE htinst,DWORD fdwReason,LPVOID *rsvd) { switch(fdwReason){ case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } __declspec(dllexport) int __stdcall sum(int a,int b){ return a+b; }
これをビルドすると、example.dll example.lib が出力される。
実装されている関数は int sum(int a, int b) のみである。
では、関数の一覧を見てみよう
手順
・VisualStudio コマンドプロンプト を使う
Visual Studio 2010
[Windowsボタン] か [スタート] を押し [すべてのプログラム]->[Microsoft VisualStudio] -> [VisualStudio Tools] -> [VisualStudio コマンドプロンプト] を開く
Visual Studio 2015
[Windowsボタン] か [スタート] を押し 検索欄に「コマンド」と入れる -> [検索]->[開発者コマンド プロンプト for VS2015] を開く
dllの置いてあるディレクトリに移動する
そこで dumpbin /exports DLL名 を入力すると出力される。
例: さっきのexample.dll
dumpbin /exports example.dll ~省略~ ordinal hint RVA name 1 0 00001000 ?sum@@YGHHH@Z = ?sum@@YGHHH@Z (int __stdcall sum(int,int))
こんな感じだ。シンボル名については詳しくないので、別のサイトで調べてください。
これで実装されている関数がわかった。あとは、DLLImportなりを使い、
?sum@@YGHHH@Z を定義すれば使える。
(しかし、引数や返り値の値はわからないことが多い しかし大抵はAPIのリファレンスが公開されているのでそちらを参照しましょう)
いずれ各言語での DLLImport の記事を書きます
では