将对象作为参数传递给createProcess时出现问题
Problem with passing object as an argument to createProcess
我正试图纠正一个程序,使其他程序与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。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- CreateProcess API的安全问题
- 使用createprocess()时出现类型转换问题
- CreateProcess和MapViewOfFile有很多问题
- CreateProcess函数问题
- CreateProcess()中lpCommandLine的问题
- 关于Cpp App CreateProcess()调用的c# App MessageBox.Show()的问题
- 将对象作为参数传递给createProcess时出现问题