Запустите приложение C# из C++ и выполните задачу в этом приложении.

Я прочитал это и добился открытия своего приложения C#. Мое приложение С# открывает папку и рисует график. Могу ли я указать моему приложению С#, какую папку открывать из С++, а затем, как только график будет виден и программа С# закрыта, она вернется обратно в приложение С++.

Редактировать: Спасибо, Мэтью, у меня все получилось.

Другой запрос относительно моей переменной CreateProcess lpCommandLine: (Ниже приведен код)

CString sFolderPath = "C:\Documents and Settings\...";
      int nStrBuffer = sFolderPath.GetLength() + 50;
      LPTSTR szParam = _tcsdup(sFolderPath.GetBuffer(nStrBuffer));

  nRet = ::CreateProcess(szCmdline,// pointer to name of executable module 
  szParam,// pointer to command line string
  NULL,// pointer to process security attributes 
  NULL,// pointer to thread security attributes 
  FALSE,// handle inheritance flag 
  DETACHED_PROCESS,// creation flags 
  NULL,// pointer to new environment block 
  NULL,// pointer to current directory name 
  &sui,// pointer to STARTUPINFO 
  &pi );// pointer to PROCESS_INFORMATION

Я правильно получаю переменную szParam, но когда приложение открывается, полное имя файла не копируется. Например: в приведенном выше случае копируются только "и настройки...", а часть "C:\Documents" остается позади. Не могли бы вы указать на мою ошибку, пожалуйста?

Реализация С#:

[STAThread]
static void Main(string[] args)
{
    foreach (string result in args)
    {
        MessageBox.Show(result);
    }
}

person Neophile    schedule 05.06.2013    source источник


Ответы (1)


Это, безусловно, возможно.

C++ CreateProcess() имеет параметр с именем lpCommandLine.

Что вам нужно сделать в C++, так это передать как lpCommandLine строку с именем папки, которую вы хотите открыть. Вам нужно будет заключить строку в двойные кавычки, если путь к папке содержит пробелы.

Внутри вашей программы на C# у вас будет файл static void Main(string[] args). Параметр args будет содержать имя папки, которое вы передали из программы C++, чтобы вы могли действовать соответствующим образом.

Чтобы программа C++ дождалась выхода программы C#, ей нужно будет использовать WaitForSingleObject(), чтобы дождаться ее выхода, используя дескриптор процесса, возвращенный из CreateProcess().

Это описано здесь: http://www.codeproject.com/Tips/333559/CreateProcess-and-wait-for-result

person Matthew Watson    schedule 05.06.2013
comment
Круто .. Я уже сделал реализацию C #, просто не знал реализации C ++. Кроме того, я не уверен в отрицательном голосовании от кого-то :( - person Neophile; 05.06.2013
comment
@TheNewbie Я не уверен в отрицательном голосовании; вопрос казался достаточно ясным. - person Matthew Watson; 05.06.2013
comment
Привет, Мэтью ... извините за беспокойство ... но не могли бы вы взглянуть на мой обновленный вопрос и сообщить мне, почему имя файла не копируется должным образом? Поскольку это было связано с тем же вопросом, я подумал, что просто опубликую ниже. - person Neophile; 06.06.2013
comment
@TheNewbie Ознакомьтесь со справкой по CreateProcess(). Вам нужно будет передать фиктивную первую строку (обычно имя программы), за которой следуют аргументы программы, заключенные в кавычки, если они содержат пробелы, примерно так: DummyFirstArg "Path Name With Spaces" - person Matthew Watson; 06.06.2013