加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何使用__declspec(dllexport / import)从DLL /导出/导入C结构

发布时间:2020-12-14 01:44:23 所属栏目:Windows 来源:网络整理
导读:这是我第一次处理DLL.在MSDN文档之后,我创建了一个头文件fooExports.h,其中宏根据预处理器定义定义: #ifdef FOODLL_EXPORTS #define FOO_API __declspec( dllexport )#else #define FOO_API __declspec( dllimport ) 我的目的是在我的DLL实现以及控制台应用
这是我第一次处理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以及使用它的客户端应用程序.

如果客户端对FooParams的唯一用途是获取从DLL函数返回的指针并将这些指针传递给其他DLL函数,则可以使其成为“不透明类型”:Put
typedef struct FooParams FooParams;

在fooExports.h中. FOO_API宏不属于该声明. opaque类型意味着客户端代码不能:

>创建FooParams类型的任何变量(但是FooParams * ptr = NULL;没关系).
>对FooParams的任何成员做任何事情.
>查找sizeof(FooParams) – 因此无法正确地为一个或多个FooParams对象提供malloc空间.

您也不能#define对客户端可见的宏执行上述任何操作.所以你的DLL需要有一个或多个“构造函数”或“工厂”函数,可能就像

FOO_API FooParams* CreateFooParams(const char * input);

定义匹配的“析构函数”函数也是一种很好的做法

FOO_API void DestroyFooParams(FooParams * p);

即使定义像{free(p);因为如果在DLL内部分配的内存被外部的代码释放,反之亦然(因为并非所有的Windows代码都使用相同的malloc和free定义),因此有时会出现问题.

如果所有这些都太极端,唯一的另一个选择是在导出的头文件中放入或#include结构定义,并使其对客户端可见.没有它,除了传递指针之外,任何对FooParams做某事的尝试都是不可能的,因为编译器不会知道FooParams中的内容.编译器(与链接器相对)仅从命令行参数和#include-d文件获取信息,而不是从库或DLL获取信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读