また、お世話になります。
今インストーラーを作っています。
デスクトップにショートカットを作る方法について検索したらありましたが、紹介されているHPが無くなっています。
別の人が検索しても分かるように、コードを紹介してくださいませんか。
よろしくお願いします。
検索すれば30秒で出てくると思いますが…
>今インストーラーを作っています。
インストーラーは何を使ってますか?
https://www.petitmonte.com/bbs/answers?question_id=5912
で挙げてますが、Inno Setup を使うのは、いかがですか?
Inno Setupなら、デスクトップにショートカットも作れますが。
試していませんが、
この掲示板で「ショートカット」で検索したら、
ショートカット作成
https://www.petitmonte.com/bbs/answers?question_id=3788
があるようです。
こんばんは。
あさん、igyさんありがとうございました。
私もここを「ショートカット」で検索したんです。
量が多くて、これと思うのを見つけたんですが、
紹介されているHPは無くなっていました。
installerは自作です。
既製品のもあるんですね。
全然知りませんでした。
ここの過去ログを見ていたら、コンマ区切り文を切り分ける関数がありました。
私はこれも自作しました。
関数もいろいろあるようですが、素人には探すの無理ですよね。
今後もよろしくお願いいたします。
Delphi デスクトップにショートカット
でもげっぷが出るほどヒットする
「素人には探すの無理ですよね」って <中級者>プログラマの言葉とは思えない
>関数もいろいろあるようですが、素人には探すの無理ですよね。
# 他の質問を見ると、Delphi7も使われているようなので・・・・
Delphi7のヘルプでは、
「キーワード」ページの
ルーチン
クイックリファレンス, カテゴリ順
を選択し、調べたいカテゴリを選択すると、関数などの簡単な説明の記述したリストが
表示するので、それを参考にするのもよいかと思います。
もう解決とチェックしたのですが、またすみません。
もう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歳ですので、調べてもなかなか理解できません。
よろしく願いします。
(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に変えればすべてのユーザーに適用されるデスクトップのフォルダ名が得られます。
Dさん、ありがとうございます。
早速やってみますね。
報告です。
デスクトップのアドレスは取得できました。
ありがとうございました。
実行結果は、残念ながら以前と変わりません。
インストーラーのある場所に、ショートカットの作成場所の最初の1文字Cの名前でファイルができるだけでした。
また、明日頑張って見ます。
MultiByteToWideCharが悪いんだと思います。
リンク先の関数を以下のように修正すればできませんかね。
{ショートカットファイル名}
filePath := aShortCutDir + '\' + aFileName + '.lnk';
{WideChar変換}
// MultiByteToWideChar(0, 0, PChar(filePath), -1, @filePathChar, MAX_PATH * 2);
{保存}
// persistFile.Save(@filePathChar, True);
persistFile.Save(PChar(filePath), True);
できました。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;
ツイート | ![]() |