我有一个 32 位程序,我试图在 64 位计算机上运行。我正在运行 vssadmin 命令来获取还原点信息并将其保存到文本文件中。现在,它在我的 32 位计算机上运行良好,我正在我朋友的 64 位计算机上测试它,但它不起作用。
如果我在 64 位系统上运行的 32 位应用程序中使用 system(),它会使用 32 位命令提示符吗?这是我认为唯一会阻止它工作的事情,因为我已经从命令提示符手动运行命令并且它工作正常。
如果是这种情况?有没有强制它使用正确的命令提示符?
在 Linux 和 Windows [我也相信 BSD/MacOS] 中,32 位应用程序可以使用相关的“创建新进程”系统调用来启动 64 位system()
进程]。
唯一的限制是 32 位可执行文件不能使用 64 位共享库(.so 或 .dll),反之亦然。但是一个新进程首先加载一个新的可执行文件,此时该进程可以是 32 位或 64 位,具体取决于可执行文件本身。
您应该始终避免使用 system() 因为
你应该使用CreateProcess()。
您可以使用 Createprocess() 来启动一个 .exe 并为其创建一个新进程。该应用程序将独立于调用应用程序运行。
这是我在一个项目中使用的示例:
VOID startup(LPCTSTR lpApplicationName)
{
// additional information
STARTUPINFO si;
PROCESS_INFORMATION pi;
// set the size of the structures
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// start the program up
CreateProcess( lpApplicationName, // the path
argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
注意:正如我之前所说,system() 在不同的机器上不会做同样的事情,Mats Petersson 解释了原因