Используйте dosbox для запуска 16-битной программы на 64-битной
Прочитав много о том, как использовать dosbox и виртуальные машины для запуска старых программ на x-64, я оказался в другой ситуации.
У меня есть 32-битная программа, которая работает правильно, но вызывает 16-битную программу. Поэтому всякий раз, когда я пытаюсь использовать эту функцию, программа выдает мне ошибку.
Возможно ли, чтобы эта программа всегда запускалась с помощью dosbox? Я заметил, что он работает с dosbox, но его следует вызывать из другой программы.
ссылки, которые я уже прочитал:
Неподдерживаемое 16-битное приложение
Принудительно запустить программу на x86?
Ошибка при установке программы на Windows 7 64-bit
Запустить 16-битную программу на 64-битном компьютере без DOSBox
Запустить 16-битную программу на 64-битном компьютере без DOSBox
запуск 16-битного кода на 64-битной ОС с использованием виртуализации
Можно ли запустить старое 16-разрядное приложение DOS под Windows 7 64-разрядной?
Как заставить 16-битные программы работать на 64-битной Windows?
Почему 64-битная ОС не может запустить 16-битное приложение?
Таким образом, в основном dosbox - это вариант, но как я могу заставить программу запускаться в dosbox, когда она вызывается?
1 ответ
Вы можете попробовать создать программу, которая называет это в DosBox. Затем переименуйте 16-битный исполняемый файл в progname.old.exe
и переименуйте вашу новую программу в progname.exe
, Вот пример программы (Примечание: это не проверено. Может даже не скомпилироваться.):
#include <stdlib.h>
#include <string.h>
#include <windows.h>
int main(int argc, char* argv[]) {
// The string we use to call DOSBOX:
const char *dosboxstrstart = "path\\to\\dosbox \"path\\to\\progname.old.exe ";
const char *dosboxstrend = "\" -exit";
// Get the entire command line, with a full path prepended
// to the first argument
char *allcmdline = GetCommandLine();
// Get a pointer to the start of this program's name, then
// skip past this program's name to get the arguments only
char *argstart = strstr(allcmdline, argv[0]) + strlen(argv[0]);
// Get the length of the argument string
// Get the length of the DosBox strings
size_t argstartlen = str_len(argstart);
size_t dosboxstrstartlen = str_len(dosboxstrstart);
size_t dosboxstrendlen = str_len(dosboxstrend);
// Create a buffer for the string to go into (+1 for the \0)
// Assumes that malloc won't go wrong; a lovely segfault
// will occur if it does! :-p
char *finalstring = malloc(argstartlen + dosboxstrstartlen + dosboxstrendlen + 1);
// Put the string into it, piece by piece
memcpy(finalstring, dosboxstrstart, dosboxstrstartlen);
memcpy(finalstring + dosboxstrstartlen, argstart, argstartlen);
memcpy(finalstring + dosboxstrstartlen + argstartlen, dosboxstrend, dosboxendlen + 1);
// Run the command
system(finalstring);
// Perform our duty to the almighty kernel!
free(finalstring);
}
Этот код предполагает, что аргументы, которые передает 32-битная программа, не содержат кавычек. Если они это сделают, вам нужно будет добавить какую-нибудь экранирующую функцию, а я не знаю ни одной в стандартной библиотеке.