DLLに実装された関数の見方 (Visual Studioが入っている方向け)

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 の記事を書きます

では

Atsumi3

したいことをします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください