【发布时间】:2013-03-11 15:15:25
【问题描述】:
这是我第一次处理 DLL。根据 MSDN 文档,我创建了一个头文件 fooExports.h,其中包含根据预处理器定义定义的宏:
#ifdef FOODLL_EXPORTS
#define FOO_API __declspec( dllexport )
#else
#define FOO_API __declspec( dllimport )
我的意图是在我的 DLL 实现和控制台应用程序中都使用这个头文件。到目前为止,导入和导出功能工作得很好。当我尝试导出一个已定义的结构时,问题就出现了,我需要该结构作为其中一个导出函数的参数。例如,在前面提到的头文件中我声明了FOO_API void foo( FooParams *args ),args是一个结构体,定义如下:
typedef struct FooParams
{
char *a;
char *b;
void *whatever; //some other type
} FooParams;
这个结构必须在 foo.h 而不是 fooExports.h 中定义。有没有办法导出这个结构而不把它从它的原始头文件中取出(考虑到我想把导出/导入集中在 fooExports.h 中)。 有什么更好的方法来做到这一点? DLL 都是 C 以及使用它的客户端应用程序。
【问题讨论】:
-
您不导出类型,而是导出链接器符号。
-
@aschepler 你介意扩展一下吗?
-
完全不清楚你为什么使用两个 .h 文件,或者为什么你没有为 foo() 声明参数类型。结构中没有可导出的内容,它没有任何代码。避免这种困境的简单方法是只使用一个 .h 文件并完成它。
-
@HansPassant 我按照您的建议修复了参数的类型。我不想要一个头文件的原因是因为导出头文件将与客户端和 DLL 共享,我不想在该头文件中公开我所有结构的声明。跨度>
-
您希望客户端代码看到 __declspec(dllimport) 和 FooParams。因此,到目前为止您发布的所有内容都属于一个 .h 文件。如果您有其他特定于实现的 .h 文件,那么只需将它们#include 到您的 .cpp 文件中。
标签: c dll struct dllimport dllexport