0

我正在尝试更正一个通过调用对其他程序产生影响的程序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];

如果我对此发表评论,那么程序可以正常工作......这条线有什么问题?还是我需要传递 Connection 对象createProcess

4

1 回答 1

3

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

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

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

那么,在这里做什么呢?以下是您的选择:

  • 让子进程自行连接到砖块。不要试图通过它一个连接。
  • 设置某种协议(通过 stdin/stdout,或者可能是 DCOM)以允许子进程远程控制父进程中的 Brick 对象。
  • 制作recvProc成在父进程内运行的DLL。
于 2011-07-07T22:57:51.937 回答