2

Прочитав много о том, как использовать 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 каждый раз, когда она вызывается?

1 ответ1

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .