2009-02-24 86 views
0

在我上一個問題中,我詢問了如何在C++ -cli程序中運行C#表單。我得到它的工作,但我有問題。我會盡量簡短。C++程序中的C#表格

我的C++程序必須執行一個C#表單並在其中執行一些簡單的函數(增加計數器並顯示它們)。但我不知道這樣做的最好方法。我在初始化函數初始化形式:++

Ç - CLI

SUTAdapter::Form1^ *ptForm1; // Global variable 

...

FormProject::Form1^ form1; 
form1 = gcnew FormProject::Form1(); 
ptForm1 = &form1; 
(*ptForm1)->Show(); 
(*ptForm1)->incCounter(0); 

在C++程序只需調用incCounter其他一些功能。我的問題是,從另一個函數到incCounter的第二次調用使得我的C#Form1 null(this == null),所以我可以使用incCounter的函數代碼而不是類變量。很奇怪,就像程序放置了FormProject一樣。

C#

public void incCounter(int counter) 
{ 
    int param1 = counter; 
    this.count[counter]++; // this == null in sucessive calls from c++ program 
} 

我在做什麼錯?我實際上禁用了窗體,只是在使用UI時調用函數和變量(invoke等)。正在退出清除Form1的C++ init函數(第一塊代碼)?

回答

0

我的猜想會是* ptForm1不足以使CLR將其計爲參考。也許它應該是Form1 ^^ ptForm,而不是?或者你爲什麼不把你的form1變量放在你的全局指針?

+0

它不會讓我有句柄的句柄,只是一個指向句柄的指針。我有它,所以我可以從其他函數調用表單的函數 – Hiperi0n 2009-02-24 10:47:39

0

我想你應該只是把句柄存儲在一個全局(即靜態)對象中,或者至少是一個方便的類的靜態字段來使用。就像danbystrom所說的,保留一個指向Form引用的指針不會阻止垃圾收集器在原始句柄變爲空時收回表單。

static ref class Globals 
{ 
    static FormProject::Form1^ MyForm; 
} 

// Later on... 
Globals::MyForm = form1; 
form1->DoStuff(); 
form1 = nullptr; 

// Globals::MyForms still exists! 

雖然我懷疑窗體引用變爲null意味着別的東西也是錯的。

1

如果您必須獲取託管堆上.NET對象的地址,請將其放在pin_ptr<>中,以便GC不會移動它。這可能是你的問題的根源。