如何在 ref class 中正确存储 HWND?
How to properly store an HWND in a ref class?
我正在开发一个与 C# 一起使用的 C++/CLI 库。我有一个存储 HWND
的引用 class(直接在托管代码中使用,因此它必须兼容),但我认为我做的不对:
public ref class MyClass {
protected:
HWND hWnd;
}
我应该在 ref class 中使用本地指针吗?或者我应该使用 ptr<T>
?
之类的东西
原生 pointers/handles 在 ref class 中是完全安全的。 (毕竟它们只是 int
s。)然而,将它们存储在 IntPtr
class 中会更符合习惯。 (这就是 WinForms stores them 的方式。)
句柄不是指针,HWND 可以。如果您希望 C# 代码从您的 class 派生并访问句柄,那么您需要将其公开为 IntPtr
。与句柄兼容,32位模式下为4字节,64位模式下为8字节,就像句柄一样。
最好用 属性 包裹它以隐藏转换:
protected:
property IntPtr Handle {
IntPtr get() { return IntPtr(hwnd); }
void set(IntPtr h) { hwnd = (HWND)h.ToPointer(); }
}
private:
HWND hWnd;
SafeHandle 可能有用,但是 HWND 的生命周期通常不受您的控制。
我正在开发一个与 C# 一起使用的 C++/CLI 库。我有一个存储 HWND
的引用 class(直接在托管代码中使用,因此它必须兼容),但我认为我做的不对:
public ref class MyClass {
protected:
HWND hWnd;
}
我应该在 ref class 中使用本地指针吗?或者我应该使用 ptr<T>
?
原生 pointers/handles 在 ref class 中是完全安全的。 (毕竟它们只是 int
s。)然而,将它们存储在 IntPtr
class 中会更符合习惯。 (这就是 WinForms stores them 的方式。)
句柄不是指针,HWND 可以。如果您希望 C# 代码从您的 class 派生并访问句柄,那么您需要将其公开为 IntPtr
。与句柄兼容,32位模式下为4字节,64位模式下为8字节,就像句柄一样。
最好用 属性 包裹它以隐藏转换:
protected:
property IntPtr Handle {
IntPtr get() { return IntPtr(hwnd); }
void set(IntPtr h) { hwnd = (HWND)h.ToPointer(); }
}
private:
HWND hWnd;
SafeHandle 可能有用,但是 HWND 的生命周期通常不受您的控制。