0

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

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

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 构造函数中添加了一条日志行,该日志行是在从 Windows 窗体测试创建 WSWindow 时写入的应用程序,但不是当 WSWindow 是由 C++ 应用程序的调用创建时,所以似乎 WSWindow 构造函数中的任何内容都没有被执行,它只是立即崩溃。

我可以说的参考没有问题;我已经编写了几个测试方法,一个返回一个 int,一个是一个简单的自定义 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..
4

1 回答 1

1

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

于 2012-05-30T19:36:28.003 回答