お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"[D3]ソフトからショートカットを作る"




{
あほうどりさんの[00094]CreateShortcutのComObjを使ったバージョンです。

// 引数の説明
// szFileName  = ショートカットを作成したいフルパスファイルィ名
// nFolder = ショートカットの作成場所  CSIDL_DESKTOPDIRECTORY : デスクトップ
//                              CSIDL_PROGRAMS         : スタートメニュー
//                              CSIDL_STARTUP          : スタートアップ
//                              CSIDL_SENDTO           : コンテキストメニューの
//                                                      「送る」
}

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  ShellAPI, ShlObj, ActiveX, ComObj;

  procedure CreateShortcut(szFileName: string; nFolder: Integer);
var
  ppmem: IMalloc;
  Directory : array[0..MAX_PATH] of Char;
  szDirectory: string;
  UnknownObject: IUnknown;
  psl: IShellLink;
  ppf: IPersistFile;
  lpi: PItemIDList;
  wFileName : WideString;
begin
  UnknownObject:= CreateComObject(CLSID_ShellLink);
  if not Assigned(UnknownObject) then exit;
  psl:= UnknownObject as IShellLink;
  ppf:= UnknownObject as IPersistFile;
  if not Assigned(psl) or not Assigned(ppf) then exit;
  if FAILED(ShGetMalloc(ppmem)) then exit;
  if FAILED(SHGetSpecialFolderLocation(0, nFolder, lpi)) then exit;
  if not SHGetPathFromIDList(lpi, Directory)then
  begin
    if Assigned(lpi) then ppmem.Free(lpi);
    exit
  end;
  with psl do
  begin
    SetPath(PChar(szFileName));
    SetWorkingDirectory(PChar(ExtractFilePath(szFileName)));
  end;
  szDirectory:= strpas(Directory);
  wFileName:= szDirectory + '\' + ExtractFileName(szFileName)
              + 'へのショートカット.lnk';
  ppf.Save(PWChar(WFileName), False);
  if Assigned(lpi) then ppmem.Free(lpi);
end;

//  ButtonをクリックしてOpenDialogからファイルを選ぶとディスクトップに
//  ショートカットができます。

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    CreateShortcut(OpenDialog1.FileName, CSIDL_DESKTOPDIRECTORY);
end;

end.

{
#あほうどりさん Pidlは開放しましょうね。(^^;
#私も[00053]の中で
#public
#    constructor Create(AOwner: TComponent); override;
#                                            ^^^^^^^^^が抜けてました。
}

でわ〜でわ〜
                                   by ヒシアマゾン
                                   BXC05221@niftyserve.or.jp
                                   ken_fu@mx4.meshnet.or.jp


Original document by ヒシアマゾン    氏 ID:(BXC05221)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum