Verwenden Sie die Dosbox, um ein 16-Bit-Programm auf 64-Bit auszuführen

1902
davejal

Nachdem ich viel über die Verwendung von Dosbox und virtuellen Maschinen zum Ausführen älterer Programme auf x-64 gelesen hatte, befand ich mich in einer anderen Situation.

Ich habe ein 32-Bit-Programm, das korrekt ausgeführt wird, aber ein 16-Bit-Programm aufruft. Wann immer ich versuche, diese Funktion zu verwenden, gibt mir das Programm den Fehler.

Kann dieses Programm immer mit Dosbox ausgeführt werden? Ich habe bemerkt, dass es mit Dosbox funktioniert, aber es sollte aus einem anderen Programm heraus aufgerufen werden.

Referenzen, die ich bereits gelesen habe:

Nicht unterstützte 16-Bit-Anwendung

Ein Programm auf x86 ausführen lassen?

Fehler beim Installieren des Programms unter Windows 7 64-Bit

Führen Sie ein 16-Bit-Programm auf 64-Bit ohne Dosbox aus

Führen Sie ein 16-Bit-Programm auf 64-Bit ohne Dosbox aus

Ausführen von 16-Bit-Code auf einem 64-Bit-Betriebssystem unter Verwendung von Virtualisierung

Kann eine alte 16-Bit-DOS-Anwendung unter Windows 7 64-Bit ausgeführt werden?

Wie bekomme ich 16-Bit-Programme für ein 64-Bit-Windows?

Warum kann ein 64-Bit-Betriebssystem keine 16-Bit-Anwendung ausführen?


Im Grunde ist Dosbox eine Option, aber wie kann ich das Programm zwingen, bei jedem Aufruf in der Dosbox ausgeführt zu werden?

2

1 Antwort auf die Frage

0
wizzwizz4

Sie können versuchen, ein Programm zu erstellen, das es in DosBox aufruft. Benennen Sie dann die 16-Bit- progname.old.exeProgrammdatei in und Ihr neues Programm in um progname.exe. Hier ist ein Beispielprogramm (Hinweis: Dies wurde nicht getestet. Es wird möglicherweise nicht einmal kompiliert.):

#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); } 

Dieser Code setzt voraus, dass die Argumente, die das 32-Bit-Programm übergibt, keine Anführungszeichen enthalten. Wenn dies der Fall ist, müssen Sie eine Art Escape-Funktion hinzufügen. Ich kenne keine in der Standardbibliothek.