Visual Studioでは、関数をdllから序数でエクスポートしたいと考えています。ソースでは私がする関数を定義:.defファイルで関数をdllから序数でエクスポートするだけでは関数名は表示されません
int my_function() { return 101; } // without declspec(dllexport)
:
#pragma comment(lib, "MyDll.lib")
declspec(dllimport) int my_function();
int main(int argc, char* argv[])
{
int a = my_function();
return 0;
}
コードをコンパイルし、罰金のリンク:メインプログラムで
LIBRARY MyDll
EXPORTS
my_function @ 1 NONAME // NONAME, export directory will not contain function name
私はこのようにそれを使用します。 NONAME
属性は、序数でのみエクスポート機能に文書化されています。
MyDllのエクスポートディレクトリにはNumberOfNames
がゼロに設定されているため、dll自体には名前情報が含まれていません。 exeファイルは順序値で関数をインポートするので、exeには名前情報も含まれません。
私はさまざまな構成(デバッグ、リリース)を試みましたが、まだプログラムのリンクは正常です。たぶん、libファイルに関数名と序数の間にある種のマッピングが含まれているのでしょうか?私は、LIBファイルは関数サンクが含まれていることを読んで、私たちは、この内部のlibファイルのようなものを持つことができます。
my_function @ 1:
jmp IAT[0]
my_another_function @ 2:
jmp IAT[1]
とIn-ファイルexeファイルのインポートテーブル:
OriginalFirstThunk FirstThunk
0x80000001 (@ 1) 0x80000001 (@ 1) // ordinal 1 will go through IAT[0]
0x80000002 (@ 2) 0x80000002 (@ 2) // ordinal 2 will go through IAT[1]
そして、メモリ内のexeファイルのインポートテーブル:
OriginalFirstThunk FirstThunk
0x80000001 (@ 1) IAT[0]
0x80000002 (@ 2) IAT[1]
もしそうなら、我々は唯一のdllファイルを提供する必要があり、そしてそれは、ユーザーがLoadLibrary
でDLLをロードし、GetProcessAddress
を使用する必要がありますを意味し、関数名を隠すために?私はここで何が欠けているのですか? MSDNのExporting Functions from a DLL by Ordinal Rather Than by Nameから
コードをコンパイルしてリンクすると、正確にはあなたの質問は何ですか? – selbie
@selbie:なぜそれがうまくリンクしているのか知りたいのですが、すべきではありません。 – igntec
"libファイルには関数のサンクが含まれています。" - これは当てはまりません。 – RbMm