
[英]Why can't I use __declspec(dllexport) to export DllGetClassObject() from a COM DLL?
[英]Why to use __declspec(dllexport)? Seems to be working without it
我用C ++编程已经有一段时间了,所以整个导出/导入的想法从我的脑海中消失了。
你能解释一下为什么要使用__declspec(dllexport)和import thingy,如果看起来我可以使用其他库中没有这些的类。
我在VC ++ 2005中创建了一个解决方案,添加了控制台应用程序项目和两个dll库项目。 然后在LibB项目中的LibA,ClassB中创建ClassA。
一旦我将ClassA.h和ClassB.h包含在我的控制台应用程序源代码中,并将其与LibA.lib和LibB.lib链接,我就能够在控制台应用程序中创建和使用ClassA和ClassB的实例。 所以基本上我能够使用类而不使用__declspec导出/导入它们。
你能解释一下 - 我在这里缺少什么。
一旦我将ClassA.h和ClassB.h包含在我的控制台应用程序源代码中,并将其与LibA.lib和LibB.lib链接,我就能够在控制台应用程序中创建和使用ClassA和ClassB的实例。
这听起来像你使用静态链接。 这与__declspec(dllexport)
的工作方式与直接链接到类的目标文件的方式相同。
如果要使用与DLL的动态(运行时)链接,则必须使用上述声明或指定导出函数的DEF文件。 DLL包含一个导出表,列出了暴露给其他可执行文件的函数。 所有其他函数仍保留在DLL内部。
也许你很困惑来自Linux世界,情况恰恰相反:默认情况下,所有符号都在外部可见。
如果你想在你的dll中提供其他dll / exes访问的符号,你可以使用__declspec(dllexport)。
如果你想访问另一个dll提供的dll / exe中的符号,你可以使用__declspec(dllimport)。
如果要链接静态.lib,则不需要。
如果您包含.h文件并链接到.lib文件,则可以删除DLL声明。 如果只需要静态链接,为什么还需要动态链接库?
导出声明将该功能标记为可用于导出。 您正在使用的声明可能是“extern”和“pascal”的宏。自从我完成此操作已经多年了但我认为DLL函数调用具有在堆栈上推送params的不同顺序,并且返回结果的分配是完成不同(pascal标志)。 extern声明可帮助链接器在链接库时使该函数可用。
您可能错过了链接DLL的步骤 - 链接器将使用classA.lib并将其转换为classA.dll(您可能需要设置setupA.def文件来定义DLL库)。 同样适用于ClassB
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.