使用 dosbox 在 64 位上运行 16 位程序

使用 dosbox 在 64 位上运行 16 位程序

在阅读了大量有关如何使用 dosbox 和虚拟机在 x-64 上运行旧程序的资料后,我发现自己处于另一种情况。

我有一个 32 位程序,可以正确运行,但会调用一个 16 位程序。因此,每当我尝试使用该函数时,程序都会给出错误。

是否可以让这个程序始终使用 dosbox 运行?我注意到它可以与 dosbox 一起使用,但应该从另一个程序中调用它。

我已经阅读过的参考文献:

不支持的 16 位应用程序

强制程序在 x86 上运行?

在 Windows 7 64 位上安装程序时出错

无需 dosbox 即可在 64 位机器上运行 16 位程序

无需 dosbox 即可在 64 位机器上运行 16 位程序

使用虚拟化在 64 位操作系统上运行 16 位代码

是否可以在 Windows 7 64 位下运行旧的 16 位 DOS 应用程序?

如何让 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 位程序传递的参数不包含引号。如果包含,则必须添加某种转义函数,但我不知道标准库中是否有此类函数。

相关内容