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

时间:2015-09-12 07:21:48

标签: wpf winapi c++-cli interop

我可能会离开这里深处,所以如果我看起来完全迷失了,我很抱歉,但这只是因为我。 (但是,如果我从未超出我的深度,我想我永远不会学到任何东西)

我试图弄清楚如何在WPF控件中托管Win32窗口,但由于完全无法了解Windows API,我很难以基本方式与它进行交互。

目前,当我尝试将父窗口的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。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

当您致电NULL时,您正在传递CreateWindow作为窗口类。你必须提供一个窗口类。

您的退货声明也是错误的。您正在返回本地变量的地址。它应该是:

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