Tworzenie skrótu do aplikacji przez aplikację konsolową

0

Oto mój kod skopiowany z gotowców i trochę przerobiony. Zaznaczam, że działa poprawnie na
aplikacjach z "formą".

procedure SetShortening(FName: PChar; Where: string);
var
  IObject   : IUnknown;
  ISLink    : IShellLink;
  IPFile    : IPersistFile;
  FileName  : String;
  WFileName : WideString;
begin
  IObject := CreateComObject(CLSID_ShellLink); //przy ustawionych znacznikach w tym miejscu wywala błąd w konsolówce
  ISLink := IObject as IShellLink;
  IPFile := IObject as IPersistFile;
  FileName:= pchar(string(FName));

   with ISLink do
   begin
     SetPath(PChar(FileName));
     SetWorkingDirectory(PChar(ExtractFilePath(FileName)));
   end;

  WFileName := Where + '' + ExtractFileName(ChangeFileExt(FileName, '.lnk'));
  IPFile.Save(PWChar(WFileName), False); // zapisz lacznik
end;

Metody wywołania:

SetShortening(Pchar(string(paramStr(0))), 'C:\');
SetShortening(Pchar(string(application.exename)), 'C:\'); //w aplikacjach z formą to działa
0

Zobacz na poniższy kod, który także mam "skądś" (na pewno z sieci); Działał bez problemu pod Delphi7 i dokładnie takiego kodu użyłem w instalatorze swojego programu (z 2009 roku); O ile program będzie posiadał prawa zapisu i nie będzie go blokować UAC (na systemach nowszych niż WinXP) to także powinien działać prawidłowo;

procedure mkShellLink(FilePath: String; ShortcutName: String; CSIDL_Folder: Byte);
var
  ShellObject: IUnknown;
  ShellLink: IShellLink;
  PersistFile: IPersistFile;
  SpecialFolderPath: array [0..MAX_PATH] of Char;
  ShortcutPath: String;
begin
  SHGetSpecialFolderPath(0, SpecialFolderPath, CSIDL_Folder, False);
  ShortcutPath := String(SpecialFolderPath) + '\' + ShortcutName;

  ShellObject := CreateComObject(CLSID_ShellLink);
  ShellLink   := ShellObject as IShellLink;
  PersistFile := ShellObject as IPersistFile;

  ShellLink.SetPath(PChar(FilePath));
  PersistFile.Save(PWideChar(WideString(ShortcutPath)), False);
end;

Kod w postaci uniwersalnej procedury, poniżej przykład wywołania:

mkShellLink('C:\AppName.exe', 'AppName.lnk', CSIDL_DESKTOP);

PS: Ewentualnie zobacz tutaj - duży artykuł, opisujący wiele aspektów interfejsu IShellLink.

4

jeśli to konsolowa i wywołujesz obiekty com to zapewne nie masz wywołanego CoInitialize na początku http://chrisbensen.blogspot.com/2007/06/delphi-tips-and-tricks.html

0

Kod działa tak samo jak mój, czyli wywala błąd:
EOleSysError with message 'Funkcja CoInitialize nie została wywołana'
Jestem "trochę" początkujący i nie znam się na tym za dobrze (co to znaczy). Poczytam jeszcze podesłany link.
Mam Win XP i Delphi 7 PE. Program uruchamiam na różne sposoby, również odznaczając "Chroń mój komputer (...)".

0

Boże... Skoro od samego początku dostawałeś komunikat dokładnie opisujący problem, to dlaczego po pierwsze go nie podałeś w poście, a po drugie dlaczego z niego nie skorzystałeś? Czy za każdym razem trzeba tłumaczyć, że "wywala błąd" to nie jest opis problemu?

Następnym razem czytaj te komunikaty i wklepuj je do Google, zamiast marnować czas na pisanie postów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1