2009-02-24 8 views
0

Dans ma dernière question, j'ai demandé l'exécution d'un formulaire C# dans un programme C++ -cli. Je l'ai fait fonctionner, mais j'ai des problèmes. J'essaierai d'être bref.Formulaire C# dans un programme C++

Mon programme C++ doit exécuter une forme C# et y exécuter des fonctions simples (augmentation des compteurs et leur affichage). Cependant, je ne connais pas la meilleure façon de le faire. Je forme initialisé dans une fonction init:

C++ - cli

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

...

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

D'autres fonctions dans le programme C++ il suffit d'appeler incCounter. Mon problème est, qu'un deuxième appel d'une autre fonction à incCounter rend mon C# Form1 nul (this == null), donc je peux utiliser le code de fonction de incCounter mais pas les variables de classe. C'est étrange, comme si le programme disposait le FormProject.

C#

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

Qu'est-ce que je fais mal? J'ai effectivement désactivé le formulaire et juste en utilisant la fonction et les variables dans le cas où le problème est avec l'interface utilisateur (invoquer et ainsi de suite). Est-ce que quitter la fonction init C++ (le premier morceau de code) efface le Form1?

Répondre

0

Mon suppose que serait que * ptForm1 ne soit pas suffisant pour que le CLR le compte comme référence. Peut-être que ce devrait être Form1 ^^ ptForm, à la place? Ou pourquoi ne pas simplement mettre la variable form1 lorsque vous installez globalement un pointeur?

+0

Il ne me laissera pas avoir un manche à une poignée, juste un pointeur vers une poignée. Je l'ai pour que je puisse appeler les fonctions de la forme d'autres fonctions – Hiperi0n

+0

Aussi, il ne me laissera pas avoir des poignées comme variables globales, bizarre mais c'est la seule façon dont je l'ai fait fonctionner – Hiperi0n

+0

Ensuite, je suppose que dès form1 sort du champ d'application, le GC en disposera. Que diriez-vous faire à la place et ensuite le supprimer manuellement? En fait, je ne l'ai pas fait moi-même, mais il y a des chances que je doive le faire dans un proche avenir, donc je suis curieux de savoir ce que vous avez découvert! :-) –

0

Je pense que vous devriez juste stocker le handle dans un objet global (c'est-à-dire statique), ou au moins un champ statique d'une classe pratique à utiliser. Comme dit danbystrom, garder un pointeur sur la référence du formulaire n'empêchera pas le garbage collector de récupérer le formulaire une fois que le handle d'origine sera nul. Bien que je soupçonne que la référence Form soit nulle, cela signifie également que quelque chose d'autre est faux.

1

Si vous devez prendre l'adresse d'un objet .NET sur le tas géré, placez-le dans un pin_ptr<> pour que le GC ne le déplace pas. Cela pourrait être la source de votre problème.

Questions connexes