3

DLLImport を使用して、C# アプリケーションで C++ DLL の関数を使用したいと考えています。

BOOL IsEmpty( DWORD KeyID, BOOL *pFlag )

私は多くの組み合わせを試しましたが、次のように無駄でした:

public extern static bool IsEmpty(int KeyID, ref bool pFlag);

メソッドは false (エラーを意味します) を返します。

それを行う方法はありますか?

4

4 に答える 4

4

「ウィリー」を引用するには(修正あり):

ブール値に注意してください!

Win32 では、さまざまなバージョンのブール値が定義されています。

1) ほとんどの Win32 API で使用される BOOL はunsigned int と signed int (4 バイト)です。

2) BOOLEAN は 1 バイトで、少数の win32 API でのみ使用されます!!

3) C/C++ には組み込みの「bool」があり、これは 1 バイトです。

...そして@tenfourが指摘したことを追加するには:

4) さらに奇妙な VARIANT_BOOL

typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)

「false」パターンは 0 のみであるため、符号付きまたは符号なしの性質は BOOL には関係ありません。したがって、4 バイトの量として扱ってみてください...ただし、DWORD とのインターフェースで十分な場合があります(私は扱っていません)。 Windows の 64 ビット規則に準拠しています。)

于 2012-10-03T15:12:20.940 に答える
1

because in c++ BOOL is defined as int. You should use

    [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
    public static extern  bool IsEmpty(uint KeyID, ref int pFlag) ;
于 2012-10-03T15:18:32.400 に答える
1

BOOLWin32 では int の typedef なので、 に変更boolするだけInt32でよいので、定義はint IsEmpty(uint KeyID, ref int pFlag)

于 2012-10-03T15:12:13.310 に答える
0

ご協力ありがとうございました!

最後にこれは私のために働く

public extern static int IsEmpty(int KeyID、int [] pFlag)

于 2012-10-04T07:58:23.767 に答える