解决此问题的标准方法是在.def
文件中定义导出的未修饰名称- 这是您应该使用的方法。
但是,如果出于某种原因您不想使用.def
文件,则可以编写如下代码:
__declspec(dllexport) int __stdcall TestFunktion(void)
{
#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
...
}
__FUNCDNAME__
将评估为您的装饰函数名称,而__FUNCTION__
将评估为您未装饰的函数名称 - 这实际上是对.def
文件中等效行的替换。
至于你的另一个问题:
If I have a DLL file...how can I see functions are built as __stdcall or __cdecl?
这在 DLL 中是不可能的,如果您故意省略导出表中的提示(即您可能能够看到修饰的导出符号并推断它是__stdcall
,但您选择将它们导出为未修饰的符号),则更不可能- 也许如果您对函数的反汇编执行某种分析并尝试了解其调用约定,但这是非密封且非常hacky的。
这就是有据可查的调用约定和有据可查的 API 签名很重要的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句