Autor |
Beitrag |
Felas
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 20.09.10 17:10
Ich programmiere zur Zeit einen Launcher für ein Game. Der ist auch soweit fertig, nur ist mir aufgefallen, dass ich kein Programm öffnen kann, das unter C:\Programme\... liegt. Hängt vermutlich mit C:\Programme und C:\Program Files zusammen. Ich schick nochmal nen Code Ausschnitt hinterher:
Delphi-Quelltext 1: 2:
| SelectDirectory('Bitte den Pfad des AionEU Ordners wählen.', '', Dir); dir := dir + '\bin32\aion.bin'; |
Im späteren Verlauf des Programmes kommen wir dann zu folgender Stelle:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| begin dirstart := dir + ' -ip:85.214.64.211 -ng -port:2107 -cc:2 -lang:deu -noweb -noauthgg'; if dirstart = ' -ip:85.214.64.211 -ng -port:2107 -cc:2 -lang:deu -noweb -noauthgg' then begin MessageDlg('Du musst erst einen Aion Pfad setzen!', mtInformation, [mbOK], 0); end
else begin startdir := PChar(dir); if FileExists('C:\Windows\Aionstart.bat') then begin ShellExecute(Handle, nil, 'C:\Windows\Aionstart.bat', nil, nil, SW_Normal); form1.Close; end
else begin startbat := TStringlist.Create; startbat.add('@start ' + dirstart); startbat.SaveToFile('C:\Windows\Aionstart.bat'); ShellExecute(Handle, nil, 'C:\Windows\Aionstart.bat', nil, nil, SW_Normal); form1.Close; end; end; end; |
Also im Prinzip soll also ein Pfad ausgelesen werden, dann soll eine Textdatei mit dem Pfad als Inhalt unter C:\Windows geschrieben werden, und beim starten wird dann eine batch geschrieben (starten via shellexecute funktioniert iwie nicht), die dann gestartet wird und das Game ausführt.
Wie gesagt ich habe gerade das Problem mit dem C:\Program Files und C:\Programme.
Wäre für Hilfe sehr dankbar.
Liebe Grüße!
Moderiert von Narses: Code- durch Delphi-Tags ersetztModeriert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 20.09.2010 um 23:07
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 20.09.10 19:10
Was hat eine Datei von deinem Programm unter c:\windows zu suchen? Da hast du keine Schreibrechte, weil es Schwachsinn ist (normalerweise) da etwas hinzuschreiben, also gehts nicht. Da etwas hinzuschreiben ist schon seit 15 Jahren extrem schlechter Stil.
Zudem hast du vergessen, dass dieser Pfad bei jedem anders heißen kann. c:\windows ist es nur zufällig bei dir.
Dateien deiner Anwendung gehören z.B. in die Anwendungsdaten.
www.delphi-library.d...ewtopic.php?p=548600
Beim (lesenden) Zugriff auf den Programmeordner gibt es nur dann Probleme, wenn du Windows 64-Bit hast. Denn dann werden Zugriffe von 32-Bit Programmen auf "Program Files (x86)" umgeleitet.
|
|
Felas 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 20.09.10 19:42
Okay, tut mir leid ich programmiere nunmal erst seit ein paar Tagen mit delphi. Werde ich Ändern.
Und jetzt zum Problem:
Wenn das also nur auf 64-Bit Computern nicht gescheit funktioniert, brauche ich ja trotzdem ne Methode, wie ich auf den/die Ordner zugreifen kann.
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 20.09.10 20:02
Das kommt darauf an:
Wenn das Programm, auf dessen Verzeichnis du zugreifen willst, ein 64-Bit Programm ist, dann liegt es vermutlich unter "c:\program files". In dem Fall wird der Zugriff deines (32-Bit, da Delphi  ) Programms auf das falsche Verzeichnis (nämlich dem für 32-Bit Programme "c:\program files (x86)") umgeleitet.
Dann gibt es verschiedene Möglichkeiten:
Du kannst die Ordnervirtualisierung ausschalten, das geht AFAIK z.B. per Manifest oder via Wow64DisableWow64FsRedirection.
Wenn du aber ohnehin nur mit der Batchdatei auf das Verzeichnis zugreifen willst, ist das egal. Denn bei deren Aufruf via cmd.exe sollte keine Umleitung stattfinden (auch wenn ich es nie getestet habe).
Die Frage ist aber vor allem:
Was passiert denn eigentlich (nicht)? Ich konnte ja nun nur allgemeine Hinweise geben, zum Problem selbst konnte ich nichts schreiben. Denn du hast ja nicht geschrieben was das Problem ist... 
|
|
Felas 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 20.09.10 22:04
'Tschuldigung... vergessen  Also wenn bei jemandem das Programm im Programme Ordner unter z.B. C:\Programme\NCSoft\AionEU liegt, dann gibt die selectdirectory Funktion ja auch das "Programme" zurück. Wird das Programm allerdings hinterher via batch gestartet (und ich habe immernoch keine ahnung warum shellexecute nicht geht), dann kommt eine Fehlermeldung in der Art "Pfad konnte nicht gefunden werden".
Im Großen und Ganzen ist das natürlich mist, wenn man ein Programm nicht unter C:\Programme speichern darf, da das Programm den Pfad sonst nicht erkenns :S
Habe mir jedenfalls jetzt erstmal deinen 1. Tipp mit den Anwendungsdaten angeschaut, werde ich jetzt noch eben einbauen.
*edit*
sorry das ich doof frage aber was muss ich denn da genau in den "uses" teil noch einbinden?
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 21.09.10 05:35
Hast du denn einmal überprüft was in der Batchdatei steht? Außerdem kannst du da ein pause dazuschreiben, damit du die Fehlermeldung länger bewundern kannst.
Was hat denn ShellExecute für einen Fehlercode zurückgegeben?
Zur uses: Delphi-Quelltext 1: 2:
| uses ActiveX, ShlObj; |
|
|
Felas 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 21.09.10 07:09
Shellexecute hat gar keinen Fehler zurückgegeben. Das Programm hat insgesamt alles gemacht, was es machen sollte, hat nur das Programm nicht gestartet. Erst habe ich gedacht, das liegt daran, dass das eine *.bin Datei ist, die gestartet werden soll, und habe dem Computer gesagt, er soll sie vorher zu *.exe umbenennen und dann starten. Leider auch Fehlanzeige!
Und wenn das Problem mit der Pfadangabe auftaucht, dann bekomme ich ne schöne MsgBox. Soll ich dir einfach mal das Projekt schicken? Vielleicht kannst du damit mehr anfangen als nur mit Code Schnipseln. Klickst du hier.
Das Ding ist nur halb fertig verschickt also nicht wundern. Bei mir erkennt der GetSpecialFolder nicht. Dazu muss ich doch noch was in der shlopj.pas einfügen, richtig? Wenn ja bin ich zu doof dazu. Ich stehe also wie bereits gesagt noch ganz am Anfang und kann kaum Delphi, aber das Grundgerüst hab ich ja eigentlich schon hinbekommen. (Auch wenns nicht weiter schwierig war  )
*edit*
Habe nochmal ein wenig rumprobiert und jetzt bekomme ich eine eindeutigere Fehlermeldung. Du hast schon recht, dass der Computer bei der Eingabe von "Programme" auf "Program Files" verweist, nur leider kommt er mit seinem selbst erzeugten Leerzeichen nicht klar. Denn wenn ich ins CMD eintippe "@start C:\Program Files\" dann sagt der mir schon gar nicht mehr "Datei konnte nicht gefunden werden", sondern "C:\Program" konnte nicht gefunden werden.
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 21.09.10 08:08
Das heißt es gibt einen Fehlercode >= 32 zurück?
Und beim CMD hast du die Anführungszeichen vergessen.
Mehr heute Abend nach der Arbeit...
|
|
Felas 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 21.09.10 15:47
So also das eigentliche Problem habe ich jetzt beseitigt. Funktioniert alles prima jetzt. ABer du kannst mir das mit AppData nochmal genauer erklären  Hat mein Interesse jetzt geweckt. DA ich leider wie gesagt erst seit ein paar Tagen mit Delphi programmiere, habe ich keine Ahunung wie genau ich mir das einrichte.
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 21.09.10 16:47
Hast du dir denn die Demo angeschaut? So viel Quelltext ist das ja nicht. 
|
|
Felas 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 22.09.10 07:23
Hab nochmal ein bisschen gesucht und bin auch fündig geworden ^^.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function GetSpecialFolderPath(CallerHandle: THandle; CSIDL: Integer): String; //Der Typ der Variable, die zurückgegeben wird kann noch verändert werden. var exinfo: TShellexecuteinfo; Buf: PChar;
begin FillChar(exinfo, SizeOf(exinfo), 0); with exinfo do begin cbSize := SizeOf(exinfo); fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_IDLIST; Wnd := CallerHandle; nShow := SW_SHOWNORMAL; Buf := StrAlloc(MAX_PATH); SHGetSpecialFolderPath(wnd, Buf, CSIDL, True); Result := Buf; end; end; |
Das hier um die Funktion zu schreiben, und
Quelltext 1:
| deinevariable := GetSpecialFolderPath(0, 28); |
um sie aufzurufen. Dabei steht die "28" im Aufruf für das AppData Folder. Die Zahlen kann man in der shlobj.pas nachschauen, die stehen dort jedoch als HEX Werte eingetragen, aber ein einfaches durch den Taschenrechner jagen reicht da schon aus.
Jetzt funktioniert also endlich alles, nochmal vielen Dank für deine Hilfe!
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 22.09.10 08:20
Wenn du in die Demo geschaut hättest oder in dem verlinkten Beitrag den Link angeklickt hättest, wärst du hier gelandet:
www.delphi-library.de/viewtopic.php?t=9428
Da steht eine Funktion, die den Pfad ermittelt, usw., und auch ohne diesen "magischen" Wert 28. Das geht über eine Konstante viel besser...
|
|
Felas 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 22.09.10 14:09
Jaja...
ich steh aber schon wieder im Wald und seh die Bäume nicht -.-. Gibt es eine Möglichkeit einen in einer String Variable gespeicherten Pfad "aufzuspalten", sodass aus "C:\Program Files (x86)\NC" - "C:" und "\Program Files (x86)\NC" wird?
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 22.09.10 16:45
Neue Frage, neuer Thread...
Aber schau dir mal ProcessPath aus der Unit FileCtrl an...
|
|
|