从Visual C++ DLL中导出未托管的类?

3
在使用Visual C++ 2008创建DLL时,有几个选择。我可以创建一个“类库”,这将创建一个使用CLI(托管)扩展的.NET库。
由于我不需要这样的库,并且我想要将静态.LIB文件链接到另一个Visual C++ Windows可执行项目中,所以我选择了“Win32项目”,并在应用程序设置面板上指定了一个C++(无MFC)DLL。
这将创建一个带有.cpp文件的项目,该文件应该是我定义“DLL应用程序的导出函数”的地方。
但这似乎也不是我想要的。基本上,我正在寻找的是本机C++等效项,在C# .NET中将是类库程序集。我想将一些类打包到DLL中,然后通过包含DLL项目头文件并链接.LIB来解决引用,让.EXE项目使用DLL的类。
通常如何做到这一点?
4个回答

4

您做得很好。要使项目中的类可从外部访问,您需要使用__declspec(dllexport)来标记这些类。构建项目时,将会生成一个 .DLL 文件和一个 .LIB 文件。


好的。在另一侧导入时采用类似的方法? - Buggieboy
看一下自动生成的代码做了什么。它实际上基于预编译器指令将dllexport/import宏化,这样消费者就不必考虑导入与导出。 - ctacke
请查看我在这里的回答,详细阐述了ctacke所说的内容(http://stackoverflow.com/questions/1179103/visual-studio-2005-linker-problem/1179118#1179118) - Nick Meyer
谢谢。这澄清了向导生成的头文件中的注释。 - Buggieboy

1
  • 创建一个新项目
  • Visual C++:Win32:Win32 项目
  • 应用程序设置中选择 DLL 并勾选“导出符号”

生成项目时,它将为您生成一个导出的类存根,通常命名为 C{MyLib}。


1

你选择创建一个C++(无MFC)的DLL是正确的。你可以创建你的类和定义的入口点将被导出到该DLL中,以供其他C++代码使用(例如,用C++编写的Win32应用程序)。

由于C++名称会自动被编译器混淆为奇怪而神奇的值,如果DLL的客户端是C程序,直接导出它们是不可行的。但如果一切都是在C++中完成,那么你应该没问题。

如果你创建了一些类,你可以选择将它们链接动态地(作为DLL),但你需要一个导入库(自动为你创建),其中包含DLL的符号定义。你也可以选择从应用程序静态地链接到你的代码 - 在这种情况下,你将得到一个静态库(也是.LIB),其中包含你的类中实际的对象代码,而不是DLL中的符号。

DLL的优点当然是,如果你编写多个使用你的库的应用程序,它们都可以共享DLL;而对于静态库,它们将各自包含你的库代码的副本。


1

我认为这篇文章描述了你想要做的事情: http://www.codeproject.com/KB/mcpp/usingcppdll.aspx

个人而言,我更喜欢导出C函数(而不是C++),在其中使this指针显式,以避免关注编译器特定的方法名称修饰和暴露编译器生成的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接