AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Wie Parameter für IDE-Tools festlegen?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Parameter für IDE-Tools festlegen?

Ein Thema von himitsu · begonnen am 28. Mai 2010 · letzter Beitrag vom 30. Mai 2010
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#11

Re: Wie Parameter für IDE-Tools festlegen?

  Alt 30. Mai 2010, 13:02
Aktuell hab ich also nur eine Lösung gefunden.
(die Makros der IDE-Tools sind wirklich vollkommen schrottig und obwol sich schon was, seit Delphi 2009/2010 geändert hat, ist es insgesamt unzumutbar und mich wundert es, daß sich da nur so Wenige beschwert haben)

* Zuerst sind vor Delphi 2009/2010 keinen kombinierten Parameter ala "abc=$PROJECT" möglich.

* Und man muß die Parameter selber parsen, denn ohne die " würde ein Parameter ja eventuell als mehrere Parameter erkannt (z.B. bei enthaltenen Leerzeichen).

Problem dabei ist, daß man praktisch nur einen Parameter von der IDE aus übergeben kann,
oder man muß mit der Reihenfolge aufpassen.
- zuerst alle Parameter, welche von der IDE aus korrekt übergeben werden und danach ist nur noch ein Parameter möglich (wobei man hier notfalls mit einem Trennzeichen/Trennwort arbeiten könnte)


Eie einfache Möglichkeit den fehlerhaften $PROJECT auszulesen, wäre
(wobei man nun bei allen möglichen Lösungen von einem festen Format ausgehen muß, um es entsprechend poarsen zu können)
Delphi-Quellcode:
// Parameter = "$PROJECT"

Var TheProject: String;
  i: Integer;

TheProject := ParamStr(1);
For i := 2 to ParamCount do
  TheProject := TheProject + ' ' + ParamStr(i);
ShowMessage(TheProject);
Ein Problem hierbei bilden Datei-/Pfadnamen mit mehrfachen zusamenhängenden Leerzeichen, denn diese wurden beim Parsen in ParamStr entfernt und hier nur durch ein ' ' ersetzt.

Wenn zusätzlich noch andere Parameter nötig wären, dann
Delphi-Quellcode:
// Parameter = "$CURTOKEN $PROJECT"

Var TheProject: String;
  i: Integer;

TheCurrentToken := ParamStr(1);
TheProject := ParamStr(2);
For i := 3 to ParamCount do
  TheProject := TheProject + ' ' + ParamStr(i);
ShowMessage(TheProject);
Die Lösung des Leerzeichenproblems wäre also Selberparsen:
Delphi-Quellcode:
Var TheProject: String;
  B: Boolean;
  i: Integer;

TheProject := GetCommandLine;
i := 1;
B := False;
While (i <= Length(TheProject)) and ((TheProject[i] > ' ') or B) do Begin
  If TheProject[i] = '"Then B := not B;
  Inc(i);
End;
TheProject := Trim(Copy(TheProject, i, Length(TheProject) - i + 1));
If (TheProject <> '') and (TheProject[1] = '"') Then Begin
  Delete(TheProject, 1, 1);
  If (TheProject <> '') and (TheProject[Length(TheProject)] = '"') Then
    Delete(TheProject, Length(TheProject), 1);
End;
ShowMessage(TheProject);


Nun, in meinem Fall wollte ich aber nicht die Parameterbehandlung im eigenem Programm verändern und hab mir somit ein Hilfsprogramm erstellt, welches den Parameter parst, anpaßt und an die eigentlich Anwendung weitergibt.


Delphi-Quellcode:
Var TheProject, TheApplication, TheParameter, TheWorkingDirectory: String;
  B: Boolean;
  i: Integer;

TheProject := GetCommandLine;
i := 1;
B := False;
While (i <= Length(TheProject)) and ((TheProject[i] > ' ') or B) do Begin
  If TheProject[i] = '"Then B := not B;
  Inc(i);
End;
TheProject := Trim(Copy(TheProject, i, Length(TheProject) - i + 1));
If (TheProject <> '') and (TheProject[1] = '"') Then Begin
  Delete(TheProject, 1, 1);
  If (TheProject <> '') and (TheProject[Length(TheProject)] = '"') Then
    Delete(TheProject, Length(TheProject), 1);
End;

TheApplication := ExctractFilePath(ParamStr(0)) + 'TheApplication.exe';
TheParameter := 'IniFile="' + TheProject + '" CreateIni=yes';
TheWorkingDirectory := GetDir(0);

If Integer(ShellExecute(0, nil, PChar(TheApplication), PChar(TheParameter),
    PChar(TheWorkingDirectory), SW_NORMAL)) <= 32 Then
  RaiseLastOSError;
Auf's Nötigste gekürzt kam letztendlich Folgendes raus, welches dann zusammen mit Delphi 7 eine kleine 15,5 KB-Datei ergab (mit UPX 9 KB), welche ich direkt innerhalb die Zielanwendung ausliefere.
(gut, daß ich so "faul" war und diese kleine App als String und nicht über Resource eingebunden hab, sei mal dahingestellt)
Delphi-Quellcode:
Program IDEForward;

Uses Windows, ShellAPI;

Var Mb, Pb, Db: Array[1..1024] of WideChar;
  M, P, D, P2: PWideChar;
  B: Boolean;

Begin
  M := @Mb;
  GetModuleFileNameW(0, M, Length(Mb));
  P2 := M + lstrlenW(M) - 1;
  While P2^ <> '\do Dec(P2);
  lstrcpyW(P2 + 1, 'ManifestCreator.exe');

  P := PWideChar(@Pb) + 10;
  lstrcpyW(P, GetCommandLineW);
  B := False;
  While (P^ > ' ') or B do Begin
    If P^ = '"Then B := not B;
    Inc(P);
  End;
  While (P^ > #0) and (P^ <= ' ') do Inc(P);
  P2 := P;
  While P2^ <> #0 do Inc(P2);
  While (P2 > P) and ((P2 - 1)^ <= ' ') do Dec(P2);
  If P^ = '"Then Begin
    Inc(P);
    If (P2 > P) and (P2^ = '"') Then Dec(P2);
  End;
  Dec(P);
  lstrcpyW(P - 8, 'IniFile=');
  P^ := '"';
  Dec(P, 8);
  lstrcpyW(P2, '" CreateIni=yes');

  D := @Db;
  GetCurrentDirectoryW(Length(Db), D);

  If Integer(ShellExecuteW(0, nil, M, P, D, SW_NORMAL)) > 32 Then
    Halt(1) Else Halt(0);
End.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz