プロジェクトでは、.cファイルと.dllファイルを検査する必要があります。それらの情報を組み合わせて、それが何を呼び出すべきかを判断し、それを呼び出します。プログラムで呼び出し可能なdll関数を読み取る
どのDLLにどの機能があるかを調べるには、DLLを調べる必要があります。私はそれを初期化せずにdllをメモリにマップするようになっています。今私は何かにヘッダーをマップする必要があるので、私はそれに呼び出し可能な名前を持つセクションを読むことができます。
どうすればいいですか?これは、これまでのコードです:
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hReservedNull, LoadLibraryFlags dwFlags);
public static string[] GetFKTNames(string dll)
{
IntPtr lib = LoadLibraryEx(dll, IntPtr.Zero, LoadLibraryFlags.DONT_RESOLVE_DLL_REFERENCES);
//INDICATES WHAT I WANT TO DO, BUT DOES NOT WORk
//Header header = GetHeader(lib);
//Unload(lib);
//return header.Names;
}
EDIT#2:
私は進歩の少しを作ったし、今日のためにそれを辞め...ドイツでここまで来て4ない日があります...
マーシャリングが正しいかどうかは完全にはわかりません。テストする方法はありませんでした。私はその話題の本を読んでみたいと思っています。そのヘッダーがどのように機能し、どのようなヘッダーがあるのかを説明する良い本を知っていればコメントしてください。コードから
private static List<string> ListDLLFunctions(string sADllName)
{
List<string> names = new List<string>();
IntPtr LoadedImage = LoadLibraryEx(sADllName, IntPtr.Zero, LoadLibraryFlags.DONT_RESOLVE_DLL_REFERENCES);
IMAGE_NT_HEADERS header = (IMAGE_NT_HEADERS) Marshal.PtrToStructure(libPtr, typeof(IMAGE_NT_HEADERS));
// ImageExportDirectory = (_IMAGE_EXPORT_DIRECTORY*)
// ImageDirectoryEntryToData(LoadedImage.MappedAddress,
// false, IMAGE_DIRECTORY_ENTRY_EXPORT, &cDirSize);
// if (ImageExportDirectory != NULL)
// {
// dNameRVAs = (DWORD *)ImageRvaToVa(LoadedImage.FileHeader,
// LoadedImage.MappedAddress,
// ImageExportDirectory->AddressOfNames, NULL);
// for(size_t i = 0; i < ImageExportDirectory->NumberOfNames; i++)
// {
// sName = (char *)ImageRvaToVa(LoadedImage.FileHeader,
// LoadedImage.MappedAddress,
// dNameRVAs[i], NULL);
// slListOfDllFunctions.push_back(sName);
// }
// }
FreeLibrary(LoadedImage);
return names;
}
static void Main(string[] args)
{
List<string> names = ListDLLFunctions("KERNEL32.DLL");
}
小さなプロジェクトのいくつかのためにその機能を使用した後、私はすべてのDLLがそうした方法で識別できるわけではないという問題に遭遇しました。私は2つの異なるコンパイラを使用するだけで問題を抱えていました。そのためには多くの作業が必要です...しかし、私は中心的な問題への私のアプローチを変えます。 – Johannes