C # форма в программе на C ++ - PullRequest
0 голосов
/ 24 февраля 2009

В своем последнем вопросе я спросил о запуске формы C # в программе C ++ - cli. У меня это работает, но у меня проблемы. Я постараюсь быть краток.

Моя C ++ программа должна выполнить форму C # и выполнить в ней несколько простых функций (увеличить счетчики и показать их). Однако я не знаю лучший способ сделать это. У меня есть форма, инициализированная в функции инициализации:

C ++ - кли

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

...

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

Некоторые другие функции в программе на C ++ просто вызывают incCounter. Моя проблема в том, что второй вызов другой функции в incCounter делает мой C # Form1 нулевым (this == null), поэтому я могу использовать код функции incCounter, но не переменные класса. Странно, как будто программа избавилась от FormProject.

C #

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

Что я делаю не так? Я на самом деле отключил форму и просто использовал функцию и переменные на случай, если проблема с пользовательским интерфейсом (вызывать и так). Выход из функции инициализации C ++ (первый кусок кода) очищает Form1?

Ответы [ 3 ]

1 голос
/ 25 февраля 2009

Если вы должны взять адрес объекта .NET в управляемой куче, поместите его в pin_ptr <> , чтобы GC не перемещал его. Это может быть источником вашей проблемы.

0 голосов
/ 24 февраля 2009

Я думаю, вы должны просто хранить дескриптор в глобальном (то есть статическом) объекте или, по крайней мере, в статическом поле удобного для использования класса. Как сказал Данбистром, сохранение указателя на ссылку на форму не помешает сборщику мусора вернуть форму, когда исходный дескриптор станет нулевым.

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

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

// Globals::MyForms still exists!

Хотя я подозреваю, что ссылка на форму обнуляется, значит что-то еще не так.

0 голосов
/ 24 февраля 2009

My думаю, будет означать, что * ptForm1 недостаточно, чтобы CLR посчитал его ссылкой Может быть, вместо Form1 ^^ ptForm? Или почему вы просто не помещаете переменную form1 как глобальную переменную указателя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...