IPersistFile::Loadでエラー「パス名が見つかりません」が出る – プログラミング – Home

通知
すべてクリア

IPersistFile::Loadでエラー「パス名が見つかりません」が出る


siva
 siva
(@siva)
ゲスト
結合: 13年前
投稿: 7
Topic starter  

自作インストーラでウィンドウズのスタートボタンから開く「プログラム(P)」の下にフォ
ルダ「×××××」(漢字5文字)を作成し、その下に「×××××.lnk」という名前の
ショートカットを生成するプログラムを作成しXinXP、Win7共に正常に動作しています

次に別のプログラムでスタートボタンからたどり目的である「×××××.lnk」のパスを見
つけショートカットの内容を取得しようとするとWinXPでは正常に動作するのに、Win7
で実行するとIPersistFile::Loadコマンドで「パスが見つかりません」のエラーが発生
し取得できません。
Win7では途中でなにか処理をいれないとだめなのでしょうか?
どなたかご存知の方はいらっしゃいませんか?

ちなみにWinXP場合ショートカットのパスは
D:\Documents and Settings\「ユーザー名」\スタートメニュー\プログラム\×××××\××××
×.lnk

でWin7の場合
C:\Users\siva\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\×××××
\×××××.lnk

です。宜しくお願いいたします。


引用解決済
トピックタグ
ドナドナ
 ドナドナ
(@ドナドナ)
ゲスト
結合: 13年前
投稿: 2
 

もっと短いパスにリンクファイルを置いても失敗しますか?
c:\temp\×××××.lnk
とか漢字ではないリンクファイルとか。


返信引用
siva
 siva
(@siva)
ゲスト
結合: 13年前
投稿: 7
Topic starter  

c:\temp\×××××.lnk
の場合はWinXP、Win7共にIPersistFile::Loadは正常に動作しました。
あとWin7のエクスプローラでショートカットのプロパティを見たところ
ショートカットの場所が
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\×××××
となっていますがSHGetSpecialHolerLocationでプログラムフォルダを
取得し、そこから目的のフォルダへたどると上記Win7のときのパスに
なってしまいます。プロパティで表示されるパスを取得するための方法
が判りません


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

Windows7と言うことなのでUAC絡みではないかと思うのですが、
その辺の検討はされましたか?

XPと違ってWin7ではアクセス権に関して厳しくなっているので
XPと同じ感覚でフォルダを扱っていると躓く事が多いです。
パスの中にRoamingが入っているので書き込み権のないフォルダに書き込もうとしてリダ
イレクションされているように見えます。
書き込み権がないフォルダに書き込もうとしているのであれば、解決策はなんらか出て
きそうな気がします。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

すいません、Loadですね。

インストーラーは管理者権限を持っているので目的の場所にアクセスできるけれど
別のプログラムの方は権限がないのでリダイレクションされているのではと言う点では
同じです。
やはりUAC関連で調べて見られた方がよいと思います。


返信引用
ドナドナ
 ドナドナ
(@ドナドナ)
ゲスト
結合: 13年前
投稿: 2
 

「パスが見つかりません」ならその通りだと思うのですが
c:\temp\は大丈夫ということなので

>C:\Users\siva\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\~
を階層ごとに「×××××.lnk」を配置してどの階層でエラーが出ているのか
試してみては?
エラーメッセージはGetLastError()の番号から取得したメッセージですよね?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

言いたい事をまとめ直してみます。

インストーラーの方は権限があるので指定した位置にlnkファイルを作成できている。
ところが参照をしようとしている側は権限がないのでリダイレクトされたパスを参照し
ようとしているが、そもそもその位置には作成したlnkファイルは存在しないので「パス
が見つかりません」が発生している。

質問者がLoad時に「パスが見つかりません」が発生していると書かれているので
そういう判断でよいのではと思いました。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

C:\tempと言うフォルダを自分作成したのだったらアクセス権があると思うのでうまく行
くのではないかと思います。
明らかにアクセス権がなさそうなところで試してみると結果が出るのではないかなぁ。
要はリダイレクションされてパスが読み替えられてしまっている事が問題のような気が
します。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

こんな情報を見つけましたが、関係ありませんか?
UACとは若干違うかもですが。

フォルダー リダイレクトの概要
http://technet.microsoft.com/ja-jp/library/cc732275(v=ws.10).aspx


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> パスの中にRoamingが入っているので書き込み権のないフォルダに書き込もうとして
> リダイレクションされているように見えます。

それだったら C:\Users\Hoge\AppData\Local\VirtualStore になります。

> あとWin7のエクスプローラでショートカットのプロパティを見たところ
> ショートカットの場所が
> C:\ProgramData\Microsoft\Windows\Start Menu\Programs\×××××
> となっていますがSHGetSpecialHolerLocationでプログラムフォルダを
> 取得し、そこから目的のフォルダへたどると上記Win7のときのパスに
> なってしまいます。プロパティで表示されるパスを取得するための方法
> が判りません

C:\Users\Hoge\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\
はユーザーごとのフォルダーで、

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\
は全ユーザー共通のフォルダーです。

通常のユーザー権限では、全ユーザー共通のフォルダーは読めますが書き込めません。

CSIDL で言うと、ユーザーごとのフォルダーは CSIDL_PROGRAMS で、
全ユーザー共通のフォルダーは、CSIDL_COMMON_PROGRAMS です。

Windows 7 からは SHGetKnownFolderPath 関数を使うことが推奨されます。

IPersistFile::Load の前に、ショートカットのパスをどうやって取得していますか?
ショートカットファイルが確かに
C:\Users\Hoge\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\
にあることを確認していますか?

実は C:\ProgramData\Microsoft\Windows\Start Menu\Programs\××××× にあるので
は…。
だとしたら、いくら C:\Users\ の方を読もうとしても読めませんね。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

すみません、勘違いで突っ走ってしまったようです。

aetosさんの内容を読んでなるほどと思いました。

> 実は C:\ProgramData\Microsoft\Windows\Start Menu\Programs\××××× にあるの
> では…。
> だとしたら、いくら C:\Users\ の方を読もうとしても読めませんね。

このケースはありえるんじゃないかと思います。
書き込んだ先と読み込もうとしている先が一致していないと言う話ですよね。
インストーラーがどこに書き込んだのかと言うことになりますね。


返信引用
siva
 siva
(@siva)
ゲスト
結合: 13年前
投稿: 7
Topic starter  

インストーラーはCSIDL_PROGRAMSを指定しています。
XP、Win7ともにショートカットは作成されています。
が、XPは2ユーザ設定になっており、インストーラを起動したのがユーザー2の方だっ
た為今度はCSIDL_COMMON_PROGRAMSではショートカットを発見できなくなってしまいまし
た。
結局CSIDL_PROGRAMSとCSIDL_COMMON_PROGRAMSの両方を使用し、ショートカットへのアク
セスをするようにして見ます。


返信引用
siva
 siva
(@siva)
ゲスト
結合: 13年前
投稿: 7
Topic starter  

一つ判らない事があります。
Win7でCSIDL_PROGRAMSの指定で得たパス
C:\Users\siva\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
を使用してショートカットの作成をしたときはIPersistFile::Save()はエラーを起こさ
ないでショートカットは作成できたのに、読み込もうとしたIPersistFile::Load()の方
だけエラーを起こしたのでしょうか?普通は書き込みの方でエラーが出るのが当たり前
なのではないでしょうか?


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました