从32位程序启动64位进程

时间:2013-03-21 16:05:08

标签: c++ 64-bit system 32-bit

我有一个32位程序,我试图在64位计算机上运行。我正在运行vssadmin命令来获取还原点信息并将其保存到文本文件中。 现在,它在我的32位计算机上工作正常,我在朋友的64位计算机上测试它并不起作用。

如果我在64位系统上运行的32位应用程序中使用system(),它会使用32位命令提示符吗?这是我能想到的唯一能阻止它工作的东西,因为我从命令提示符手动运行命令并且工作正常。

如果是这样的话?反正是否强迫它使用正确的命令提示符?

2 个答案:

答案 0 :(得分:10)

在Linux和Windows中[我也相信BSD / MacOS],32位应用程序可以使用相关的“创建新进程”系统调用启动64位进程[system()执行几个在它开始的shell内部向下分层。

唯一的限制是32位可执行文件不能使用64位共享库(.so或.dll),反之亦然。但是,新进程首先加载一个新的可执行文件,此时该进程可以基于可执行文件本身为32位或64位。

答案 1 :(得分:1)

您应该始终避免使用system(),因为

  • 资源丰富
  • 它会破坏安全性 - 你不知道它是一个有效的命令还是在每个系统上做同样的事情(参见Mats Petersson的回答),你甚至可以启动你不打算启动的程序。 危险在于,当您直接执行程序时,它会获得与您的程序相同的权限 - 这意味着,例如,如果您以系统管理员身份运行,那么您无意中执行的恶意程序也将作为系统运行管理员。如果这不会吓到你,请检查你的脉搏。
  • 反病毒程序讨厌它,你的程序可能会被标记为病毒。

您应该使用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解释了为什么