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