デスクトップにショートカットを作る方法は?

解決


altlegend  2011-03-25 14:57:15  No: 40301

また、お世話になります。
今インストーラーを作っています。
デスクトップにショートカットを作る方法について検索したらありましたが、紹介されているHPが無くなっています。
別の人が検索しても分かるように、コードを紹介してくださいませんか。
よろしくお願いします。


  2011-03-25 16:18:57  No: 40302

検索すれば30秒で出てくると思いますが…


igy  2011-03-25 17:01:07  No: 40303

>今インストーラーを作っています。

インストーラーは何を使ってますか?
https://www.petitmonte.com/bbs/answers?question_id=5912

で挙げてますが、Inno Setup を使うのは、いかがですか?
Inno Setupなら、デスクトップにショートカットも作れますが。


igy  2011-03-25 20:00:52  No: 40304

試していませんが、

この掲示板で「ショートカット」で検索したら、

ショートカット作成
https://www.petitmonte.com/bbs/answers?question_id=3788

があるようです。


altlegend  2011-03-26 06:27:42  No: 40305

こんばんは。

あさん、igyさんありがとうございました。

私もここを「ショートカット」で検索したんです。
量が多くて、これと思うのを見つけたんですが、
紹介されているHPは無くなっていました。

installerは自作です。
既製品のもあるんですね。
全然知りませんでした。

ここの過去ログを見ていたら、コンマ区切り文を切り分ける関数がありました。
私はこれも自作しました。

関数もいろいろあるようですが、素人には探すの無理ですよね。

今後もよろしくお願いいたします。


検索方法の問題では?  2011-03-26 08:26:11  No: 40306

Delphi デスクトップにショートカット
でもげっぷが出るほどヒットする

「素人には探すの無理ですよね」って <中級者>プログラマの言葉とは思えない


igy  2011-03-26 19:14:38  No: 40307

>関数もいろいろあるようですが、素人には探すの無理ですよね。

# 他の質問を見ると、Delphi7も使われているようなので・・・・

Delphi7のヘルプでは、
「キーワード」ページの
  ルーチン
    クイックリファレンス, カテゴリ順
を選択し、調べたいカテゴリを選択すると、関数などの簡単な説明の記述したリストが
表示するので、それを参考にするのもよいかと思います。


altlegend  2011-03-27 01:59:24  No: 40308

もう解決とチェックしたのですが、またすみません。

もう10年以上delphiでプログラムしてきましたので中級者にしてますが、
プロではないんです。

igyさんに紹介していただいたキーワードの所、いま7をインストールして見てみましたが、大変そうですね。

delphi4,6,8,2009と買ってきましたが、8を買ったら8は使えずに
付属してきた7を使っていました。
インターネット接続ではもう古いdelphiは使えなくなりましたので、今は使っているのは2009だけです。

さて、紹介していただいた
CreateShortcut(aAppHandle      :HWND;
                        aShortCutDir    :String;        //ショートカット作成フォルダ
                        aFileName       :String;        //ショートカットファイル名
                        aExePath        :String;        //アプリケーションパス
                        aArguments      :String='';     //コマンドライン引数(省略可)
                        aWorkFolder     :String='';     //作業フォルダ(省略可)
                        aIconPath       :String='';     //アイコンを表示するパス(省略可)
                        aIconIndex      :Integer=0)     //アイコンのインデックス(省略可)
                                        :Boolean;
で、お聞きしたいんですが、

(1)MultiByteToWideChar(0, 0, PChar(filePath), -1, @filePathChar, MAX_PATH * 2);
のPCHARがエラーになるので、Pansicharに変えたらコンパイルできました。これで良いんでしょうか。

(2)aShortCutDirにはショートカットを作りたいfileのあるディレクトリ、aFileNameにはショートカットを作りたいexefile名、aExePathには'デスクトップ’を入れたら、cという名のものがインストーラーのあるディレクトリーにできました。ショートカットを置く場所にデスクトップを指定するには'デスクトップ'でいいんでしょうか。

今60歳ですので、調べてもなかなか理解できません。
よろしく願いします。


D  2011-03-27 03:38:36  No: 40309

(1) Delphi 2009はUnicode対応なのでこの場合MultiByteToWideCharは使う必要がないのではないかと思います。
(WideCharに変換する必要がない)

(2)
aShortCutDir はショートカットを置くフォルダ(デスクトップのフォルダ名)
aFileName はショートカットの名前('メモ帳'とか'電卓'など)
aExePath は実行ファイルのフルパス。

をそれぞれ指定するのだと思います。
デスクトップのフォルダ名はSHGetSpecialFolderPath APIで取得できます。

function gfnsDesktopFolderGet: String;
//ユーザーごとのデスクトップフォルダを返す。
var
  lsz_Path: array[0..MAX_PATH] of Char;
begin
  if (SHGetSpecialFolderPath(
    0,
    lsz_Path,
    CSIDL_DESKTOPDIRECTORY,
    FALSE
  ))
  then begin
    Result := String(lsz_Path);
  end else begin
    Result := '';
  end;
end;

第3引数をCSIDL_COMMON_DESKTOPDIRECTORYに変えればすべてのユーザーに適用されるデスクトップのフォルダ名が得られます。


altlegend  2011-03-27 08:23:48  No: 40310

Dさん、ありがとうございます。
早速やってみますね。


altlegend  2011-03-27 08:44:03  No: 40311

報告です。
デスクトップのアドレスは取得できました。
ありがとうございました。

実行結果は、残念ながら以前と変わりません。
インストーラーのある場所に、ショートカットの作成場所の最初の1文字Cの名前でファイルができるだけでした。

また、明日頑張って見ます。
MultiByteToWideCharが悪いんだと思います。


D  2011-03-27 10:31:54  No: 40312

リンク先の関数を以下のように修正すればできませんかね。

  {ショートカットファイル名}
  filePath := aShortCutDir + '\' + aFileName + '.lnk';
  {WideChar変換}
//  MultiByteToWideChar(0, 0, PChar(filePath), -1, @filePathChar, MAX_PATH * 2);

  {保存}
//  persistFile.Save(@filePathChar, True);
  persistFile.Save(PChar(filePath), True);


altlegend  2011-03-27 18:08:13  No: 40313

できました。Dさんありがとうございました。

結局、次のようなプログラムでデスクトップにショートカットをつくることができました。

function TForm1.CreateShortcut(aShortCutDir:String;        //ショートカットを置くフォルダ
                               aFileName   :String;        //ショートカットの名前
                               aExePath    :String)        //ショートカットで実行するファイルフルパス
                                                   :Boolean;
var
  shellLink: IShellLink;
  persistFile: IPersistFile;
  filePath: String;
begin
  Result := True;
  shellLink := CreateComObject(CLSID_ShellLink) as IShellLink;{CreateComObject}
  persistFile := shellLink as IPersistFile;
  shellLink.SetPath(PChar(aExePath));{プログラムパス}
  filePath := aShortCutDir + '\' + aFileName + '.lnk';{ショートカットファイル名}
  persistFile.Save(PChar(filePath), True);{保存}
end;

function Tform1.DesktopFolderGet: String; //デスクトップフォルダのアドレス
var
  lsz_Path: array[0..MAX_PATH] of Char;
begin
  if (SHGetSpecialFolderPath(0,lsz_Path,CSIDL_DESKTOPDIRECTORY,FALSE))
  then Result := String(lsz_Path)
  else Result := '';
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加