将对象作为参数传递给createProcess时出现问题

Problem with passing object as an argument to createProcess

本文关键字:问题 createProcess 对象 参数传递      更新时间:2023-10-16

我正试图纠正一个程序,使其他程序与createProces调用。

问题是当我传递Brick类的对象作为createProcess调用的参数时。

我这样创建对象(在main中):

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

我认为这一切都很好,但问题是当我在recvProc.exe过程中将char*转换回Brick类时,像这样:

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

如果我注释这个,那么程序工作正常…这条线有什么问题?或者我需要在createProcess中传递连接对象吗?

作为命令行参数,将指针传递给指向类的指针。这在很多方面都是错误的:

    CreateProcess的lpCommandLine参数接受一个文本字符串。不能嵌入NUL字节。必须有一个NUL字节来标记字符串的结束。指针到指针没有这样的保证,指针或任何类型的非文本数据通常都没有这样的保证。
  • 即使指针通过某种奇迹被正确地传递给了新进程,新进程也有自己的地址空间。它根本不能使用旧进程中的指针;它们在不同于它们被创造时的过程中是无意义的。所以这个参数是没有意义的。
  • 即使它可以访问旧进程的地址空间,在新进程完成工作之前,也没有什么可以阻止指向砖被销毁。
  • 即使所有这些都是固定的,你传递的是一个指针指向一个指针指向一个砖块,并试图使用它作为一个常规的指针指向砖块。

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

那么,我们在这里做什么?以下是您的选项:

  • 让子进程自己连接到砖。
  • 设置某种协议(通过stdin/stdout,或者可能是DCOM)来允许子进程远程控制父进程中的Brick对象。
  • recvProc变成一个在父进程中运行的DLL。