在阅读了大量有关如何使用 dosbox 和虚拟机在 x-64 上运行旧程序的资料后,我发现自己处于另一种情况。
我有一个 32 位程序,可以正确运行,但会调用一个 16 位程序。因此,每当我尝试使用该函数时,程序都会给出错误。
是否可以让这个程序始终使用 dosbox 运行?我注意到它可以与 dosbox 一起使用,但应该从另一个程序中调用它。
我已经阅读过的参考文献:
无需 dosbox 即可在 64 位机器上运行 16 位程序
无需 dosbox 即可在 64 位机器上运行 16 位程序
是否可以在 Windows 7 64 位下运行旧的 16 位 DOS 应用程序?
所以基本上 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 位程序传递的参数不包含引号。如果包含,则必须添加某种转义函数,但我不知道标准库中是否有此类函数。