4

私は次のように GetWindowLong を使用していました。

[DllImport("user32.dll")]
private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

しかし、MSDN のドキュメントによると、GetWindowLongPtr を使用して 64 ビット互換にすることになっています。 http://msdn.microsoft.com/en-us/library/ms633584(VS.85).aspx

GetWindowLongPtr の MSDN ドキュメントには、(C++ で) 次のように定義する必要があると書かれています。

LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex);

以前は戻り値の型として IntPtr を使用していましたが、LONG_PTR と同等のものには一体何を使用するのでしょうか? C# で GetWindowLong が次のように定義されていることも確認しました。

[DllImport("user32.dll")]
private static extern long GetWindowLong(IntPtr hWnd, int nIndex);

何が正しいのですか? また、適切な 64 ビット互換性を確保するにはどうすればよいですか?

4

3 に答える 3

7

残念ながら、GetWindowLongPtrは32ビットWindowsには存在しないため、それほど簡単ではありません。32ビットシステムでは、GetWindowLongPtrはGetWindowLongを指す単なるCマクロです。32ビットシステムと64ビットシステムの両方でGetWindowLongPtrを実際に使用する必要がある場合は、実行時に呼び出す正しいシステムを決定する必要があります。pinvoke.netの説明を参照してください

于 2008-11-26T08:22:02.677 に答える
7

IntPtr を使用して GetWindowLongPtr を定義する必要があります。C/C++ では、LONG_PTR は 32 ビット システムでは 32 ビット、64 ビット システムでは 64 ビットです (こちらを参照)。C# の IntPtr は、同じように機能するように設計されています (こちらを参照)。

だからあなたが欲しいのは:

[DllImport("user32.dll")]
private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);
于 2008-11-26T03:43:03.550 に答える
3

SoapBox は正しいです。

さらに、型または関数が Win32 でマーシャリングする方法を確認する必要がある場合は、PInvoke Interop Assistantを使用してみてください。ほとんどの Win32 API の生成が組み込まれており、コード スニペットに基づいてカスタム生成を行うことができます。

于 2008-11-26T04:19:07.190 に答える