JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=55ea601bd9c5c98384f029507d957c4cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

EXE kann nicht geschrieben werden

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Compuholic
Mini JLI'ler



Anmeldedatum: 15.10.2002
Beiträge: 25

Medaillen: Keine

BeitragVerfasst am: 20.01.2003, 18:00    Titel: EXE kann nicht geschrieben werden Antworten mit Zitat

Ich habe grade ein seltsames Problem:

Ich habe versucht eine DirectDraw Testanwendung zu schreiben, die einfach nur ein Rechteck auf eine Oberfläche blittet. Wenn das Programm aber einmal gestartet wurde kann ich keine Änderungen mehr kompilieren "DirectDrawTest.exe kann nicht zum Schreiben geöffnen werden". Offensichtlich wird das Programm nicht mehr korrekt beendet. Es taucht aber weder im Task-Manager, noch in der Prozessliste auf. Alle Objekte werden beim Beenden wieder released.

Nachdem das Programm einmal gestaret wurde geht auch die Performance des ganzen Systems in die Knie. Nur ein Reboot behebt das Problem.

Hier ein Auszug aus der Hauptschleife und der Callback-Funktion:

Code:


[...]

hWnd = CreateMainWindow(hInstance);
if (FALSE == DDrawInit(hWnd))
{
exit(0);
}

while (GetMessage(&msg, hWnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

if (FALSE == CleanUp())
{
MessageBox(hWnd, "Fehler beim Beenden der Verbindung zu DDraw", "Fehler...", MB_OK);
}
return 0;
}

LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}

BOOL CleanUp()
{
if (lpDDSPrimary != NULL) { lpDDSPrimary->Release(); }
else { return FALSE; }

if (lpDDClipper != NULL) { lpDDClipper->Release(); }
else { return FALSE; }

if (lpDD7 != NULL) { lpDD7->Release(); }
else { return FALSE; }

return TRUE;
}



Hat jemand eine Erklärung dafür.
Danke
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Salim
Mini JLI'ler



Anmeldedatum: 29.12.2002
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 20.01.2003, 19:24    Titel: hmmm... Antworten mit Zitat

Soso,
also gut. Schau erstmal nach ob die exe-Datei schreibgeschützt ist.
Irgendwie gefällt mir dein Programmierstil nicht. Aber das spielt ja jetzt keine große rolle. Wie wärs wenn du die Hauptschleife so ändern würdest:

Code:

while (GetMessage(&msg, [b]NULL[/b], 0, 0))
{
      TranslateMessage(&msg);
      DispatchMessage(&msg);
}


Ich würde dir noch empfehlen lieber PeekMessage zu benutzen, aber das ist ja auch egal.
Probiers mal. Sag mir dann obs geklappt hat. Interressiert mich.
_________________
A.Salim Doost
www.asdnet.de
Es gibt immer einen besseren Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
Compuholic
Mini JLI'ler



Anmeldedatum: 15.10.2002
Beiträge: 25

Medaillen: Keine

BeitragVerfasst am: 20.01.2003, 20:31    Titel: Antworten mit Zitat

So, ich denke ich habe den Fehler.

Jedenfalls kann ich wieder ohne Probleme kompilieren (so oft ich will Smile )
Das Programm führt die Befehle nach der Nachrichtenschleife nie aus. Ich vermute mal das über DefWindowProc() die Anwendung direkt nach PostQuitMessage() terminiert wird.

Ich habe auf jeden Fall mal die "Aufräum-Funktion" in die Behandlungsroutine für WM_DESTROY reingepackt und voilà alles funktioniert prima. Wahrscheinlich wurden die DirectDraw Objekt nicht richtig freigegeben, die dann offenbar den Fehler verursacht haben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 20.01.2003, 21:35    Titel: Antworten mit Zitat

Dein Beschriebenes Problem taucht immer dann auf, wenn eine Anwendung - wie du bereits richtig vermutet hast - nicht beendet wird. Die Ausfürhbare Datei ist dann nämlich schreibgeschützt und andere Prozesse (In dem Fall der Kompiler / Linker) können nicht auf die Exe zugreifen.
Das Performaceproblem solltest du aber auf jeden Fall noch lösen, egal, ob das Programm jetzt ordendlich beendet wird oder nicht.

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Compuholic
Mini JLI'ler



Anmeldedatum: 15.10.2002
Beiträge: 25

Medaillen: Keine

BeitragVerfasst am: 20.01.2003, 21:57    Titel: Antworten mit Zitat

Das Performance-Problem hat sich mit der Lösung des Problems in Wohlgefallen aufgelöst.
Keine Ahnung an was das lag. Vielleicht gab es irgendwo noch Konflikte mit den belegten Ressourcen. But: who cares... Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum