Entwickler-Ecke
Sonstiges (Delphi) - ExtractFileDir DOS Kompatibel
Grafix - Di 06.01.09 21:50
Titel: ExtractFileDir DOS Kompatibel
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 - Di 06.01.09 22:01
Schau dir mal diese Funktion an (GetShortPathName):
http://msdn.microsoft.com/en-us/library/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 - Di 06.01.09 22:30
<klugscheiss>Wenn schon, dann übrigens Progra~1. Program~1 geht schon über acht Zeichen hinaus.</klugscheiss> :mrgreen:
Grafix - Di 06.01.09 23:17
... danke =) funktioniert
Grafix - 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 - 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.
jaenicke - 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 - 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.
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: 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 - 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?
http://www.dosbox.com/download.php?main=1
Kannste ja mal durchschauen.. ich hatte früher mal D-Fend verwendet.
Grafix - 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 - Mi 07.01.09 01:26
Ich würde einmal sagen das liegt an den dämlichen globalen Variablen. :roll:
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. :gruebel:
// 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 - 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 - 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 - Mi 07.01.09 01:49
super danke, habt mir echt geholfen, super Forum!
(Thread kann jetzt geschlossen werden)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!