我有一个32位程序,我试图在64位计算机上运行。我正在运行vssadmin命令来获取还原点信息并将其保存到文本文件中。 现在,它在我的32位计算机上工作正常,我在朋友的64位计算机上测试它并不起作用。
如果我在64位系统上运行的32位应用程序中使用system(),它会使用32位命令提示符吗?这是我能想到的唯一能阻止它工作的东西,因为我从命令提示符手动运行命令并且工作正常。
如果是这样的话?反正是否强迫它使用正确的命令提示符?
答案 0 :(得分:10)
在Linux和Windows中[我也相信BSD / MacOS],32位应用程序可以使用相关的“创建新进程”系统调用启动64位进程[system()
执行几个在它开始的shell内部向下分层。
唯一的限制是32位可执行文件不能使用64位共享库(.so或.dll),反之亦然。但是,新进程首先加载一个新的可执行文件,此时该进程可以基于可执行文件本身为32位或64位。
答案 1 :(得分:1)
您应该始终避免使用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解释了为什么