0

次のように、idl ファイルで宣言されたメソッドがあります。

[id(7), helpstring("method SomeFunction")] HRESULT SomeFunction([in] INT_PTR windowHandle, [out, retval] VARIANT_BOOL* dlgResult);

このメソッドを使用して、C# で実装します。

public bool SomeFunction(int windowHandle)

32 ビットをビルドするときは問題なく動作しますが、x64 をビルドすると、idl が 64 ビット値を探し、c# が 32 ビット値を期待するため、型が一致しません。

C# ではコードに long または int が必要なため、C# で IntPtr を使用しても機能しません。

プラットフォームに応じて long または int にコンパイルされる c# メソッドで使用できる型はありますか?

関数を 2 回使用してコードを複製する必要はなく、下位互換性のために IDL を変更して Int64 のみを使用できるかどうかはわかりません。

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

0

あなたは本当にあなたIntPtrのために働かないだろうか?IntPtr構造体には、をとるコンストラクターのオーバーロードと、をとるInt32別のコンストラクターがありInt64ます。さらに、ToInt32()メソッドとToInt64()メソッドがあります。コードは次のように機能します。

public bool SomeFunction(IntPtr windowHandle)
{
    // Implementation here.
    // If you need the value of the pointer in the implementation,
    // you can use:
    // long actualValue = windowHandle.ToInt64();
}

long actualHandle = 1234;
IntPtr handlePtr = new IntPtr(actualHandle);
bool returnValue = SomeFunction(windowHandle);
于 2011-04-26T14:13:31.063 に答える
0

Project Properties... に移動し、[Build] タブに移動します。

そこに「条件付きコンパイル シンボル」があり、x64 プラットフォームに WIN64 を追加します。保存。

「AnyCPU」の場合、おそらくそのプラットフォームを削除したいでしょう...

次に、コードで次を使用します。

#if WIN64
     long handle;
     public bool SomeFunction(long windowHandle)
#else
     int handle;
     public bool SomeFunction(int windowHandle)
#endif

ただし、 IntPtr を使用して、その Size プロパティに応じてその値を int/long に変換できると思います...

于 2011-04-26T13:00:14.257 に答える