動的にリンクされた 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{...};