none
Windows7でプログラムメニューに追加する方法 RRS feed

  • 質問

  • 鈴木と申します。

    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の仕様なのでしょうか。

     

    以上、ご回答いただけると幸いです。

     

    2011年8月3日 2:15

回答

  • File.Copy を呼び出す時点で downloadFile.destinationFilePath には希望通りのパスが入っているのでしょうか?
    これは重要な点ですので、ちゃんと確認しておいた方がいいと思います。
    • 回答の候補に設定 山本春海 2011年8月16日 8:29
    • 回答としてマーク 山本春海 2011年8月26日 5:04
    2011年8月4日 1:47
  • UNC のショートカット (.lnk) をスタート メニューにコピーするだけの簡単なサンプルを VB で作って試してみましたが、そのような現象は再現できませんでした。
    ですので、File.Copy が怪しいということではなさそうです。

    何か特殊な条件でもあるのでしょうかね。

    • 回答としてマーク 山本春海 2011年8月26日 5:04
    2011年8月4日 7:10

すべての返信

  • 3ではprogramMenuDirectoryにディレクトリー作成していますが、4ではdownloadFile.destinationFilePathにコピーしているように見えますが。

    同じ場所に操作したいのなら、同じパスを使うべきでは? そして、質問には書かれていないdownloadFile.destinationFilePathの値を設定している部分に原因があるのかと思います。

    2011年8月3日 2:38
  • 佐祐理さん、ご返信ありがとうございます。

    ソースの説明に必要な部分を抜粋して投稿したため、4の値を記述し忘れておりましたので追記致します。

    downloadFile.sourceFilePath,:\\<サーバー名>\<フォルダ名>\<ファイル名>.lnk

    downloadFile.destinationFilePath:C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\<製品名>\<フォルダ名>\<ファイル名>.lnk

    「downloadFile.destinationFilePath」は、”SpecialDirectories.Programs & "\" & PRODUCT_NAME”の下に作成するフォルダとファイル名になります。

    以上、どうぞ宜しくお願い致します。

    2011年8月4日 0:30
  • File.Copy を呼び出す時点で downloadFile.destinationFilePath には希望通りのパスが入っているのでしょうか?
    これは重要な点ですので、ちゃんと確認しておいた方がいいと思います。
    • 回答の候補に設定 山本春海 2011年8月16日 8:29
    • 回答としてマーク 山本春海 2011年8月26日 5:04
    2011年8月4日 1:47
  • 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が怪しい感じになってきておりますが、何か手がかりが御座いましたら教えてください。

     

    2011年8月4日 2:08
  • totojoさんの言われている通りだと思います。

    downloadFile.destinationFilePath:C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\<製品名>\<フォルダ名>\<ファイル名>.lnk

    この値が入っているならば

    2.④でサーバーから1のフォルダにファイルをコピーすると、”C:\ProgramData\Microsoft\Windows\Start Menu\Programs”の下に、製品名のフォルダとファイルが作成されました。

    という結果にならないはずです。

    希望する通りの値が入っているかを確認すべきです。

    2011年8月4日 2:13
  • 佐祐理さん、ご返信ありがとうございます。

     

    XPからの移行で、もともと正常動作していたコードになります。(抜粋したコードを記載して申し訳ありません)

    「希望する通りの値が入っているかを確認すべき」ですが、XPで動作しておりますし、ブレークポイントでプロパティの値を確認することもしております。

    その結果が”C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\<製品名>\<フォルダ名>\<ファイル名>.lnk”です。

    また、そのリテラル値を用いて、Copyコマンドでコピーができているところも確認致しました。

    ※製品名が含まれることから、実際の値を掲示できずすみません。

     

    更に追加の情報ですが、

    • 拡張子がtxtのファイルの場合は、ユーザーごとのスタートメニューのみ追加され、%ProgramData%のスタートメニューには作成されませんでした。
    • 手作業でユーザーごとのスタートメニューにショートカットファイル(lnk)のファイルを作成すると、%ProgramData%のスタートメニューには作成されていませんでした。

     

    何か、簡単なサンプルコードを作成して確認した方がよいでしょうか。

    以上、どうぞ宜しくお願い致します。

     

     

     

    2011年8月4日 3:49
  • UNC のショートカット (.lnk) をスタート メニューにコピーするだけの簡単なサンプルを VB で作って試してみましたが、そのような現象は再現できませんでした。
    ですので、File.Copy が怪しいということではなさそうです。

    何か特殊な条件でもあるのでしょうかね。

    • 回答としてマーク 山本春海 2011年8月26日 5:04
    2011年8月4日 7:10
  • 再現確認して頂きましてありがとうございます。

    こちらでは、2台(Windows7-64bit)とも同じ現象がでておりまして、私も簡単なサンプルを作って現象の切り分けをしてみたいと思います。

    結果ご報告致します。

    どうもありがとうございます。

    2011年8月4日 7:47
  • サンプルをVS2005 VBで作って確認した結果です。

     

    ・サンプル1:totojoさんと同じように、簡単なVBサンプルで確認。(サーバー上のショートカット(.lnk)を、スタートメニューにコピー

    ⇒OK(%ProgramData%のスタートメニューに作成されず)

     

    ・サンプル2:新規にプロジェクトを作成し、前述の不具合のあるコードをすべてコピーして実行

    ⇒NG(同様の不具合が発生)

     

    サンプル1およびサンプル2は、同一のショートカットファイルをコピーしています。(1件で試しています)

    コピー元、コピー先のファイルパスの値が、それぞれ同一であることをデバッグモードで確認しております。

     

    切り分けが難しい状況となっていますが、追加情報があありましたら投稿させていただきます。

    2011年8月5日 4:50
  • コピー元、コピー先のファイルパスの値が、それぞれ同一であることをデバッグモードで確認しております。

    この確認が正確にできていないことを疑っています。

    File.Copyの行をコメントアウトして実行しても、意図しない場所にファイルがコピーされたりしませんか?

    File.Copyの行の直後にMessageBoxでdownloadFile.destinationFilePathの値を表示してみてください。意図しないパスに書き換わっていたりしませんか?

    2011年8月5日 5:13
  • ・サンプル1:totojoさんと同じように、簡単なVBサンプルで確認。(サーバー上のショートカット(.lnk)を、スタートメニューにコピー

    ⇒OK(%ProgramData%のスタートメニューに作成されず)

     

    ・サンプル2:新規にプロジェクトを作成し、前述の不具合のあるコードをすべてコピーして実行

    ⇒NG(同様の不具合が発生)

     

    サンプル1およびサンプル2は、同一のショートカットファイルをコピーしています。(1件で試しています)

    コピー元、コピー先のファイルパスの値が、それぞれ同一であることをデバッグモードで確認しております。

     

    切り分けが難しい状況となっていますが、追加情報があありましたら投稿させていただきます。


    この状況ですと big tsuzuki さんが作成されているコードの方に何らかの原因があるとしか思えないので、
    不具合の出るコードをどんどんと絞っていって、問題を再現できる最少のコードから原因を特定するしなないと思います。
    2011年8月5日 5:13