将对象作为参数传递给createProcess的问题

时间:2011-07-07 22:46:56

标签: c++ bluetooth createprocess nxt

我正在尝试使用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是蓝牙加密狗的通信端口):

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];

如果我评论这个,那么程序运行正常......这条线有什么问题?或者我需要在createProcess中传递Connection对象吗?

1 个答案:

答案 0 :(得分:3)

作为命令行参数,您传递一个指向类的指针的指针。这在很多方面被打破了:

  • CreateProcess的lpCommandLine参数采用文本字符串。不能嵌入NUL字节。必须有一个NUL字节来标记字符串的结尾。指向指针的指针,或者指针或通常的任何类型的非文本数据都没有这样的保证。
  • 即使指针由某个奇迹正确传递给新进程,新进程也有自己的地址空间。它根本不能使用旧进程的指针;它们在与创建它们不同的过程中毫无意义。所以这个论点毫无意义。
  • 即使它可以访问旧进程的地址空间,在新进程完成其工作之前,没有任何东西可以阻止指向的块被销毁。
  • 即使所有这些都已修复,你也会将一个指针指向一个砖块,并试图将它作为一个常规的指针指向一块砖。

简而言之,您不能将对象作为命令行参数传递。只有文字。

那么,这里做了什么?您可以选择以下选项:

  • 让子进程自己连接到brick。不要试图传递连接。
  • 设置某种协议(通过stdin / stdout,或者可能是DCOM),以允许子进程远程控制父对象中的Brick对象。
  • recvProc转换为在父进程内运行的DLL。