0

我在动态链接 DLL 的函数中使用来自 NI LabWindows 应用程序的指针时遇到问题。

  • DLL 是使用 MinGW 4.7 构建的
  • 据我所知,NI LabWindows 使用具有 C89 标准和 C90 扩展的非常古老的 LLVM CLang ANSI C 编译器

当调用特定的 DLL 函数时,我使用指向结构的指针。问题是,LabWindows 应用程序给出的指针指向的内存位置比 DLL 期望它们指向的内存位置提前 1 个字节。

所以到目前为止我讨厌的解决方案如下:

int MyFunction(MyStruct* struct) {
    char *ptr = (char*) struct;
    ptr--;
    struct = (MyStruct*) ptr;

    // do stuff

    ptr = (char*) struct;
    ptr++;
    struct = (MyStruct*) ptr;

    return 0;
}

我的问题是:为什么???有没有更复杂的解决方案?

我希望像指针这样的基本概念不会因编译器而异,但可能 LabWindows 使用的那个概念太旧了。

编辑:解决方案是为编译器声明结构的正确方式并指定填充和对齐。因此,适用于两种编译器的正确结构定义是:

#pragma pack(2)
typedef struct MyStruct{...};
4

1 回答 1

0

好的,我解决了我的问题!所有奇怪行为的原因是内存管理。对齐和填充不同!所以在声明我的结构为打包后

typedef struct __attribute__(packed) MyStruct{ ...};

问题没有解决,所以我尝试了

typedef struct __attribute__(packed,align(1)) MyStruct{...};

也不是解决方案,因此我为 LLVM CLang 编译器添加了#pragma pack(1)

#pragma pack(1)
typedef struct __attribute__(packed,align(1)) MyStruct{...};

我不知道原因,但 LLVM 编译器不会遵循 pack(1) 指令,但最终的解决方案是将其全部更改为两字节对齐并删除除编译指示之外的所有内容:

#pragma pack(2)
typedef struct MyStruct{...};

现在一切都像一个魅力:-)

于 2017-01-27T09:56:55.610 回答