DLLImport を使用して、C# アプリケーションで C++ DLL の関数を使用したいと考えています。
BOOL IsEmpty( DWORD KeyID, BOOL *pFlag )
私は多くの組み合わせを試しましたが、次のように無駄でした:
public extern static bool IsEmpty(int KeyID, ref bool pFlag);
メソッドは false (エラーを意味します) を返します。
それを行う方法はありますか?
「ウィリー」を引用するには(修正あり):
ブール値に注意してください!
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 ビット規則に準拠しています。)
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) ;
BOOL
Win32 では int の typedef なので、 に変更bool
するだけInt32
でよいので、定義はint IsEmpty(uint KeyID, ref int pFlag)
ご協力ありがとうございました!
最後にこれは私のために働く
public extern static int IsEmpty(int KeyID、int [] pFlag)