我有一个 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..