• ベストアンサー

DLL内に定義されている関数名の取得方法

GetProcAddressにて関数の有無を取得することはできますが、DLL内に定義されている関数名すべてを取得することは可能でしょうか?可能であれば、その方法をお教えください。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.5

Debug Help (dbghelp)はVS6の頃にはまだ存在せず、VS.NETになって新たに登場したものですので、VS6ですと見つかりません。 Debug HelpはImage Help (imagehlp)の後継で、例示プログラム中で使用している定義の範囲ですとImage Helpのヘッダファイル(imagehlp.h)でも同様に使用できますので、dbghelp.hのかわりにimagehlp.hを参照してください。

shouichi5928
質問者

お礼

ありがとうございました。試してみてもまだうまく動作さられていない状態ですが、おおきなヒントになりました。もう少し調べてみます。

その他の回答 (4)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.4

調べたところ、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; }

shouichi5928
質問者

お礼

どうもありがとうございます。このコードから拝見するに、指定されたファイル中のエクスポートされている関数をpImageExportDirectory変数から取り出してリストアップしているような感じですよね。そうすると命令群を取り出すのにはImageDirectoryEntryToData命令を使用する必要があるといった感じでしょうか?各命令の意味を調べてみます。

shouichi5928
質問者

補足

こんにちは。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)
回答No.3

#2>プログラムコードから調べる方法を探しています 最悪、プログラムからツールを実行し、ツールの出力をプログラムから取り込む(バカげてる?)こともできるかと思いますが。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

borlandのツールIMPDEFで関数名が取り出せますが、 そういうことでなかったらごめんなさい

shouichi5928
質問者

補足

お返事ありがとうございます。プログラムコードから調べる方法を探しています。こういったツールはどうやって命令を調べているのでしょうね。気になるところです。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

何か手軽なライブラリがあるといいんですけどね・・・ 私は 「An In-Depth Look into the Win32 Portable Executable File Format」 http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx の記述に沿って、DLLファイルの中身をバイナリデータとしていちいち調べて使っていますが、めちゃめちゃ面倒です。

shouichi5928
質問者

お礼

ありがとうございます。うーむ。英語ドキュメントですね。でも少し目を通して見る必要がありそうな感じですね。Dependency Walker等はこのような方法で情報を取得しているのかも知れませんね。