2012-05-28 63 views
0

我有一個C++應用程序,我試圖展示一個WPF窗體(名爲WSWindow),特別是一個從System.Windows.Window類繼承,以便我可以獲得窗口句柄使用WindowInteropHelper類。WPF窗口構造函數崩潰C++應用

我的問題是,每當我調用下面的方法,應用程序崩潰。

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 couldn沒有解決,但我在調用InitializeComponent()之前在WSWindow構造函數中添加了一個日誌行,在從Windows窗體測試應用程序創建WSWindow時寫入,而不是在通過C++調用創建WSWindow時寫入應用程序,所以它看起來像WSWindow構造函數甚至沒有被執行,它只是馬上崩潰。

我可以說的引用沒有問題;我已經寫了幾個測試方法,其中一個返回一個int,一個是帶寬度/高度成員的簡單自定義Window對象,併成功從C++應用程序中調用。

我也成功地檢索了WSWindow的句柄,當它被編譯爲WPF應用程序並在啓動C++應用程序之前運行,但我需要能夠通過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

解決方案是,我需要標記線程進行調用創建/顯示WPF窗口與[STAThread]屬性。