ショートカット作成について(SHAddToRecentDocsを使う方法)

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: ショートカット作成について(SHAddToRecentDocsを使う方法)

ショートカット作成について(SHAddToRecentDocsを使う方法)

by 西野孝雄 » 2006年9月23日(土) 16:51

>Sinryowさん
英語版のMSDNは見てませんでした。
そういうことでしたか。結構ショック。セキュリティ関連なのかな。
検索で見つけたサンプルにはXP不可とは書いてなかったけど古いサンプルだったのかも。

一旦別のショートカットを作って、アドレスを書き直そうか…、凄い遠回り。
今まではヘルプファイルに、「ショートカットを作って、スタートアップフォルダに入れて下さい。」
なんて書いてたので、チョット不親切かなと思って、はじめたのですが意外に大変ですね。
おとなしくイグトランス (egtra)さんのコードをつかわさせて頂きます。

皆さん、有難うございました。

Re: 返信遅れてすいません

by Sinryow » 2006年9月22日(金) 02:04

> 結局、exeファイルだとなぜダメなのかは、わからないのでしょうか。

原因らしきことがMSDNに書かれていたので載せておきます。
http://msdn.microsoft.com/library/defau ... ntdocs.asp

(原文)
Note
Microsoft Windows XP filters .exe files from the recently used documents list. Although SHAddToRecentDocs will accept the path of a executable file under Windows XP, that file will not appear to the My Recent Documents list.

(私訳)
補足
Microsoft Windows XPでは、.exeファイルを「最近使ったファイル」の一覧から外します。Windows XPにおいてもSHAddToRecentDocsで実行ファイルは受け付けられますが、それは「最近使ったファイル」の一覧には現れません。

返信遅れてすいません

by 西野孝雄 » 2006年9月22日(金) 01:39

>konisiさん
それは私も思っていましたので調べていました。

http://romitechio.com/log/archives/2005/05/lnk.php

上記アドレス先や、そのリンク先にフォーマットが載っているのですが、
う~ん、これまたどうしたら良いか良く分からない。
4bytesとか、1 dwordに値を入れ、つなげて拡張子.lnkにしてファイルを保存すればOKなんですかね。

>イグトランス (egtra)さん
単純に、ショートカット1個作るのに、あれだけ書くとは思わなかったので
コード多い=ムズイと思っただけで、説明がわかりづらいという事ではないです。
私自身、あまり良く分かっている方ではないですし。

結局、exeファイルだとなぜダメなのかは、わからないのでしょうか。
素直にイグトランス (egtra)さんのコード丸写しがいいのかな。

by イグトランス » 2006年9月21日(木) 14:24

参考までに,私のではどこがわかりづらかったでしょうか。
あの文章もかなりいい加減ですし。

by konisi » 2006年9月19日(火) 20:45

lnkファイルの書式を調べて直で書き込んだ方が早いのではないかなと思ってみました。

ショートカット作成について(SHAddToRecentDocsを使う方法)

by 西野孝雄 » 2006年9月19日(火) 17:53

実行ファイルのショートカットを作り、それをスタートアップフォルダに入れて、
PC起動時に、自動実行させたいと思っています。

そこで、ショートカット作成方法を調べていた所、
http://www.activebasic.com/forum/viewto ... 5%C3%A5%C8

http://www.activebasic.com/forum/viewto ... IShellLink

以上の2件が使えそうかなと思ったのですが、凄く難しい。
ショートカット1つ作るのに、こんなに大変とは思いませんでした。
で、コードの切れ端にも1件見つけてこれは簡単そうなので、これを採用しました。
http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=29

この記事の中で動作が少し怪しい感じとありますが、それはショートカットが
作成されている最中に、GetFileAttributesでファイルの有無を確認しているので
うまく判別できないからだと思います。なので、
SHAddToRecentDocsのあとにSleepを入れる事で解決しました。

長くなりましたが、ここからが質問したい所です。
txtや、ini、bmp、zip等のショートカットは、希望通りに作れるようになったのですが
肝心のexeファイルは、SHAddToRecentDocsでショートカットが作成されません。

検索してみると、exeファイルでのサンプルを幾つか見たので、
SHAddToRecentDocsは、拡張子がexeだと使えない訳ではないと思うのですが。
これは一体どういうことなんでしょう。
お解りの方が居たら、是非、私に教えて下さい。宜しくお願いします。

OS XP home sp2
AB 4.13
以下コード(コードの切れ端とほぼ変りませんが)

コード: 全て選択

Sub CreateShortcut(FilePath As String,Shortcut As String)

	Dim Recent As String
	Dim NonPathFile As String
	Dim i As Long
	Dim pPathFile As String


	If GetFileAttributes(FilePath)=-1 Then Exit Sub		'リンク先ファイルが存在しなければ終了

	SHAddToRecentDocs(2, StrPtr(FilePath))				'Recentにショートカットを作成
	Recent = GetRecentPath()							'Recentのパスを取得
	If Right$(Recent, 1) <> "\" Then Recent = Recent & "\"	'\を付加

	
	For i = Len(FilePath) To 1 Step -1					'パスを除いたファイル名部分のみ取り出す
		If Asc(Mid$(FilePath, i)) = 92 Then
			NonPathFile = Mid$(FilePath, i + 1)
			Exit For
		End If
	Next i

	Sleep(1000)			'ショ-トカット作成待ち時間


	If GetFileAttributes(Recent & NonPathFile & ".lnk") <> -1 Then	'拡張子表示有り設定
		pPathFile = Recent & NonPathFile & ".lnk"

	ElseIf GetFileAttributes(Recent & Left$(NonPathFile, InStr(1, NonPathFile, ".")) & "lnk") <> -1 Then '無し設定
		pPathFile = Recent & Left$(NonPathFile, InStr(1, NonPathFile, "."))
	End If

	If pPathFile <> "" Then MoveFile(pPathFile, Shortcut) '移動

End Sub

Function GetRecentPath() As String

	Dim lngPIDL As Long		'IDLへのポインタ
	Dim strBuffer As String

	strBuffer = ZeroString(MAX_PATH)
	
	If SHGetSpecialFolderLocation(0, 8, lngPIDL) = 0 Then '特殊フォルダ IDL ポインタ取得
		If SHGetPathFromIDList(lngPIDL, strBuffer) Then 'IDL へのポインタ使用 パス取得
			GetRecentPath = MakeStr(strBuffer)
		End If
		CoTaskMemFree(lngPIDL)
	End If
	
End Function

ページトップ