2017-12-17 1 views
1

/*これはhttp://www.cplusplus.com/articles/48TbqMoL/からコピーされたコードの一部です。 */GetProcAddress(HINSTANCE、LPCSTR)のsecondeパラメータが関数名を識別しないのはなぜですか?なぜ何か( "_Z6 * v")が追加されましたか?

// * .dllソースコードで宣言された関数。

DLLAPI std::unique_ptr<Base> getObj(void); 
DLLAPI std::string getName(void); 

//ロードされたライブラリ(tempという名前)から関数をインポートするためのコード。 「_Z6getObjv」の「_Z6」、「v」とは何ですか?

typedef std::unique_ptr<Base> (__cdecl *ObjProc)(void); 
typedef std::string (__cdecl *NameProc)(void); 

ObjProc objFunc = (ObjProc)GetProcAddress(temp, "_Z6getObjv"); 
NameProc nameFunc = (NameProc)GetProcAddress(temp, "_Z7getNamev"); 
+0

https://demangler.com/ –

答えて

3

エクスポートされた関数の名前付け方法は、コンパイラ固有です(詳細はname manglingを参照)。 (_Z*はおそらくGCC v3 +です)

何らかの種類のプラグインシステムを構築する場合は、固定の関数名を持つ公開ABIが必要です。 .DEF fileを使用して、エクスポートされた名前を制御することができます。マイクロソフトC/C++ツールチェーンと

また、あなたの関数が実際としてエクスポートされているものを見るためにEXTERN_C __declspec(dllexport) int __cdecl MyFunc(long parm1) { return 0; }

使用Dependency Walkerでunmangled名前をエクスポートすることができます。

関連する問題