Win 7, Btrieve und es kommt eine DOS-Box



  • Servus,

    folgende Merkwürdigkeit:

    Win 7 Home Premium, 64 Bit
    Btrieve Requester 8

    Für meine Zwecke habe ich mir mal vor Urzeiten ein Programm geschrieben, ich
    verwende es für Kontakte, Buchhaltung etc. Seit Windows 3.1 organisch gewachsen,
    in C geschrieben. Zuerst mit Netware als Server und mit Btrieve als Datenbank.
    Mittlerweile über mehrere C-Compiler und Win-Versionen durchgezogen.

    Jetzt habe ich einen neuen PC mit Win 7 und das Programm ließ sich nicht mehr
    starten (Oh, blöd, auf 16 Bit kompiliert). Also auch an den neuesten Watcom
    umgehoben und angepaßt - läuft wieder.

    Als Requester habe ich wbtrv32.dll.

    Es funktioniert wieder alles, nur kommt beim Starten des Programms eine
    leere DOS-Box (ohne Titel etc). Rätsel über Rätsel. Beim Beenden der DOS-Box
    wird das Programm beendet was es sonst nur auf Nachfrage macht.

    Wo kann denn diese DOS-Box herkommen ?

    Grüße Joe.



  • Definiere "DOS-Box".
    Und versuch das ganze nochmal mit MinGW oder VisualC++ zu kompilieren.



  • Singender Holzkübel schrieb:

    Definiere "DOS-Box".

    Schwarzer Kasten mit nichts drinnen außer schwarz.
    So wie wenn man cmd.exe aufruft. Noch nie gesehen ?



  • Was hat die Frage mit C++ zu tun?



  • manni66 schrieb:

    Was hat die Frage mit C++ zu tun?

    ups - das falsche Forum erwischt, Sorry.



  • Scheppertreiber schrieb:

    Singender Holzkübel schrieb:

    Definiere "DOS-Box".

    Schwarzer Kasten mit nichts drinnen außer schwarz.
    So wie wenn man cmd.exe aufruft. Noch nie gesehen ?

    Doch, nur verstehe ich unter DOS-Box das hier.
    Wäre vielleicht für deine Zwecke gar keine schlechte Idee.

    Ansonnsten das Ding mal mit einem ordentliche Debugger unter die Lupe nehmen, bei so altem Code kann vieles Probleme machen.
    Ein wenig Source-Code posten würd' auch nicht schaden. 🙄

    LG Daniel.



  • Mit dem Procmon finde ich nichts.

    Code sind knapp 40.000 Zeilen, das wäre etwas arg viel.

    Laden der Btrieve-DLL

    BOOL
            BTR_InitBtrieve(
            HWND    hwnd
            )
    {
            char    buf[512];
            HANDLE  hinst;
            FARPROC lpfn;
            int     stat;
    
            hinst = JGetInstance( hwnd);
    
            if ( (hLib = LoadLibrary( SGetPRF( "syscon", "btrieve"))) == NULL ){
                    sprintf( buf,
                      "Kann Btrieve-DLL \n%s\nnicht laden.\n(Status $%x)\n%s",
                      SGetPRF( "syscon", "btrieve"), hLib, GetErrMessage());
                    MessageBox( NULL, buf, "WDOC", MB_OK | MB_ICONEXCLAMATION);
                    return FALSE;
            }
            strcpy( buf, SGetPRF( "syscon", "btrprms"));
            lpfn = GetProcAddress( hLib, "WBTRVINIT");
            stat = lpfn( hinst);
    
            if ( lpfn == NULL){
                    sprintf( buf,
                      "Fehler bei der Btrieve-Initialisierung\n"
                      "Recordmanager nicht geladen");
                    JA( buf);
                    MessageBox( NULL, buf, "WDOC", MB_OK | MB_ICONEXCLAMATION);
                    BTR_EndBtrieve();
                    return FALSE;
            }
            return TRUE;
    }
    

    Btrieve-Funktionsaufruf:

    int
            BTR_CallFunction(
            int     Function,
            char    *bt,
            char    *buf,
            int     *buflen,
            char    *keybuf,
            int     key
            )
    {
            FARPROC lpfn;
            WORD    keylen;
            int     ret;
    
            keylen = 255;
            lpfn   = GetProcAddress( hLib, "BTRCALL");
    
            return lpfn( Function, bt, buf, buflen, keybuf, keylen, key);
    }
    

    hLib ist in der Datei definiert:

    static  HANDLE hLib;
    


  • Hast du dein Project als Konsolenprogramm angelegt?
    Evtl. auch unbewusst, weil du nichts an den Einstellungen geändert hast.
    Oder weil der Startcode für main dies so macht.



  • Eigentlich nicht:

    int     PASCAL
            WinMain(
            HINSTANCE hinst,
            HINSTANCE previnst,
            LPSTR   _cmdline,
            int     cmdshow
            )
    {
            FARPROC proc;
            char    *p, buf[256];
    
            unlink( CtlFileName());
            unlink( sTmpFileName());
    
            cmdline         = _cmdline;
            IsInitialiszed  = FALSE;
            SIsInitialiszed = FALSE;
            StartOK         = FALSE;
    
            if ( previnst != NULL){
                    MakeKrach( "Daneben");
                    MsgBox( NULL,
                       "Programm bereits geladen\nEinmal reicht.",
                       PgmTitle, MB_ICONEXCLAMATION);
    
                    IdentifyMyWindow( hinst);
                    if ( hwndMine)
                            ShowWindow( hwndMine, SW_SHOW);
                    return FALSE;
            }
    
            GetModuleFileName( hinst, buf, 127);
    
            if ( strlen( cmdline)){
                    sprintf( profile, cmdline);
            } else {
                    if ( (p = strrchr( buf, '\\')) != NULL)
                            *p = 0;
                    sprintf( profile, "%s\\wdoc.ini", buf);
            }
    
            CreateJoesClasses( hinst);
    
            proc = MakeProcInstance( SplashProc, hinst);
            DialogBox( hinst, "SPLASH", NULL, proc);
            FreeProcInstance( proc);
    
            WritePrivateProfileString(
               "Btrieve Requester", "Splash Screen", "N", BTIIniFileName());
    
            if ( ! StartOK)
                    return FALSE;
    
            proc = MakeProcInstance( MainProc, hinst);
            DialogBox( hinst, "MAIN", NULL, proc);
            FreeProcInstance( proc);
    
            WriteProfileString( "JD DocuStock", "cmd", "BRK");
    
            CloseAllDatabases();
            FuckupJoesClasses( hinst);
            ReleaseDialogFonts();
            BTR_EndBtrieve();
    
            return 0;
    }
    

Log in to reply