Autor |
Beitrag |
Grafix
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: Di 06.01.09 21:50
Hey,
wie kann ich den Dateipfad meiner exe Datei auslesen und diesen dos-kompatibel machen? (z.B. so C:\Program~1\...)
Ist das möglich?
Danke für eure Hilfe
MfG
Grafix
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 06.01.09 22:01
Schau dir mal diese Funktion an (GetShortPathName):
msdn.microsoft.com/e...aa364989(VS.85).aspx
Wichtig:
Nicht auf allen Systemen gibt es die alten Dateinamen noch! Bei mir z.B. habe ich die zusätzliche Speicherung dieser kurzen Namen deaktiviert, es gibt die bei mir nicht mehr.
Und die Kommandozeile von Windows unterstützt ja auch die langen Dateinamen. Dort brauchst du die alten 8.3 Dateinamen also gar nicht.
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: Di 06.01.09 22:30
<klugscheiss>Wenn schon, dann übrigens Progra~1. Program~1 geht schon über acht Zeichen hinaus.</klugscheiss> 
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
Grafix 
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: Di 06.01.09 23:17
... danke =) funktioniert
|
|
Grafix 
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: Di 06.01.09 23:49
Noch eine Frage... es funktioniert ja jetzt soweit. Allerdings gibt es noch ein Problem: Ich erzeuge mit dem Code eine Datei, die ich dann ausführen möchte. Beim ersten Aufruf, zeigt er mir eine Access Violation an und eine Invalid Pointer Operation... Ich hab alles versucht und komme nicht weiter... Der Code hat 336 Zeilen... Könnte von euch mal einer drüber schauen? Kann ich den Code hier posten? Danke!
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 07.01.09 00:25
Wenn die Access Violation auftritt, wird dir doch angezeigt, in welcher Zeile.
Zumindest sollte Delphi dann zu dieser Zeile hin springen.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 07.01.09 00:29
Solange du den Code mit Delphi-Tags postest, kannst du den ruhig posten, soo viele Zeilen sind das ja nicht. Besser wäre natürlich, wenn du den Fehler vorher genauer lokalisieren würdest. 
|
|
Grafix 
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: Mi 07.01.09 00:38
mhm nein er lokalisiert es nicht oO
hier mein Code, kurze Programmerkläreung: Ich möchte Commander Keen unter Vista spielen können mittels Dosbox. Mit diesem Program manipuliere ich die Dosbox.conf und mounte so direkt das Spiel.
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: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellApi, ExtCtrls;
type TCommander_Keen = class(TForm) Label1: TLabel; schliessen: TButton; start_keen_1: TButton; Label2: TLabel; start_keen_2: TButton; start_keen_3: TButton; start_keen_4: TButton; start_keen_5: TButton; start_keen_6: TButton; start_keen_x: TButton; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; BKarte_K1: TButton; BKarte_K2: TButton; BKarte_K3: TButton; BKarte_K4: TButton; BKarte_K5: TButton; BKarte_K6: TButton; BKarte_KX: TButton; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; GroupBox1: TGroupBox; DB_aktivieren: TCheckBox; Vollbildmodus: TCheckBox; LVollbildmodus: TLabel; Stumm: TCheckBox; procedure schliessenClick(Sender: TObject); procedure start_keen_4Click(Sender: TObject); procedure Label9Click(Sender: TObject); procedure start_keen_3Click(Sender: TObject); procedure BKarte_K4Click(Sender: TObject); procedure BKarte_K1Click(Sender: TObject); procedure BKarte_K2Click(Sender: TObject); procedure BKarte_K3Click(Sender: TObject); procedure BKarte_K5Click(Sender: TObject); procedure BKarte_K6Click(Sender: TObject); procedure BKarte_KXClick(Sender: TObject); procedure Label10Click(Sender: TObject); procedure start_keen_1Click(Sender: TObject); procedure start_keen_6Click(Sender: TObject); procedure start_keen_xClick(Sender: TObject); procedure start_keen_2Click(Sender: TObject); procedure start_keen_5Click(Sender: TObject); procedure VollbildmodusClick(Sender: TObject); private public end;
var Commander_Keen: TCommander_Keen; Version, Spiel, Dateipfad: string;
implementation
uses Unit2, Unit3;
{$R *.dfm}
procedure TCommander_Keen.Label9Click(Sender: TObject); begin Impressum.ShowModal; end;
procedure TCommander_Keen.Label10Click(Sender: TObject); begin Info.ShowModal; end;
procedure TCommander_Keen.schliessenClick(Sender: TObject); begin close; end;
procedure schreibe_datei(Spiel, Version: string); var STRList : TStringList; Dateipfad_DOS: string; DpfPChar: PChar; begin STRList := TStringList.create;
Dateipfad := ExtractFileDir(Application.ExeName); Dateipfad := Dateipfad + '\';
If FileExists(Dateipfad + 'DOSBox\dosbox.conf') AND NOT FileExists(Dateipfad + 'DOSBox\dosbox_original.conf') then RenameFile(Dateipfad + 'DOSBox\dosbox.conf', Dateipfad + 'DOSBox\dosbox_original.conf'); If FileExists(Dateipfad + 'DOSBox\dosbox.conf') then DeleteFile(Dateipfad + 'DOSBox\dosbox.conf');
STRList.add('[sdl]'); STRList.add('');
If Commander_Keen.Vollbildmodus.Checked = true then STRList.add('fullscreen=true') else STRList.add('fullscreen=false');
STRList.add('fulldouble=false'); STRList.add('fullresolution=original'); STRList.add('windowresolution=original'); STRList.add('output=surface'); STRList.add('autolock=true'); STRList.add('sensitivity=100'); STRList.add('waitonerror=true'); STRList.add('priority=higher,normal'); STRList.add('mapperfile=mapper.txt'); STRList.add('usescancodes=true'); STRList.add(''); STRList.add('[dosbox]'); STRList.add('language='); STRList.add('machine=vga'); STRList.add('captures=capture'); STRList.add('memsize=16'); STRList.add(''); STRList.add('[render]'); STRList.add('frameskip=0'); STRList.add('aspect=false'); STRList.add('scaler=normal2x'); STRList.add(''); STRList.add('[cpu]'); STRList.add('core=auto'); STRList.add('cycles=auto'); STRList.add('cycleup=500'); STRList.add('cycledown=20'); STRList.add(''); STRList.add('[mixer]');
If Commander_Keen.Stumm.Checked = True then STRList.add('nosound=true') else STRList.add('nosound=false');
STRList.add('rate=22050'); STRList.add('blocksize=2048'); STRList.add('prebuffer=10'); STRList.add(''); STRList.add('[midi]'); STRList.add('mpu401=intelligent'); STRList.add('device=default'); STRList.add('config='); STRList.add(''); STRList.add('[sblaster]'); STRList.add('sbtype=sb16'); STRList.add('sbbase=220'); STRList.add('irq=7'); STRList.add('dma=1'); STRList.add('hdma=5'); STRList.add('mixer=true'); STRList.add('oplmode=auto'); STRList.add('oplrate=22050'); STRList.add(''); STRList.add('[gus]'); STRList.add('gus=true'); STRList.add('gusrate=22050'); STRList.add('gusbase=240'); STRList.add('irq1=5'); STRList.add('irq2=5'); STRList.add('dma1=3'); STRList.add('dma2=3'); STRList.add('ultradir=C:\ULTRASND'); STRList.add(''); STRList.add('[speaker]'); STRList.add('pcspeaker=true'); STRList.add('pcrate=22050'); STRList.add('tandy=auto'); STRList.add('tandyrate=22050'); STRList.add('disney=true'); STRList.add(''); STRList.add('[joystick]'); STRList.add('joysticktype=auto'); STRList.add('timed=true'); STRList.add('autofire=false'); STRList.add('swap34=false'); STRList.add('buttonwrap=true'); STRList.add(''); STRList.add('[serial]'); STRList.add('serial1=dummy'); STRList.add('serial2=dummy'); STRList.add('serial3=disabled'); STRList.add('serial4=disabled'); STRList.add(''); STRList.add('[dos]'); STRList.add('xms=true'); STRList.add('ems=true'); STRList.add('umb=true'); STRList.add('keyboardlayout=none'); STRList.add(''); STRList.add('[ipx]'); STRList.add('ipx=false'); STRList.add(''); STRList.add('[autoexec]'); STRList.add('keyb gr');
GetShortPathName(PChar(Dateipfad), DpfPChar, MAX_PATH + 1); Dateipfad_DOS := DpfPChar;
STRList.add('mount c ' + Dateipfad_DOS + '\' + Version + '\'); STRList.add('c:'); STRList.add(Spiel + '.exe');
STRList.SaveToFile(Dateipfad + 'DOSBox\dosbox.conf'); end;
procedure Programm_starten(Spiel, Version: string); var PCharPfad: pchar; Pfad: string; begin Pfad:= Dateipfad + Version + '\' + Spiel; PCharPfad:= PChar(Pfad); If Commander_Keen.DB_aktivieren.Checked = true then begin schreibe_datei(Spiel, Version); ShellExecute(Application.Handle, PChar('open'), PChar(Dateipfad + 'DOSBox\dosbox.exe'), PChar(''), PChar(Dateipfad + 'DOSBox\'), SW_SHOW); end else ShellExecute(0, 'open', PCharPfad, nil, nil, SW_NORMAL); end;
procedure TCommander_Keen.start_keen_1Click(Sender: TObject); begin Programm_starten('keen1e.exe','1'); end;
procedure TCommander_Keen.start_keen_2Click(Sender: TObject); begin Programm_starten('keen2.exe','2'); end;
procedure TCommander_Keen.start_keen_3Click(Sender: TObject); begin Programm_starten('keen3.exe','3'); end;
procedure TCommander_Keen.start_keen_xClick(Sender: TObject); begin Programm_starten('start.exe','7'); end;
procedure TCommander_Keen.start_keen_4Click(Sender: TObject); begin Programm_starten('keen4e.exe','4'); end;
procedure TCommander_Keen.start_keen_5Click(Sender: TObject); begin Programm_starten('keen5e.exe','5'); end;
procedure TCommander_Keen.start_keen_6Click(Sender: TObject); begin Programm_starten('keen.com','6'); end;
procedure Verzeichnis_oeffnen(Version: string); begin ShellExecute(Application.Handle, PChar('open'), PChar(Dateipfad + Version + '\Maps'), PChar(''), PChar(Dateipfad + Version + '\Maps'), SW_SHOW); end;
procedure TCommander_Keen.BKarte_K1Click(Sender: TObject); begin Verzeichnis_oeffnen('1'); end;
procedure TCommander_Keen.BKarte_K2Click(Sender: TObject); begin Verzeichnis_oeffnen('2'); end;
procedure TCommander_Keen.BKarte_K3Click(Sender: TObject); begin Verzeichnis_oeffnen('3'); end;
procedure TCommander_Keen.BKarte_K4Click(Sender: TObject); begin Verzeichnis_oeffnen('4'); end;
procedure TCommander_Keen.BKarte_K5Click(Sender: TObject); begin Verzeichnis_oeffnen('5'); end;
procedure TCommander_Keen.BKarte_K6Click(Sender: TObject); begin Verzeichnis_oeffnen('6'); end;
procedure TCommander_Keen.BKarte_KXClick(Sender: TObject); begin Verzeichnis_oeffnen('7'); end;
procedure TCommander_Keen.VollbildmodusClick(Sender: TObject); begin If Vollbildmodus.checked = true then LVollbildmodus.Visible := true;
If Vollbildmodus.checked = false then LVollbildmodus.Visible := false; end;
end. |
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 07.01.09 01:00
Bei welchem Buttonclick tritt der Fehler auf?
Setz doch erstmal nen Haltepunkt, und geh den Code zeilenweise durch, dann siehst du doch, wann der Fehler auftritt.
Aber, wäre es nicht einfacher, ein Frontend für Dosbox zu verwenden, wo man für jedes Spiel individuelle Profile anlegen kann?
www.dosbox.com/download.php?main=1
Kannste ja mal durchschauen.. ich hatte früher mal D-Fend verwendet.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Grafix 
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: Mi 07.01.09 01:20
der Fehler tritt bei jedem buttonklick auf, mit dem man die Spiele aufruft, die maps lassen sich gar nicht aufrufen, erst nach der Fehlermeldung...
Frontend.... wahhh dass wusste ich nicht... aber jetzt bin ich ja schon fast fertig, muss doch gehen...
DANKE für eure hilfe!
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 07.01.09 01:26
Ich würde einmal sagen das liegt an den dämlichen globalen Variablen.
Dateipfad wird nur in schreibe_datei zugewiesen. Dies passiert aber nur in Programm_starten, wenn eine CheckBox aktiviert ist...
In Verzeichnis_oeffnen und wenn die CheckBox nicht aktiviert ist, dann benutzt du die Variable einfach. Diese hat aber vorher keinen Wert zugewiesen bekommen.
Programmiere das sauber ohne die globalen Variablen bzw. achte darauf, wann du die benutzt und wann die einen Wert zugewiesen bekommen, dann passiert das auch nicht. Beim Debuggen hätte dir das doch aber auffallen müssen, dass die Variable leer ist.
// EDIT:
Weise Dateipfad doch einfach beim Programmstart in FormCreate zu. Und du kannst das auch so machen: Delphi-Quelltext 1:
| Dateipfad := ExtractFilePath(ParamStr(0)); | So ist auch der Backslash \ bereits am Ende dabei. 
|
|
Grafix 
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: Mi 07.01.09 01:35
WOW, ganz genau das war der Fehler, hätte drauf kommen müssen! Danke für eure schnelle Hilfe. Dass die Variable Dateipfad nicht belegt war lag daran dass sie in Prozeduren deklariert wurde, und nicht am Anfang generell. Habs jetzt ins Form.Activate geschrieben, ist das legitim? Funktioniert auf jeden Fall...
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TCommander_Keen.FormActivate(Sender: TObject); begin Dateipfad := ExtractFileDir(Application.ExeName); Dateipfad := Dateipfad + '\'; end; |
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 07.01.09 01:47
FormActivate wird ggf. öfter aufgerufen, deshalb ist FormCreate das richtige. Das wird genau einmal aufgerufen wenn das Formular erstellt wird. 
|
|
Grafix 
      
Beiträge: 122
Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
|
Verfasst: Mi 07.01.09 01:49
super danke, habt mir echt geholfen, super Forum!
(Thread kann jetzt geschlossen werden)
|
|
|