WPF窗口构造函数崩溃C ++应用程序

时间:2012-05-28 16:30:19

标签: wpf c++-cli

我有一个C ++应用程序,我正在尝试显示一个WPF表单(名为WSWindow),特别是一个继承自System.Windows.Window类的表单,以便我可以使用WindowInteropHelper类获取窗口句柄。 / p>

我的问题是每当我调用下面的方法时,应用程序崩溃。

public IntPtr GetHWND()
{
    if (ivWindow == null)
    {
        ivWindow = new WSWindow();

        ivWindow.WindowStartupLocation = WindowStartupLocation.Manual;

        ivWindow.Show();
    }

    IntPtr handle = new WindowInteropHelper(ivWindow).Handle;

    return handle;                    
}

我相信WSWindow构造函数导致了崩溃。在C#方面,有一个调用WSWindow构造函数的WSService类,如果我把WSWindow构造函数放在WSService构造函数中,那么C ++应用程序在调用WSService构造函数时崩溃(当WSService构造函数不包含WSWindow构造函数)。另外,除了调用上面的方法之外,我还在C ++应用程序中尝试了以下内容:

WSWindow^ w = gcnew WSWindow();

并且此行之后的日志行不会被写入日志文件。

在WSWindow构造函数中,调用了InitializeComponents,它是在WSWindow.g.cs文件中生成的代码:

[System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public void InitializeComponent() {
        if (_contentLoaded) {
            return;
        }
        _contentLoaded = true;
        System.Uri resourceLocater = new System.Uri("/Project_Name;component/wswindow.xaml", System.UriKind.Relative);

        #line 1 "..\..\WSWindow.xaml"
        System.Windows.Application.LoadComponent(this, resourceLocater);

        #line default
        #line hidden
    }

起初我以为可能对LoadComponent的调用失败了因为uri无法解析,但我在调用InitializeComponent()之前在WSWindow构造函数中添加了一个日志行,当从WSWindow创建WSWindow时Windows Forms测试应用程序,但不是通过来自C ++应用程序的调用创建WSWindow时,因此似乎WSWindow构造函数中的任何内容都没有被执行,它只是立即崩溃。

我可以告诉参考文献没有问题;我编写了几个测试方法,一个返回一个int,一个是带有width / height成员的简单自定义Window对象,并且从C ++应用程序成功调用它们。

当它被编译为WPF应用程序并在启动C ++应用程序之前运行时,我也成功检索了WSWindow的句柄,但我需要能够通过C ++应用程序内的调用创建WSWindow。

我花了好几天时间试图找出崩溃的原因而没有运气。我希望读到这篇文章的人知道可能导致此问题的WPF,或者C ++ / CLI和WPF控件之间的已知问题。我完全没有想法。

其他信息:当我启动C ++应用程序并将VS附加到进程时,调用堆栈中没有任何内容显示(我可以使用另一个问题),但我注意到一些看起来可能与之相关的异常:

First-chance exception at 0x75a8b9bc (KernelBase.dll) in MM.EXE: Microsoft C++ exception: HRException at memory location 0x06e6b158..
First-chance exception at 0x75a8b9bc (KernelBase.dll) in MM.EXE: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x75a8b9bc (KernelBase.dll) in MM.EXE: Microsoft C++ exception: HRException at memory location 0x06e6b608..
First-chance exception at 0x75a8b9bc (KernelBase.dll) in MM.EXE: Microsoft C++ exception: [rethrow] at memory location 0x00000000..

1 个答案:

答案 0 :(得分:1)

解决方案是我需要标记线程,使用[STAThread]属性创建/显示WPF窗口。