| Autor |
Beitrag |
Tarry
      
Beiträge: 213
Erhaltene Danke: 1
|
Verfasst: 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:
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 pMalloc: IMalloc; pidl: PItemIDList; Path: PChar; begin if (SHGetMalloc(pMalloc) <> S_OK) then begin MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.', 'SHGetMalloc(pMalloc)', 16); Exit; end;
SHGetSpecialFolderLocation(hWindow, Folder, pidl); GetMem(Path, MAX_PATH); SHGetPathFromIDList(pidl, Path); Result := Path; FreeMem(Path);
pMalloc.Free(pidl); end;
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;
procedure THauptfenster.mCreatShortcutClick(Sender: TObject); var tmpPath: String; begin tmpPath := GetSpecialFolder(Handle, CSIDL_DESKTOPDIRECTORY); if CreateLink(ParamStr(0), tmpPath + '\Alarm Clock.lnk', 'Shortcut to Alarm Clock by Tarry91') then MsgBox(msgShortcutSuc); end; |
Ich hoffe ihr habt ne Idee
Danke schonmal,
Thomas
Moderiert von Narses: Titel geändert.Moderiert von Narses: 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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 08.01.09 14:23
Nersgatt hat folgendes geschrieben : | | 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.  Hiermit klappt es jedenfalls:
www.delphi-library.de/viewtopic.php?p=3942
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 05.05.09 15:37
Moin!
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.  Warum?
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
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Mi 06.05.09 07:04
Einloggen, um Attachments anzusehen!
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 26.05.09 22:04
Moin!
jaenicke hat folgendes geschrieben : | | 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  ) einmal Delphi-Quelltext aufrufen muss.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 26.05.09 22:47
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 26.05.09 23:17
Narses hat folgendes geschrieben : | Das kann ich nicht einhalten, da sich meine Threads überlappen.  |
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  ).
|
|
|