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
  { TODO -oUser -cConsole Main : Hier Code einfügen }
  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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
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);
  { TODO -oUser -cConsole Main : Hier Code einfügen }
  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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Es ist also absolut keine gute Idee deine Programme wie Systemprogramme oder Befehle zu nennen.
Das... ähm... wusste ich nicht... :oops:

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
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?