- ベストアンサー
DLL内に定義されている関数名の取得方法
GetProcAddressにて関数の有無を取得することはできますが、DLL内に定義されている関数名すべてを取得することは可能でしょうか?可能であれば、その方法をお教えください。よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Debug Help (dbghelp)はVS6の頃にはまだ存在せず、VS.NETになって新たに登場したものですので、VS6ですと見つかりません。 Debug HelpはImage Help (imagehlp)の後継で、例示プログラム中で使用している定義の範囲ですとImage Helpのヘッダファイル(imagehlp.h)でも同様に使用できますので、dbghelp.hのかわりにimagehlp.hを参照してください。
その他の回答 (4)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
調べたところ、dbghelp.dllを使用すると「めちゃめちゃ面倒」は「少々面倒」くらいで済むようです。 エラーチェックは適当ですが、ひとまず動作するCのプログラムを下記するので、適当にVBコードに変更してください。(すみません最初からVBのコードでなくて。) #include <windows.h> #include <winnt.h> #include <dbghelp.h> #include <stdio.h> #include <string.h> int main(int argc, char** argv) { char* pszImageName = argv[argc - 1]; HANDLE hProcess = GetCurrentProcess(); SymInitialize(hProcess, "", FALSE); DWORD dwBase = SymLoadModule(hProcess, NULL, pszImageName, NULL, 0, 0); if (dwBase == 0) { printf("SymLoadModule failed\n"); return 1; } DWORD dwSize; PVOID pv = ImageDirectoryEntryToData((PVOID)(DWORD_PTR)dwBase, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &dwSize); if (pv == NULL) { printf("ImageDirectoryEntryToData failed\n"); return 2; } PIMAGE_EXPORT_DIRECTORY pImageExportDirectory = (PIMAGE_EXPORT_DIRECTORY)pv; char** ppFunctionName = (char**)(DWORD_PTR)(pImageExportDirectory->AddressOfNames + dwBase); DWORD dw; for (dw = 0; dw < pImageExportDirectory->NumberOfNames; ++dw) { printf("%3u: %s\n", dw, *ppFunctionName + dwBase); ++ppFunctionName; } SymUnloadModule(hProcess, dwBase); return 0; }
お礼
どうもありがとうございます。このコードから拝見するに、指定されたファイル中のエクスポートされている関数をpImageExportDirectory変数から取り出してリストアップしているような感じですよね。そうすると命令群を取り出すのにはImageDirectoryEntryToData命令を使用する必要があるといった感じでしょうか?各命令の意味を調べてみます。
補足
こんにちは。VCで試してみたのですが、dbghelp.hが見つからないようです。こちらではVS6で試したのですが、Program Files\VC98以下のフォルダにはないようです。Googleで検索すると、http://dotnet.di.unipi.it/Content/sscli/docs/doxygen/tools/sos/dbghelp_8h-source.html が引っかかったので、これをdbghelp.hファイルとして行番号を抜いてみて使用してみたのですが、うまくコンパイルできませんでした。dbghelp.hはどこかから入手することができるのでしょうか?手数をかけてすみません。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#2>プログラムコードから調べる方法を探しています 最悪、プログラムからツールを実行し、ツールの出力をプログラムから取り込む(バカげてる?)こともできるかと思いますが。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
borlandのツールIMPDEFで関数名が取り出せますが、 そういうことでなかったらごめんなさい
補足
お返事ありがとうございます。プログラムコードから調べる方法を探しています。こういったツールはどうやって命令を調べているのでしょうね。気になるところです。
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
何か手軽なライブラリがあるといいんですけどね・・・ 私は 「An In-Depth Look into the Win32 Portable Executable File Format」 http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx の記述に沿って、DLLファイルの中身をバイナリデータとしていちいち調べて使っていますが、めちゃめちゃ面倒です。
お礼
ありがとうございます。うーむ。英語ドキュメントですね。でも少し目を通して見る必要がありそうな感じですね。Dependency Walker等はこのような方法で情報を取得しているのかも知れませんね。
お礼
ありがとうございました。試してみてもまだうまく動作さられていない状態ですが、おおきなヒントになりました。もう少し調べてみます。