4

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

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

如果是这种情况?有没有强制它使用正确的命令提示符?

4

2 回答 2

10

在 Linux 和 Windows [我也相信 BSD/MacOS] 中,32 位应用程序可以使用相关的“创建新进程”系统调用来启动 64 位system()进程]。

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

于 2013-03-21T16:10:12.713 回答
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 解释了原因

于 2013-03-21T17:17:00.013 回答