如何在ref类中正确存储HWND?

时间:2015-02-07 00:52:59

标签: c++-cli

我正在使用C ++ / CLI 来与C#一起使用。我有一个ref类(直接在托管代码中使用,因此它必须兼容)存储HWND,但我不认为我做得对:

public ref class MyClass {
  protected:
    HWND hWnd;
}

我应该在ref类中使用像这样的本机指针吗?或者我应该使用ptr<T>

之类的东西

2 个答案:

答案 0 :(得分:2)

句柄不是指针,HWND很好。如果您希望C#代码从您的类派生并访问句柄,那么您需要将其公开为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的生命周期通常不在您的控制之下。

答案 1 :(得分:1)

本机指针/句柄在ref类中是完全安全的。 (毕竟,他们只是int。)然而,将它们存储在IntPtr类中更为惯用。 (这就是WinForms stores them的方式。)