我想要一个从C ++窗口DLL中导出函数的简单示例。 我希望看到标题,cpp文件和def文件(如果绝对需要的话)。 我想要导出的名称是undecorated 。 我想使用最标准的调用约定(__stdcall?)。 我想使用__declspec(dllexport) ,而不必使用DEF文件。 例如: //header extern "C" { __declspec(dllexport) int __stdcall foo(long bar); } //cpp int __stdcall foo(long bar) { return 0; } 我试图避免链接添加下划线和/或数字(字节数?)的名称。 我没有支持dllimport和dllexport使用相同的头。 我不想要任何有关导出C ++类方法的信息,只需要c样式的全局函数。 UPDATE 不包括调用约定(和使用extern“C”)给我的出口名称,我喜欢,但这是什么意思? 无论默认调用约定我得到什么pinvoke(.NET),声明(VB6)和GetProcAddress会期望? (我猜GetProcAddress将取决于调用者创build的函数指针)。 我希望这个DLL可以在没有头文件的情况下使用,所以我并不需要很多花哨的#define来使头文件可以被调用者使用。 我很好,答案是我必须使用DEF文件。
创build基本的C ++ DLL并使用模块定义文件(MyDLL.def)导出名称。 编译后,我使用dumpbin.exe检查导出的函数名称,我期望看到: SomeFunction 但我看到这个: SomeFunction = SomeFunction@@@23mangledstuff#@@@@ 为什么? 导出的函数显示为未修饰(特别是与不使用Module Def文件相比),但是其他的东西呢? 如果我使用dumpbin.exe从任何商业应用程序的DLL,你会得到干净的: SomeFunction 没有别的 我也尝试删除模块定义并使用“C”风格的导出导出名称,即: extern "C" void __declspec(dllexport) SomeFunction(); (只需使用“extern”C“不会创build导出的函数) 但是,这仍然产生相同的输出,即: SomeFunction = SomeFunction@@@23mangledstuff#@@@@ 我也尝试了#define dllexport __declspec(dllexport)选项,并创build了一个没有问题的LIB。 不过,我不想为在C#应用程序中使用DLL的人提供一个LIB文件。 这是一个普通的香草C ++ DLL(非托pipe代码),用C ++编译,只不过是一个简单的头文件和代码。 没有模块def我得到了损坏的导出函数(我可以创build一个静态库,并使用LIB没有问题,我试图避免这一点)。 如果我使用extern "C" __declspec(dllexport) 或模块定义我得到什么似乎是一个未装饰的函数名称…唯一的问题是,它后面跟着一个“=”,看起来像一个装饰版本function。 我想摆脱“=”后的东西 – 或者至less明白为什么它在那里。 现在,我敢肯定,我可以使用P / Invoke从C#调用函数…我只是想避免在“=”结尾的垃圾。 我打开如何更改项目/编译器设置的build议,但我只使用标准的Visual Studio DLL模板 – 没有什么特别的。