Используйте dosbox для запуска 16-битной программы на 64-битной

1736
davejal

Прочитав много о том, как использовать dosbox и виртуальные машины для запуска старых программ на x-64, я оказался в другой ситуации.

У меня есть 32-битная программа, которая работает правильно, но вызывает 16-битную программу. Поэтому всякий раз, когда я пытаюсь использовать эту функцию, программа выдает мне ошибку.

Возможно ли, чтобы эта программа всегда запускалась с помощью dosbox? Я заметил, что он работает с dosbox, но его следует вызывать из другой программы.

ссылки, которые я уже читал:

Неподдерживаемое 16-битное приложение

Принудительно запустить программу на x86?

Ошибка при установке программы на Windows 7 64-bit

Запуск 16-битной программы на 64-битном компьютере без DOSBox

Запуск 16-битной программы на 64-битном компьютере без DOSBox

запуск 16-битного кода на 64-битной ОС с использованием виртуализации

Можно ли запустить старое 16-разрядное приложение DOS под 64-разрядной ОС Windows 7?

Как заставить 16-битные программы работать на 64-битной Windows?

Почему 64-битная ОС не может запустить 16-битное приложение?


Таким образом, в основном DOSBox является опцией, но как я могу заставить программу запускаться в DOSBox, когда она вызывается?

2

1 ответ на вопрос

0
wizzwizz4

Вы можете попробовать создать программу, которая называет ее в 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-битная программа, не содержат кавычек. Если они это сделают, вам нужно будет добавить какую-нибудь экранирующую функцию, а я не знаю ни одной в стандартной библиотеке.

Похожие вопросы