4

ac# アプリケーションで ac dll を使用すると問題が発生します。エラーを発生させる関数は、dll のヘッダー ファイルで次のように定義されています。

int __stdcall DDC_CreateFilePropertyString (DDCFileHandle file, 
                                        const char *property,
                                        const char *value);

dll にアクセスするクラスに次のコードを追加しました。

[DllImport("nilibddc.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
private static extern int DDC_CreateFilePropertyString(IntPtr file,
                         [MarshalAs(UnmanagedType.LPStr)]string property,
                         [MarshalAs(UnmanagedType.LPStr)]string value);

Type DDCFileHandle は、ヘッダー ファイルで次のように定義されます。

typedef struct _DDCFile DDCFile;
typedef DDCFile*    DDCFileHandle;

ヘッダー ファイルに _DDCFile 構造体に関する追加情報はありません (使用しているライブラリの他のファイルはありません)。

関数 DDC_CreateFilePropertyString() を呼び出す前に、次の関数を呼び出してファイルを作成し、ファイル ハンドルを取得します。

[DllImport("nilibddc.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Ansi]
private static extern int DDC_CreateFile(char[] filePath,
                          char[] fileType,
                          char[] name,
                          char[] description,
                          char[] title,
                          char[] author,
                          ref IntPtr file);

ヘッダー ファイル内の定義は次のようになります。

int __stdcall DDC_CreateFile (const char *filePath,
                          const char *fileType,
                          const char *name,
                          const char *description,
                          const char *title,
                          const char *author,
                          DDCFileHandle *file);

今では常に、関数 DDC_CreateFilePropertyString を呼び出すと、間違ったパラメーターが渡されたことを示すエラーが返されます。私は何を間違っていますか?私が使用しているライブラリは、National Instruments の TDMS C API です。

ご協力いただきありがとうございます。

4

1 に答える 1

2

あなたの p/invokes は少しずれています。デフォルトのを使用する必要CallingConvention.Stdcallがあります。また、パラメーターについては、C# の末尾にconst char*あることを宣言するだけです。string

正しい C# p/invokeDDC_CreateFileは次のとおりです。

[DllImport("nilibddc.dll", CharSet=CharSet.Ansi]
private static extern int DDC_CreateFile(
    string filePath,
    string fileType,
    string name,
    string description,
    string title,
    string author,
    ref IntPtr file
);

そして、DDC_CreateFilePropertyStringこれが必要です:

[DllImport("nilibddc.dll", CharSet=CharSet.Ansi)]
private static extern int DDC_CreateFilePropertyString(
    IntPtr file,
    string property,
    string value
);

コードを修正した後もこれらの関数を呼び出したときにエラーが発生する場合は、明らかにライブラリを正しく使用していません。それはこの質問の範囲を超えています。ドキュメントを参照するか、ライブラリ ベンダーにサポートを求めてください。

于 2012-12-11T12:37:04.607 に答える