DLL 导出 __stdcall 没有 DEF 文件和使用 VS 修饰的函数名称

阿列克谢
  1. 如果我有一个 DLL 文件...我怎么能看到函数是作为 __stdcall 或 __cdecl 构建的?
  2. 我想创建一个 DLL 以将函数导出为 __stdcall 而不使用 DEF 文件和使用 Visual Studio 装饰的函数名称,例如:
__declspec(dllexport) int __stdcall TestFunktion(void)
{
  return 0;
}

结果如下所示: 在此处输入图片说明

有没有什么简单的方法可以在 Visual Studio 中创建没有 DEF 文件的没有装饰的函数?

丹尼尔克莱因斯坦

解决此问题的标准方法是在.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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用_stdcall将更改dll中导出函数的名称

导出没有def文件的序数

DLL使用__stdcall而不进行名称修饰:为什么它甚至可以工作?

通过.def文件导出的函数使用哪种调用约定?

是否可以在__stdcall中具有导出功能,并且名称未修改?

为 Excel VBA 导出 Windows DLL 函数的正确调用约定,而没有损坏的名称

“ def”和没有“ def”之间的区别

用于对象导出和类型的def文件

DLL导出:并非我的所有函数都被导出

无法导出stdcall方法

如何自动从未修饰的stdcall DLL生成导入库?

如何使用ctypes调用带有双下划线函数名称的DLL函数?

如何使用导出函数交叉编译DLL

在dll中找不到修饰的函数名称

导出具有原始函数名称的c ++函数

lua 5.3.5 + luasocket 3.0-rc1 + luasec 0.8:具有多个luaopen_xxx_xxx导出函数名称的WIN32 DLL

有没有办法使用apply和lambda来编写函数“def”

尽管dllExport正确,但没有函数导出到DLL中-Visual Studio

使用从D导出的DLL

使用模块定义文件 (.def) 导入 DLL

C-从非托管DLL正确导入stdcall函数

如何使用 C 转储 PE 导出函数名称?

为什么未导出的函数名称仍在MinGW DLL中列出?

VS2012中的DLL构建-没有DLL文件出现

导出函数名称会在Julia中导出所有不同的函数版本吗?

如何在Visual Studio 2010中使用DEF文件从现有C ++代码生成DLL

函数已导出和导入,没有错误,但是获取“ ...并非从...导出”

带有 `Val` 和 `Def` 的高阶函数

C#导出函数dll