Запуск 64-битного процесса из 32-битной программы

У меня есть 32-битная программа, которую я пытаюсь запустить на 64-битном компьютере. Я запускаю команду vssadmin, чтобы получить информацию о точке восстановления и сохранить ее в текстовом файле.
Теперь он отлично работает на моем 32-битном компьютере, и я тестировал его на 64-битном компьютере моего друга, и он не работает.

Если я использую system () из 32-битного приложения, работающего в 64-битной системе, будет ли оно использовать 32-битную командную строку? Это единственное, что я могу подумать, что это перестанет работать, так как я вручную запускаю команду из командной строки, и она отлично работает.

Если это так? Есть ли способ заставить его использовать правильную командную строку?

3

Решение

Как в Linux, так и в Windows [и я верю в BSD / MacOS], 32-разрядные приложения могут запустить 64-разрядный процесс, используя соответствующий системный вызов «создать новый процесс» [который system() делает несколько слоев вниз внутри оболочки, чтобы она запустилась].

Единственное ограничение заключается в том, что 32-разрядный исполняемый файл не может использовать 64-разрядную общую библиотеку (.so или .dll) или наоборот. Но новый процесс начинается с загрузки нового исполняемого файла, и в этот момент процесс может быть 32- или 64-разрядным в зависимости от самого исполняемого файла.

10

Другие решения

Вы всегда должны избегать использования 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 () не делает одно и то же на разных машинах, Матс Петерссон объяснил почему

1

По вопросам рекламы [email protected]