Autor Beitrag
Tarry
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 213
Erhaltene Danke: 1



BeitragVerfasst: Do 08.01.09 02:49 
Hi,
ich habe folgendes Problem:
Ich meochte in meinem Programm einen Menue Punkt anbieten um eine Verknuepfung auf dem Desktop zu erstellen.
Das ganze funktioniert auch wunderbar auf meinem Computer (Vista) es scheint aber auf XP Probleme zu geben, dass die Datei nicht auf dem Desktop erstellt wird. (Vielleicht wird sie erstellt und nur im falschen Ordner oder ueberhaupt nicht, dass weiss ich nicht).
Leider habe ich keinen Computer mit Xp zur Verfuegung :(
Koennte ihr mir bitte sagen, wo das Problem liegt ?

Ich benutzte folgenden Code:
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:
function GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var                     // Code from d3g ---> http://www.delphipraxis.net/viewtopic.php?t=502
  pMalloc: IMalloc;
  pidl: PItemIDList;
  Path: PChar;
begin
  // get IMalloc interface pointer
  if (SHGetMalloc(pMalloc) <> S_OK) then
  begin
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)'16);
    Exit;
  end;

  // retrieve path
  SHGetSpecialFolderLocation(hWindow, Folder, pidl);
  GetMem(Path, MAX_PATH);
  SHGetPathFromIDList(pidl, Path);
  Result := Path;
  FreeMem(Path);

  // free memory allocated by SHGetSpecialFolderLocation
  pMalloc.Free(pidl);
end;

function CreateLink(const AFilename, ALNKFilename, ADescription: string) : Boolean;
var                // code from delphi-treff ---> http://www.delphi-treff.de/tipps/dateienverzeichnisse/wiki/Verkn%C3%BCpfung%20(*.lnk)%20zu%20einer%20Datei%20erstellen/
  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;


procedure THauptfenster.mCreatShortcutClick(Sender: TObject);
var tmpPath: String;
begin
  tmpPath := GetSpecialFolder(Handle, CSIDL_DESKTOPDIRECTORY); // gives desktop path
 // showmessage(tmpPath);
  if CreateLink(ParamStr(0),                                   // Ziel
                tmpPath + '\Alarm Clock.lnk',                  // Speicherort der verknüpfung
                'Shortcut to Alarm Clock by Tarry91'then     // Verknüpfungs Beschreibung
  MsgBox(msgShortcutSuc);
end;


Ich hoffe ihr habt ne Idee :)

Danke schonmal,
Thomas

Moderiert von user profile iconNarses: Titel geändert.
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 08.01.2009 um 02:52

_________________
"Es gibt zwei Dinge, die unendlich sind. Das Universum und die menschliche Dummheit. Beim Universum bin ich mir noch nicht ganz sicher." -Albert Einstein
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 08.01.09 07:59 
Wenn Du den Verdacht hast, dass die Verknüpfung in einem falschen Ordner erstellt wird, überprüfe mal den Rückgabewert von GetSpecialFolder mit ShowMessage. Bei MS gibt es Virtual PC und irgentwo ein Image mit Windows XP, dass ein paar Tage lang nutzbar ist. Sollte reichen, um Deinen Fehler zu finden.

Gruß,
Jens

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 14:23 
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Bei MS gibt es Virtual PC und irgentwo ein Image mit Windows XP, dass ein paar Tage lang nutzbar ist.
Um genau zu sein sind die Images bis April lauffähig:
www.microsoft.com/do...F&displaylang=en
Es gibt dort Images mit XP und Vista in verschiedenen Varianten und mit verschiedenen IE Versionen.

Microsoft hat auch angekündigt, dass diese Images immer wieder erneuert werden, d.h. man immer ein neues lauffähiges Image bekommen kann.

Zum Problem:
Das Problem ist, dass gleich am Anfang in CreateLink das CoCreateInstance fehlschlägt. Warum werde ich gleich schauen, aber daran liegt es jedenfalls.
Die Verknüpfung wird also nicht im falschen Ordner oder so erstellt, sondern ganz einfach gar nicht. ;-)

// EDIT:
Warum das nicht funktioniert kann ich gerade nicht sagen, der Rückgabewert entspricht keinem der angegebenen Fehlercodes, GetLastError ist 0. :nixweiss: Hiermit klappt es jedenfalls:
www.delphi-library.de/viewtopic.php?p=3942
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 05.05.09 15:37 
Moin!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Hiermit klappt es jedenfalls:
www.delphi-library.de/viewtopic.php?p=3942
Stimmt, allerdings nur eingeschränkt. :? In einer VCL-Anwendung klappt die Funktion aus der Library, wenn ich das allerdings aus einer Kommandozeilenanwendung heraus mache, dann gibt´s eine Exception. :hair: Warum? :nixweiss:

Es scheint, als sei die COM-basierte Lösung irgendwie nicht für die Kommandozeile geeignet. Gibt´s irgendwo eine nicht-COM-basierte Lösung für das Anlegen einer Verknüpfung? Bisher habe ich nur COM-Ansätze gefunden... :(

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 05.05.09 15:47 
Da bleibt dir nur der Weg die Datei selbst zu schreiben, MS bietet AFAIK keine Lösung an. Ob das allerdings aus der Konsole generell nicht geht oder du vielleicht nur CoInitialize und CoUninitialize oder so etwas benutzen musst, das weiß ich nicht.

Wie eine solche Datei aufgebaut ist inkl. Beispielcode in C findest du hier unter lnk:
www.wotsit.org/list.asp?fc=13
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 05.05.09 15:59 
Moin!

Danke erstmal. :) Ich denke, damit komme ich weiter.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Hobby-Programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: Mi 06.05.09 07:04 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Es scheint, als sei die COM-basierte Lösung irgendwie nicht für die Kommandozeile geeignet. Gibt´s irgendwo eine nicht-COM-basierte Lösung für das Anlegen einer Verknüpfung? Bisher habe ich nur COM-Ansätze gefunden... :(
Moin ...,
kann ich so nicht bestätigen! In meinem Dos-loader funktioniert das bisher ohne Probleme.
ausblenden 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:
Procedure CreateLink(Description, Parameter: String; IconIndex: Integer);
// Verfasser unbekannt
var 
  IObject  : IUnknown;
  ISLink   : IShellLink;
  IPFile   : IPersistFile;
  PIDL     : PItemIDList;
  FilePath : array[0..MAX_PATH] of Char;
  DescName : WideString;
begin
  CoInitialize(Nil);
  IObject:= CreateComObject(CLSID_ShellLink);
  ISLink := IObject as IShellLink;
  IPFile := IObject as IPersistFile;

  with ISLink do begin
    SetPath(pChar(ParamStr(0)));
    SetWorkingDirectory(pChar(ExtractFilePath(ParamStr(0))));
    SetArguments(PChar(Parameter));
    SetIconLocation(PChar(ParamStr(0)), IconIndex);
  end;

  SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL);
  SHGetPathFromIDList(PIDL, FilePath);

  DescName := StrPas(FilePath) + '\'+ Description +'.lnk';
  IPFile.Save(PWChar(DescName), false);
end;

Cu Mario
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 06.05.09 14:03 
Das hätte mich eigentlich auch sehr gewundert, wenn es in einer Konsolenanwendung nicht funktionieren würde. ;-)

Vielleicht hast du Units drin, die CoInitialize oder so etwas aufrufen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 26.05.09 22:04 
Moin!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das hätte mich eigentlich auch sehr gewundert, wenn es in einer Konsolenanwendung nicht funktionieren würde.
Und das tut es auch. ;) Es lag daran, dass man in einer Konsolenanwendung (und auch in jedem weiteren Thread - darüber bin ich dann gestolpert :roll:) einmal
ausblenden Delphi-Quelltext
1:
CoInitialize(NIL);					
aufrufen muss. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 26.05.09 22:24 
Wichtig ist dabei auch noch mehr.
  • Der erste Thread, der CoInitialize mit nil aufruft, muss auch der letzte sein, der CoUninitialize aufruft!
  • Und jedes erfolgreiche CoInitialize benötigt auch genau ein passendes CoUninitialize.

Diese beiden Punkte sind die häufigsten Stolpersteine bei Multithreadanwendungen. Dass es sich um eine solche handelt, hattest du nicht erwähnt, sonst hätte ich das auch direkt sagen können. ;-)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 26.05.09 22:47 
Moin!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Der erste Thread, der CoInitialize mit nil aufruft, muss auch der letzte sein, der CoUninitialize aufruft!
Das kann ich nicht einhalten, da sich meine Threads überlappen. :nixweiss:
ausblenden Quelltext
1:
2:
---Thread1---   ---Thread3---
         ---Thread2---
Das kann ich auch nicht ändern, da das der Sinn des Programmes ist. :?

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Und jedes erfolgreiche CoInitialize benötigt auch genau ein passendes CoUninitialize.
Kein Thema im Thread.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Diese beiden Punkte sind die häufigsten Stolpersteine bei Multithreadanwendungen. Dass es sich um eine solche handelt, hattest du nicht erwähnt, sonst hätte ich das auch direkt sagen können. ;-)
Du könntest deine Glaskugel aber auch mal wieder abstauben, man... :motz: :zwinker:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 26.05.09 23:17 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Das kann ich nicht einhalten, da sich meine Threads überlappen. :nixweiss:
Dann musst du das im Hauptthread machen. Wichtig ist nur, dass ein CoInitialize(nil) vor dem ersten untergeordneten kommt und das dazu passende CoUnititialize nach dem letzten untergeordneten.

Wenn man das nicht macht, kann es gut gehen, es kann aber auch ganz eklige Effekte geben soweit ich das mitbekommen habe. Vielleicht ist an der Stelle noch der Hinweis auf CoInitializeEx passend, da kann man genauere Angaben zur Parallelisierung machen. Ich weiß nicht, ob das bei der Aufrufreihenfolge von CoInitialize(Ex)/CoUninitialize einen Unterschied macht (ich habe das bisher nämlich nie benutzt ;-)).