Entwickler-Ecke
Windows API - Link erstellen funktioniert nicht.
bf109g.01 - Do 16.02.12 18:57
Titel: Link erstellen funktioniert nicht.
Hallo ihr Lieben,
ich möchte mit einer Konsolenanwendung eine Verlinkung erstellen.
Diese soll testweise auf die Exe selbst zeigen und in den Autostart Ordner gelegt werden.
Es passiert allerdings einfach gar nichts.
Kein Fehlermeldung o.ä, einfach gar nichts.
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:
| uses Windows, SysUtils, Classes, Dialogs, StdCtrls, FileCtrl, ActiveX, ShlObj, ComObj, ShellApi;
const CSIDL_STARTUP = $0007;
procedure MkLink(Name: String); begin WriteLN(Name); if not FileExists(Name+'.exe') then WriteLN('Not found.') else begin CreateLink(Name+'.exe', GetShellFolder($0007)+'\'+Name+'.lnk',''); WriteLN(Name+'.exe'); WriteLN(GetShellFolder($0007)+'\'+Name+'.lnk'); end; end;
begin MkLink('Link'); ReadLN; end. |
Warum baut man mir keine Verknüpfung?
jaenicke - Do 16.02.12 19:49
Erstens fehlen dir eventuell die Rechte im Zielordner, zweitens hast du bei der Exe vergessen den Pfad anzugeben. Ohne kann Windows damit nichts anfangen. Nur Name+'.exe' reicht nicht, wenn in Name der Pfad fehlt.
Nebenbei:
Was hast du für komische Exe-Dateinamen? Hier Link.exe, im anderen Beitrag Copy.exe? Willst du jemanden damit ärgern indem du Systembefehle verhinderst? :roll:
bf109g.01 - Do 16.02.12 21:33
jaenicke hat folgendes geschrieben : |
| Erstens fehlen dir eventuell die Rechte im Zielordner, zweitens hast du bei der Exe vergessen den Pfad anzugeben. Ohne kann Windows damit nichts anfangen. Nur Name+'.exe' reicht nicht, wenn in Name der Pfad fehlt. |
Erfahrungsgemäß reicht der Dateiname aus, wenn sich die beabsichtigte Datei im gleichen Ordner wie die EXE befindet.
CreateLink(ExtractFilePath(paramstr(0))+Name+'.exe', ExtractFilePath(paramstr(0))+Name+'.lnk',''); Diese Modifikation bringt auch keine Änderung.
jaenicke hat folgendes geschrieben : |
Nebenbei:
Was hast du für komische Exe-Dateinamen? Hier Link.exe, im anderen Beitrag Copy.exe? Willst du jemanden damit ärgern indem du Systembefehle verhinderst? :roll: |
Nein. Ich bin ein kleiner und schmächtiger Möchtegernprogammierer, der sich nie mehr als nur oberflächlich in Delphi eingearbeitet hat. Ich benutze gerne Konsolenprogramme, um an meinem PC diverse "Kleinigkeiten" automatisch laufen zu lassen. Bspw benutze ich ein Konsolenprogramm welches wie ein Lichtschalter versteckte Ordner sichtbar / unsichtbar macht. Andere Programme ähnlich "gewaltiger" Dimension starte ich gern mit dem Autostart, weil ich es erstens nicht besser kann und zweitens das für jeden der wenigen Nutzer, die Fan meiner Minianwendungen sind, leicht zu entfernen ist. Meine letzen Beiträge zeigen meine kläglichen Versuche, eine Verknüpfung zu einer Minianwendung automatisch in den Autostart Ordner einfügen zu lassen.
jaenicke - Do 16.02.12 22:07
bf109g.01 hat folgendes geschrieben : |
| Nein. Ich bin ein kleiner und schmächtiger Möchtegernprogammierer, der sich nie mehr als nur oberflächlich in Delphi eingearbeitet hat. Ich benutze gerne Konsolenprogramme, um an meinem PC diverse "Kleinigkeiten" automatisch laufen zu lassen. |
So meinte ich das nicht. ;-)
Ich meinte, dass link und copy Befehle sind, die es bei Windows bzw. damit verbundenen Tools gibt. Wenn du jetzt eine copy.exe erstellst, wird die ggf. statt des echten Befehls aufgerufen, wenn jemand copy schreibt.
Deshalb wurde genau das oft von Virenprogrammierern oder für "Scherz"programme verwendet, insbesondere noch vor wenigen Jahren.
Es ist also absolut keine gute Idee deine Programme wie Systemprogramme oder Befehle zu nennen.
bf109g.01 hat folgendes geschrieben : |
| Erfahrungsgemäß reicht der Dateiname aus, wenn sich die beabsichtigte Datei im gleichen Ordner wie die EXE befindet. |
Ja, das Interface kann offenbar bei Delphi 7 nicht abgerufen werden (wie im anderen Thread geschrieben). Bei neueren Delphiversionen geht es. Ich weiß noch nicht warum. :nixweiss:
Martok - Do 16.02.12 23:11
Oh, hab den Thread hier nicht gesehen. Rechnet ja keiner damit, dass zwei mal die gleiche Frage kommt ;) Also noch mal hier, und nebenan gelöscht.
Da fehlt die Initialisierung:
CoInitialize(nil); am Programmanfang aufrufen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| begin CoInitialize(nil); mach('Test'); write('test');
ReadLN; end. |
Dass neuerdings anscheinend das komplette COM-Gedöns immer mitinitialisiert wird erklärt dann wohl auch, warum die Binaries immer größer und vom Start her langsamer werden.
bf109g.01 - Do 16.02.12 23:31
jaenicke hat folgendes geschrieben : |
| Es ist also absolut keine gute Idee deine Programme wie Systemprogramme oder Befehle zu nennen. |
Das... ähm... wusste ich nicht... :oops:
Martok hat folgendes geschrieben : |
Oh, hab den Thread hier nicht gesehen. Rechnet ja keiner damit, dass zwei mal die gleiche Frage kommt ;) Also noch mal hier, und nebenan gelöscht.
Da fehlt die Initialisierung:
CoInitialize(nil); am Programmanfang aufrufen. |
Habe ich eingefügt. Kein Unterschied im Ergebnis... :(
Martok - Do 16.02.12 23:47
bf109g.01 hat folgendes geschrieben : |
| Habe ich eingefügt. Kein Unterschied im Ergebnis... :( |
Du hast hier anderen Code gepostet, seh ich grade. Aber die CreateLink ist schon die gleiche wie in dem andern Thread?
Dort hat diese Änderung nämlich geholfen.
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?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!