Win 7, Btrieve und es kommt eine DOS-Box
-
Servus,
folgende Merkwürdigkeit:
Win 7 Home Premium, 64 Bit
Btrieve Requester 8Fü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ürmain
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; }