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();
是错误的,因为 Handle
是 HWND
。将其更改为:
HWND parentWindow = (HWND)trg.Handle.ToPointer();
您在调用 CreateWindow
时将 NULL
作为 window class 传递。您必须提供 window class。
你的return说法也是错误的。您正在 return 获取局部变量的地址。应该是:
return HandleRef(NULL, System::IntPtr(chld));
我可能已经超出了我的理解范围,所以如果我看起来完全迷路了,我很抱歉,但这只是因为我迷路了。 (但是,如果我从未超出我的深度,我想我永远学不到任何东西)
我正在尝试弄清楚如何在 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();
是错误的,因为 Handle
是 HWND
。将其更改为:
HWND parentWindow = (HWND)trg.Handle.ToPointer();
您在调用 CreateWindow
时将 NULL
作为 window class 传递。您必须提供 window class。
你的return说法也是错误的。您正在 return 获取局部变量的地址。应该是:
return HandleRef(NULL, System::IntPtr(chld));