CreateWindow 从托管 handleref 的指针抛出访问冲突

CreateWindow throwing access violation from pointer from managed handleref

我可能已经超出了我的理解范围,所以如果我看起来完全迷路了,我很抱歉,但这只是因为我迷路了。 (但是,如果我从未超出我的深度,我想我永远学不到任何东西)

我正在尝试弄清楚如何在 WPF 控件中托管 Win32 window,但是由于完全不了解 Windows API,我正在努力进行交互以基本方式使用它。

目前,当我尝试将父 window 的 HWND 传递给方法 "CreateWindow."

时遇到访问异常

这是我的代码:

///------------- VisualDerived.h -----------------

using namespace System::Runtime::InteropServices;

namespace POCPP
{
    namespace WPF
    {
        namespace Controls
        {
            public ref class VisualDerived : System::Windows::Interop::HwndHost
            {
            private:
                HWND *childWin;

            protected:
                virtual HandleRef BuildWindowCore(HandleRef trg) override;
                virtual void DestroyWindowCore(HandleRef trg) override;

            public:
                VisualDerived();


            };
        }
    }
}

// ------------------ VisualDerived.cpp -----------------------

#include "Stdafx.h"
#include <Windows.h>
#include <WinUser.h>
#include "VisualDerived.h"
#pragma comment(lib, "user32.lib")

HandleRef POCPP::WPF::Controls::VisualDerived::BuildWindowCore(HandleRef trg)
{
    DWORD windowOptions = WS_CHILDWINDOW;

    HWND *parentWindow = (HWND*)trg.Handle.ToPointer();

    HWND chld = CreateWindow(NULL, NULL, windowOptions, 0, 0, 200, 200, *parentWindow, 0, 0, NULL); // throws access exception as is, returns null reference exception without the pointer to the parentWindow

    return HandleRef(NULL, System::IntPtr(&chld));

}

void POCPP::WPF::Controls::VisualDerived::DestroyWindowCore(HandleRef trg)
{

}

POCPP::WPF::Controls::VisualDerived::VisualDerived()
{

}

无论如何,如果我的问题对这里经验丰富的专业人士来说似乎很无聊,我很抱歉。我完全不了解 Windows API,也不了解 C++/CLI。

但我决心学习如何做到这一点,所以任何帮助都会很棒。

HWND *parentWindow = (HWND*)trg.Handle.ToPointer();

是错误的,因为 HandleHWND。将其更改为:

HWND parentWindow = (HWND)trg.Handle.ToPointer();

您在调用 CreateWindow 时将 NULL 作为 window class 传递。您必须提供 window class。

你的return说法也是错误的。您正在 return 获取局部变量的地址。应该是:

return HandleRef(NULL, System::IntPtr(chld));