Autor Beitrag
Grafix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Di 06.01.09 22:30 
<klugscheiss>Wenn schon, dann übrigens Progra~1. Program~1 geht schon über acht Zeichen hinaus.</klugscheiss> :mrgreen:

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
Grafix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: Di 06.01.09 23:17 
... danke =) funktioniert
Grafix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: 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.

ausblenden volle Höhe 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
    { Private declarations }
  public
    { Public declarations }
  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; //Impressum aufrufen
end;

procedure TCommander_Keen.Label10Click(Sender: TObject);
begin
  Info.ShowModal; //Hilfefenster aufrufen
end;

procedure TCommander_Keen.schliessenClick(Sender: TObject);
begin
  close; // Programm schließen
end;

//Datei erzeugen
procedure schreibe_datei(Spiel, Version: string);
  var STRList : TStringList;
      Dateipfad_DOS: string;
      DpfPChar: PChar;
begin
  STRList := TStringList.create;


  //Win Dateiname
  Dateipfad := ExtractFileDir(Application.ExeName);
  Dateipfad := Dateipfad + '\';

  // Originale Conf-Datei umbennenen
  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');
  // Alte vom Programm geschriebene Conf-Datei löschen
  If FileExists(Dateipfad + 'DOSBox\dosbox.conf'then
    DeleteFile(Dateipfad + 'DOSBox\dosbox.conf');

  // Zuweisungen
  STRList.add('[sdl]');
  STRList.add('');

  //Vollbildschirm Option
  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]');

  //Stumm schalten
  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');

  //8+3 Dateiname
  GetShortPathName(PChar(Dateipfad), DpfPChar, MAX_PATH + 1);
  Dateipfad_DOS := DpfPChar;

  STRList.add('mount c ' + Dateipfad_DOS + '\' + Version + '\');
  STRList.add('c:');
  STRList.add(Spiel + '.exe');

  // Speichern
  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, nilnil, SW_NORMAL);
end;

// Programme starten

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;

// Map-Verzeichnisse öffnen

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
Dateipfad := ExtractFilePath(ParamStr(0));					
So ist auch der Backslash \ bereits am Ende dabei. ;-)
Grafix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: 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...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TCommander_Keen.FormActivate(Sender: TObject);
begin
  //Win Dateiname
  Dateipfad := ExtractFileDir(Application.ExeName);
  Dateipfad := Dateipfad + '\';
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Windows 7 Professional
Delphi 2009, PHP, Prolog, Python, Java
BeitragVerfasst: Mi 07.01.09 01:49 
super danke, habt mir echt geholfen, super Forum!

(Thread kann jetzt geschlossen werden)