我有一个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..
答案 0 :(得分:1)
解决方案是我需要标记线程,使用[STAThread]属性创建/显示WPF窗口。