Use o dosbox para executar o programa de 16 bits em 64 bits

2

Depois de ler muito sobre como usar o dosbox e as máquinas virtuais para rodar programas antigos no x-64, eu me encontrei em outra situação.

Eu tenho um programa de 32 bits que funciona corretamente, mas chama um programa de 16 bits. Então, sempre que tento usar essa função, o programa me dá o erro.

É possível que este programa funcione sempre usando o dosbox? Eu notei que funciona com o DOSBox, mas deve ser chamado dentro de outro programa.

referências que eu já li:

Aplicativo de 16 bits não suportado

Força um programa a ser executado no x86?

Erro ao instalar o programa no Windows 7 de 64 bits

Executa um programa de 16 bits em 64 bits de máquina sem dosbox

Executa um programa de 16 bits em 64 bits de máquina sem dosbox

executando código de 16 bits em 64 bits SO, usando virtualização

É possível executar um antigo aplicativo DOS de 16 bits no Windows 7 de 64 bits?

Como posso obter programas de 16 bits para trabalhar em um Windows de 64 bits?

Por que não é possível usar 64 bits? OS executa uma aplicação de 16 bits?

Então, basicamente, o dosbox é uma opção, mas como eu poderia forçar o programa a ser executado no DOSBox sempre que ele é chamado?

    
por davejal 27.06.2016 / 20:08

1 resposta

0

Você pode tentar criar um programa que o chama no DosBox. Em seguida, renomeie o executável de 16 bits para progname.old.exe e renomeie o novo programa para progname.exe . Aqui está um programa de exemplo (Nota: isso não foi testado. Pode nem mesmo compilar.):

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

Esse código pressupõe que os argumentos que o programa de 32 bits passa não contêm aspas. Se sim, você terá que adicionar algum tipo de função de escape, e eu não sei de nenhum na biblioteca padrão.

    
por 09.10.2016 / 13:56