Проблема с передачей объекта в качестве аргумента для createProcess - PullRequest
0 голосов
/ 08 июля 2011

Я пытаюсь исправить программу, которая работает с другими программами, с помощью вызова createProces.

Проблема в том, что я передаю объект класса Brick в качестве параметра вызова createProcess.

Я создаю объект (в основном) следующим образом:

char IpApplicationName[1000];

STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcessInfo;

strcpy(IpApplicationName, "c:\\Documents and Settings\\Eigenaar\\Bureaublad\\BluetoothTestr\\recvProc\\bin\\Debug\\recvProc.exe");

//set up the NXT
Connection *connection = new Bluetooth();
Brick *nxt = new Brick(connection);
char *nxt_ptr = (char *)&nxt;

Затем я подключаюсь так (6 - это коммуникационный порт ключа Bluetooth):

connection->connect(6);

CreateProcess(IpApplicationName, nxt_ptr, NULL, NULL, FALSE,    CREATE_NEW_CONSOLE, NULL, NULL,     &StartInfo, &ProcessInfo);

Я думаю, что все работает нормально, но проблема в том, что я возвращаю char* обратно к классу Brick в процессе recvProc.exe следующим образом:

Brick *nxt = (Brick*)argv[0];

Если я это прокомментирую, то программа работает нормально ... Что не так с этой строкой? Или мне нужно передать объект Connection в createProcess?

1 Ответ

3 голосов
/ 08 июля 2011

В качестве аргумента командной строки вы передаете указатель на указатель на класс .Это можно сломать несколькими способами:

  • Аргумент lpCommandLine в CreateProcess принимает текстовую строку.Не может быть встроенных байтов NUL.Должен быть байт NUL, чтобы отметить конец строки.Никакой такой гарантии нет с указателем на указатель или даже с указателем или любого рода нетекстовыми данными вообще .
  • Даже если указатель, покакое-то чудо, было правильно передано новому процессу, новый процесс имеет свое адресное пространство.Он вообще не может использовать указатели из старого процесса;они бессмысленны в процессе, отличном от того, который они создали.Таким образом, аргумент не имеет смысла.
  • Даже если бы он мог получить доступ к адресному пространству старого процесса, ничто не помешает уничтожению ориентированного кирпича до того, как новый процесс завершит свою работу.если все это исправлено, вы передаете указатель на указатель на кирпич и пытаетесь использовать его как обычный указатель на кирпич.

Короче говоря, вы не можете передавать объекты в качестве аргументов командной строки.Только текст.

Так что же здесь делать?Вот ваши варианты:

  • Пусть дочерний процесс самостоятельно подключится к кирпичу.Не пытайтесь передать ему соединение.
  • Установите какой-либо протокол (через stdin / stdout или, возможно, DCOM), чтобы дочерний процесс мог удаленно управлять объектом Brick в родительском объекте.
  • Превратите recvProc в DLL, которая выполняется внутри родительского процесса.
...