![]() |
1
11
函数重载是C++的一个特性,它依赖于名称篡改(链接器错误消息中的神秘函数名)。 通过将损坏的名称写入def文件,我可以链接并运行我的测试项目:
似乎为
因此,从错误消息中复制C++函数名,并将其写入def文件。然而,真正的问题是:为什么你想使用def文件而不使用__declspec(dllexport)? 损坏的名称是不可移植的,我用VC++2008进行了测试。 |
![]() |
2
10
在代码本身中,使用__declspec(dllexport)标记要导出的函数。例如:
如果这样做,则不需要在.def文件中列出函数。 或者,您也可以使用默认参数值,例如:
这假设b存在一个值,您可以使用它来表示它未被使用。如果-1是b的合法值,或者没有或不应该是默认值,这将不起作用。 编辑(Adam Haile):更正为使用__declspec,因为__dllspec不正确,所以我可以将其标记为官方答案。…它已经足够接近了。 编辑(格雷姆):哎呀,谢谢你纠正我的拼写错误! |
![]() |
3
8
我也遇到了类似的问题,所以我也想在这篇文章上发帖。
A.如何导出未加筛选的名称。在.def文件中添加
这将尝试为内部函数Foo找到一个“最佳匹配”并导出它。在上述情况下,只有 一个foo将创建映射 Foo=_Foo@4 从垃圾箱/出口处可以看到 如果你重载了一个函数名,那么你可能需要明确地说出你想要在.def文件中使用哪个函数 通过使用entryname[=internalname]语法指定一个损坏的名称。例如
B..def文件的另一种选择是,您可以使用#pragma“就地”导出名称。
C.第三种选择是只将Foo的一个版本声明为extern“C”,以不带网格的方式导出。看见 here 了解详情。 |
![]() |
4
3
没有官方的方法可以做你想做的事情,因为dll接口是一个C api。 编译器本身使用损坏的名称作为解决方法,因此当您不想在代码中更改太多时,应该使用名称损坏。 |
![]() |
5
2
出口系统税的定义是:
入口名称 是要导出的函数或变量名。这是必需的。如果导出的名称与DLL中的名称不同,请在DLL中使用internalname指定导出的名称。 例如,如果您的DLL导出了一个函数func1(),并且您希望将其用作func2(),则可以指定:
只需查看损坏的名称(使用Dependency walker)并指定您自己的函数名称。 来源: http://msdn.microsoft.com/en-us/library/hyx1zcd3(v=vs.71).aspx 编辑:这适用于动态Dll,在动态Dll中,我们需要使用GetProcAddress()显式获取Dll中的函数。 |
![]() |
6
2
导出重载函数没有语言或版本无关的方法,因为每次编译器发布时,修改约定都会发生变化。 这就是为什么大多数WinXX函数都有像*Ex或*2这样有趣的名字的原因之一。 |
|
Guilherme Albertini · DLL中的类 7 年前 |
![]() |
Naomi · C#dll资源文件更改语言 7 年前 |
![]() |
AidanH · C#DLL语言翻译实现[关闭] 7 年前 |
![]() |
subham · DLL函数调用不工作 7 年前 |
![]() |
PixelThis · 为什么我的DLL要求我的程序有一个特定的名称? 7 年前 |
![]() |
nemo · DLL的“好”调用约定是什么? 7 年前 |