У меня есть 32-битная программа, которую я пытаюсь запустить на 64-битном компьютере. Я запускаю команду vssadmin, чтобы получить информацию о точке восстановления и сохранить ее в текстовом файле.
Теперь он отлично работает на моем 32-битном компьютере, и я тестировал его на 64-битном компьютере моего друга, и он не работает.
Если я использую system () из 32-битного приложения, работающего в 64-битной системе, будет ли оно использовать 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 () не делает одно и то же на разных машинах, Матс Петерссон объяснил почему