C++ 将HWND传递给方法并存储在类中
我打电话给:C++ 将HWND传递给方法并存储在类中,c++,winapi,C++,Winapi,我打电话给: // hMainWindow is a correctly functioning window handle app.GetMainWindowInfo().SetHndToWindow( hMainWindow ); 以下是我的课程: class App : public BaseClass { public: WindowInfo& GetMainWindowInfo(); void SetMainWindowInfo( unique_ptr<
// hMainWindow is a correctly functioning window handle
app.GetMainWindowInfo().SetHndToWindow( hMainWindow );
以下是我的课程:
class App : public BaseClass
{
public:
WindowInfo& GetMainWindowInfo();
void SetMainWindowInfo( unique_ptr<WindowInfo> windowInfo );
private:
WindowInfo mainWindowInfo;
};
class WindowInfo
{
public:
HWND& GetHndToWindow() const;
//void SetHndToWindow( HWND hndToWindow );
// implementation on cpp file included here simply for example
void WindowInfo::SetHndToWindow( HWND hndToWindow )
{
this->hndToWindow = hndToWindow;
}
private:
HWND hndToWindow; // Only for Windows OS
};
您的
IGraphicContext::SetWindowInfo
方法对传入的WindowInfo
进行复制。如果随后修改了原件(例如,通过调用SetHndToWindow
),这不会影响IGraphicContext
保存的副本
如果您真的想在两个不同的类之间共享这样的结构,您应该考虑将其保存在
std::shared\u ptr
中,SendHndToWindow的实现是什么样子的?仅仅看到声明是不够的,您需要提供实现。HWND是一个句柄,所以按值传递应该可以。我现在已经在代码中包含了它。无法读取内存不一定是问题,它只是意味着调试器不知道如何读取它以获取信息。你有没有试着继续下去而忽略它?编辑:我想了想,似乎VS正在试图读取作为指针的值。我的程序在我的HWND中也得到了同样的东西,所以应该很好地运行。窗口句柄是不透明的,调试器通常没有任何关于它们的合理说法。啊,好吧,现在知道我可以开始查看了。非常感谢!其中一些调试器消息真的让我着迷!我可以在你已经在传递一个参考文献的情况下,将参考文献传递到handl to窗口,但这还不够,你需要保留一个参考文献。这有可能是不安全的——如果原始对象在包含引用的对象之前就被破坏了,那么剩下的就是一个悬空的指针。
class IGraphicContext
{
// Methods
public:
virtual void Initialize() = 0;
private:
// Properties
public:
const WindowInfo& GetWindowInfo() const
{
return this->windowInfo;
}
void SetWindowInfo( WindowInfo& windowInfo )
{
this->windowInfo = windowInfo;
}
protected:
WindowInfo windowInfo;
};
class DXGraphicContext : public IGraphicContext, public BaseClass
{
// Methods
public:
DXGraphicContext();
~DXGraphicContext();
virtual void Initialize() override;
...