Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将HWND传递给方法并存储在类中_C++_Winapi - Fatal编程技术网

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;
   ...