トップ回答者
Windows7でプログラムメニューに追加する方法

質問
-
鈴木と申します。
XPからWindows7への移行で、プログラムメニューに追加する際に問題がみつかりました。
[開発環境]
Windows7(64bit)/VS2005 update for Vista
下記のコードで、サーバーからショートカットファイル(拡張子=lnk)をコピーして、ユーザーのプログラムメニューに追加しています。
今まではXPで動作していたのですが、Windows7である問題がでました。
[現象]1.③で”C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\”の下に、製品名のフォルダが作成されます。
2.④でサーバーから1のフォルダにファイルをコピーすると、”C:\ProgramData\Microsoft\Windows\Start Menu\Programs”の下に、製品名のフォルダとファイルが作成されました。
''' <summary> ''' サーバーからファイルをコピーします。 ''' </summary> ''' <param name="copyFiles">コピーするファイルの一覧。</param> ''' <remarks></remarks> Private Sub Copy(ByVal copyFiles As CopyFileInfo()) '①プログラムメニューのパスを取得 Dim programMenuDirectory As String = My.Computer.FileSystem.SpecialDirectories.Programs & "\" & PRODUCT_NAME '②ダウンロード処理 For Each downloadFile As CopyFileInfo In copyFiles '③プログラムメニューがなければ作成 Dim directoryPath As String = Path.GetDirectoryName(programMenuDirectory) If Directory.Exists(directoryPath) = False Then Directory.CreateDirectory(directoryPath) End If '④サーバーからファイルをコピー File.Copy(downloadFile.sourceFilePath, downloadFile.destinationFilePath, True) Next End Sub
[問題]1.なぜ、ユーザーごとのプログラムメニューに追加したのに、AllUsersである”%ProgramData%”のフォルダにプログラムメニューが作成されるのでしょうか。
他のユーザーには見せたくないですし、プログラムで指定したフォルダ以外の場所にファイルが作成されて欲しくないです。
ここは見てみましたが、該当する情報が見つかりませんでした。他に資料がありましたら教えてください。
<アプリケーション開発者向け Microsoft® Windows 7 対応アプリケーションの互換性>
http://msdn.microsoft.com/ja-jp/windows/dd882533
2.④のFile.Copyの時点で、%ProgramData%側に製品名のフォルダとファイルが作成されているようです。(③の時点ではフォルダは作成されていない)
このタイミングはOSの仕様なのでしょうか。
以上、ご回答いただけると幸いです。
回答
すべての返信
-
佐祐理さん、ご返信ありがとうございます。
ソースの説明に必要な部分を抜粋して投稿したため、4の値を記述し忘れておりましたので追記致します。
downloadFile.sourceFilePath,:\\<サーバー名>\<フォルダ名>\<ファイル名>.lnk
downloadFile.destinationFilePath:C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\<製品名>\<フォルダ名>\<ファイル名>.lnk
「downloadFile.destinationFilePath」は、”SpecialDirectories.Programs & "\" & PRODUCT_NAME”の下に作成するフォルダとファイル名になります。
以上、どうぞ宜しくお願い致します。
-
totojoさん
downloadFile.destinationFilePathには、希望通り次の値が格納されております。
「C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\<製品名>\<フォルダ名>\<ファイル名>.lnk」
追加情報です。
DOSプロンプトで次の操作を行った場合、ユーザーごとのスタートメニューのみ追加され、%ProgramData%のスタートメニューにはフォルダおよびファイルは作成されませんでした。
Copy "\\<サーバー名>\<フォルダ名>\<ファイル名>.lnk" "C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\<製品名>\<フォルダ名>\<ファイル名>.lnk"
私的にはFile.Copyが怪しい感じになってきておりますが、何か手がかりが御座いましたら教えてください。
-
totojoさんの言われている通りだと思います。
downloadFile.destinationFilePath:C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\<製品名>\<フォルダ名>\<ファイル名>.lnk
2.④でサーバーから1のフォルダにファイルをコピーすると、”C:\ProgramData\Microsoft\Windows\Start Menu\Programs”の下に、製品名のフォルダとファイルが作成されました。
という結果にならないはずです。
希望する通りの値が入っているかを確認すべきです。
-
佐祐理さん、ご返信ありがとうございます。
XPからの移行で、もともと正常動作していたコードになります。(抜粋したコードを記載して申し訳ありません)
「希望する通りの値が入っているかを確認すべき」ですが、XPで動作しておりますし、ブレークポイントでプロパティの値を確認することもしております。
その結果が”C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\<製品名>\<フォルダ名>\<ファイル名>.lnk”です。
また、そのリテラル値を用いて、Copyコマンドでコピーができているところも確認致しました。
※製品名が含まれることから、実際の値を掲示できずすみません。
更に追加の情報ですが、
- 拡張子がtxtのファイルの場合は、ユーザーごとのスタートメニューのみ追加され、%ProgramData%のスタートメニューには作成されませんでした。
- 手作業でユーザーごとのスタートメニューにショートカットファイル(lnk)のファイルを作成すると、%ProgramData%のスタートメニューには作成されていませんでした。
何か、簡単なサンプルコードを作成して確認した方がよいでしょうか。
以上、どうぞ宜しくお願い致します。
-
サンプルをVS2005 VBで作って確認した結果です。
・サンプル1:totojoさんと同じように、簡単なVBサンプルで確認。(サーバー上のショートカット(.lnk)を、スタートメニューにコピー
⇒OK(%ProgramData%のスタートメニューに作成されず)
・サンプル2:新規にプロジェクトを作成し、前述の不具合のあるコードをすべてコピーして実行
⇒NG(同様の不具合が発生)
サンプル1およびサンプル2は、同一のショートカットファイルをコピーしています。(1件で試しています)
コピー元、コピー先のファイルパスの値が、それぞれ同一であることをデバッグモードで確認しております。
切り分けが難しい状況となっていますが、追加情報があありましたら投稿させていただきます。
-
・サンプル1:totojoさんと同じように、簡単なVBサンプルで確認。(サーバー上のショートカット(.lnk)を、スタートメニューにコピー
⇒OK(%ProgramData%のスタートメニューに作成されず)
・サンプル2:新規にプロジェクトを作成し、前述の不具合のあるコードをすべてコピーして実行
⇒NG(同様の不具合が発生)
サンプル1およびサンプル2は、同一のショートカットファイルをコピーしています。(1件で試しています)
コピー元、コピー先のファイルパスの値が、それぞれ同一であることをデバッグモードで確認しております。
切り分けが難しい状況となっていますが、追加情報があありましたら投稿させていただきます。
この状況ですと big tsuzuki さんが作成されているコードの方に何らかの原因があるとしか思えないので、
不具合の出るコードをどんどんと絞っていって、問題を再現できる最少のコードから原因を特定するしなないと思います。