| 
| Autor | Beitrag |  
| Grafix 
          Beiträge: 122
 
 Windows 7 Professional
 Delphi 2009, PHP, Prolog, Python, Java
 
 | 
Verfasst: Di 06.01.09 20: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Di 06.01.09 21: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 21: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 22:17 
 
... danke =) funktioniert |  |  |  
| Grafix  
          Beiträge: 122
 
 Windows 7 Professional
 Delphi 2009, PHP, Prolog, Python, Java
 
 | 
Verfasst: Di 06.01.09 22: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: Di 06.01.09 23: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Di 06.01.09 23: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: Di 06.01.09 23: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 00: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 00: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Mi 07.01.09 00: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 00: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Mi 07.01.09 00: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 00:49 
 
super danke, habt mir echt geholfen, super Forum!
 (Thread kann jetzt geschlossen werden)
 |  |  |  |