Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Exception-Fehler schließt Konsole.


bf109g.01 - Do 16.02.12 18:49
Titel: Exception-Fehler schließt Konsole.
Hallo, baue gerade eine Konsolenanwendung. Diese schließt sich sofort, nachdem ich die folgende function aufgerufen habe...


Delphi-Quelltext
1:
2:
3:
4:
function PfadAendern: string;
begin
  SelectDirectory('Verzeichnis wählen.''Arbeitsplatz', Result);
end;

Als Result kommt nur "". Ein Dialog zum Auswählen eines Verzeichnisses erscheint nicht.
Kann mir jemand sagen warum?


jaenicke - Do 16.02.12 18:54

Was steht denn nach dem Beenden des Programms in der Konsole? Du schreibst etwas von Exception, was steht denn da?

Bei mir funktioniert das jedenfalls problemlos so. Wie sieht denn der weitere Code aus? Was passiert beim Debuggen? ...

Nebenbei:
Einen Dialog in einer Konsolenanwendung? Bist du sicher, dass die Idee gut ist? :gruebel:


Tranx - Do 16.02.12 19:08

Ich gehe auch nicht davon aus, dass auf der Konsolenebene fensterorientierte Dialoge möglich sind, da diese ja sich innerhalb der Windows-Ebene bewegen. Während die Konsole eine reine Text-Ebene ist, als Überbleibsel des alten MS-DOS. Oder liege ich da verkehrt?


bf109g.01 - Do 16.02.12 20:10

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Was steht denn nach dem Beenden des Programms in der Konsole? Du schreibst etwas von Exception, was steht denn da?
Die kann ich nicht lesen. Sie blitzt nur kurz auf, bevor das Fenster schließt. Da ReadLN nicht ausgeführt wird, bleibt das Fenster auch nicht erhalten.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Einen Dialog in einer Konsolenanwendung? Bist du sicher, dass die Idee gut ist? :gruebel:
Berechtigte Frage, denn die eingebundenen Elemente der Uses-Liste blähen das ganze derart auf, dass es fast schon wieder unsinnig ist... Ich mag die Konsole einfach...

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie sieht denn der weitere Code aus?


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:
program Copy;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows, Dialogs,
  FileCtrl, ActiveX, ShlObj, ComObj;

const
  CSIDL_STARTUP = $0007;
  
// Zielverzeichnis auswählen
function PfadAendern: string;
begin
  SelectDirectory('Verzeichnis wählen, in welches kopiert werden soll.''Arbeitsplatz', Result);
end;

// Verknüpfung erstellen
function CreateLink(const AFilename, ALNKFilename, ADescription: string) : Boolean;
var
  psl : IShellLink;
  ppf : IPersistFile;
  wsz : PWideChar;
begin
  result:=false;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil,
  CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then
  begin
    psl.SetPath(PChar(AFilename));
    psl.SetDescription(PChar(ADescription));
    psl.SetWorkingDirectory(PChar(ExtractFilePath(AFilename)));
    if SUCCEEDED(psl.QueryInterface(IPersistFile, ppf)) then
    begin
      GetMem(wsz, MAX_PATH*2);
      try
        MultiByteToWideChar(CP_ACP, 0, PChar(ALNKFilename), -1, wsz, MAX_PATH);
        ppf.Save(wsz, true);
        result:=true;
      finally
        FreeMem(wsz, MAX_PATH*2);
      end;
    end;
  end;
end;

// Systemordner herausfinden (Systemunabhängig)
function GetShellFolder(CSIDL: integer): string;
var
  pidl : PItemIdList;
  FolderPath : string;
  SystemFolder : Integer;
  Malloc : IMalloc;
begin
  Malloc := nil;
  FolderPath := '';
  SHGetMalloc(Malloc);
  if Malloc = nil then
  begin
    Result := FolderPath;
    Exit;
  end;
  try
    SystemFolder := CSIDL;
    if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then
    begin
      SetLength(FolderPath, max_path);
      if SHGetPathFromIDList(pidl, PChar(FolderPath)) then
      begin
        SetLength(FolderPath, length(PChar(FolderPath)));
      end;
    end;
    Result := FolderPath;
  finally
    Malloc.Free(pidl);
  end;
end;

procedure mach(Pname:string);
var PathCreate: string;
begin
  // Ordner erstellen
  Pathcreate:=PfadAendern+'\'+PName; // <<<<<<<<<<<<<< hier kackt es ab. Alles darunter passiert nicht mehr.

  CreateDirectory(PChar(PathCreate),nil);

  WriteLN('Directory created:');WriteLN(Pathcreate);

  // Link erstellen
  CreateLink(Pathcreate+'\'+PName+'.exe',// Ziel
                GetShellFolder($0007)+'\'+Pname+'.exe.lnk',// Speicherort der verknüpfung
                'Testverknüpfung'); // Verknüpfungs Beschreibung

  // Autostart Ordner
  WriteLN(GetShellFolder($0007));

end;


begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }
  mach('Test');
  write('test');

  ReadLN;
end.

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Ich gehe auch nicht davon aus, dass auf der Konsolenebene fensterorientierte Dialoge möglich sind,
Es geht wunderbar, weil von mir mehrfach so verwendet. Man muss nur die uses-Liste etwas dehnen.


jaenicke - Do 16.02.12 20:23

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
Die kann ich nicht lesen. Sie blitzt nur kurz auf, bevor das Fenster schließt. Da ReadLN nicht ausgeführt wird, bleibt das Fenster auch nicht erhalten.
[..]
Ich mag die Konsole einfach...
Dann solltest du dich vielleicht auch ein wenig damit beschäftigen...
Wie wäre es, wenn du dein Programm einfach aus einer Kommandozeile heraus aufrufst? Dann siehst du die Ausgaben auch. :zwinker:

Den Code schaue ich gleich an.

// EDIT:
Ich kann den Fehler nicht reproduzieren, hier gibt es zumindest keine Exception.

// EDIT2:
Ok, mal testweise Delphi 7 gestartet. Da schlägt dieser Aufruf fehl:

Delphi-Quelltext
1:
2:
if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil,
  CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then
GetLastError sagt auch nix. :nixweiss:

Narses, sag du doch mal was als Delphi 7 Experte. ;-)


bf109g.01 - Fr 17.02.12 13:10

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Hier ist also noch ein anderer Fehler, ich tippe wirklich mal auf den unvollständigen Pfadnamen. Was passiert, wenn du da einen vollständigen Pfad verwendest, und/oder wo steigt er beim schrittweisen Ausführen aus?

Der Code in diesem Threat hängt sich an der function PfadAendern auf.
Schrittweise springt der nämlich von

Delphi-Quelltext
1:
15:  SelectDirectory('Verzeichnis wählen, in welches kopiert werden soll.''Arbeitsplatz', Result);                    

nach

Delphi-Quelltext
1:
95end;                    

Und dann schließt das ganze gleich.


Narses - Fr 17.02.12 14:39

Moin!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Narses, sag du doch mal was als Delphi 7 Experte. ;-)
Oh, ich bin D7-Experte? :shock: Wusste ich noch gar nicht. Bisher habe ich mich für einen Nutzer gehalten... ;)

Was soll ich dazu sagen, entweder man erstellt eine Konsolenanwendung, und dann hat SelectDirectory() da nix zu suchen, oder man schreibt eine VCL-Anwendung. Ich halte nix davon, beides zu mischen, also halte ich mich da raus. :nixweiss: (Und nach allem, was ich bisher an Interna gesehen und verstanden habe, sieht das Bor..In..Emba...dingsda auch so. :idea:)

cu
Narses