C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[12]: ショートカットのリンク先を取得する方法


(過去ログ 20 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■8642 / inTopicNo.1)  ショートカットのリンク先を取得する方法
  
□投稿者/ とも (1回)-(2007/10/04(Thu) 16:51:51)

分類:[VB.NET/VB2005] 

こんにちは!
いつもお世話になっております。

VB.NETでショートカットのリンク先を取得したいのですが、可能でしょうか?
引用返信 編集キー/
■8643 / inTopicNo.2)  Re[1]: ショートカットのリンク先を取得する方法
□投稿者/ 未記入 (125回)-(2007/10/04(Thu) 17:38:57)
No8642 (とも さん) に返信
> こんにちは!
> いつもお世話になっております。
>
> VB.NETでショートカットのリンク先を取得したいのですが、可能でしょうか?

可能です。WSHを使うのがもっとも手軽かな。
ちょっと検索するとヒットするでしょう。
引用返信 編集キー/
■8646 / inTopicNo.3)  Re[2]: ショートカットのリンク先を取得する方法
□投稿者/ とも (2回)-(2007/10/04(Thu) 18:56:57)
No8643 (未記入 さん) に返信
> ■No8642 (とも さん) に返信
>>こんにちは!
>>いつもお世話になっております。
>>
>>VB.NETでショートカットのリンク先を取得したいのですが、可能でしょうか?
>
> 可能です。WSHを使うのがもっとも手軽かな。
> ちょっと検索するとヒットするでしょう。

WSH で作成してみましたが、なぜか文字化けします。
何が原因かわかりますでしょうか?
引用返信 編集キー/
■8650 / inTopicNo.4)  Re[3]: ショートカットのリンク先を取得する方法
□投稿者/ ダッチ (163回)-(2007/10/04(Thu) 21:47:01)
> WSH で作成してみましたが、なぜか文字化けします。
> 何が原因かわかりますでしょうか?
なにが文字化けしたのですか?

私は WSH は使ったことは無いのですが、次のサイトを参考にしてやってみたら
文字化けすることなく、デスクトップにメモ帳のショートカットを作る事が出来ました。

ショートカットの作成
http://www.atmarkit.co.jp/fwin2k/operation/wsh06/wsh06_03.html
引用返信 編集キー/
■8652 / inTopicNo.5)  Re[4]: ショートカットのリンク先を取得する方法
□投稿者/ とも (4回)-(2007/10/04(Thu) 22:39:54)
No8650 (ダッチ さん) に返信
>>WSH で作成してみましたが、なぜか文字化けします。
>>何が原因かわかりますでしょうか?
> なにが文字化けしたのですか?
説明不足で申し訳ありません。
開発用PCでは(WinXP)動作させたときは正常にリンク先を取得するのですが、
運用環境に持っていくと(Win2000サーバー)正常に取得できないようでうs。

引用返信 編集キー/
■8654 / inTopicNo.6)  Re[5]: ショートカットのリンク先を取得する方法
□投稿者/ ぽぴ王子 (268回)-(2007/10/05(Fri) 00:08:51)
ぽぴ王子 さんの Web サイト
No8652 (とも さん) に返信

> ■No8650 (ダッチ さん) に返信
> >>WSH で作成してみましたが、なぜか文字化けします。
> >>何が原因かわかりますでしょうか?
>>なにが文字化けしたのですか?
> 説明不足で申し訳ありません。
> 開発用PCでは(WinXP)動作させたときは正常にリンク先を取得するのですが、
> 運用環境に持っていくと(Win2000サーバー)正常に取得できないようでうs。

ごめん。ちょっとだけ言わせて。
ともさんは「文字化けした」としか書いていないので、それだけで何が原因かと言われても「さぁ?」としか
答えようがないんですよ。
なので、ダッチさんは「 な に が 文字化けしたのですか?」と書いてるです。

それに対するともさんの返答が
「運用環境に持っていくと正常に取得できない」

…あれ?答えになってないですよ?

困っているのはわかるのだけど、聞かれたことにはちゃんと答えた方がいいと思います。
そうじゃないと誰も答えてくれなくなっちゃいます。
引用返信 編集キー/
■8655 / inTopicNo.7)  Re[5]: ショートカットのリンク先を取得する方法
□投稿者/ 魔界の仮面弁士 (445回)-(2007/10/05(Fri) 00:26:17)
No8652 (とも さん) に返信
> 開発用PCでは(WinXP)動作させたときは正常にリンク先を取得するのですが、
> 運用環境に持っていくと(Win2000サーバー)正常に取得できないようでうs。

それだけでは、何が問題なのかわかりません。(権限不足/コードの間違い等々)
まずは、実際のソースを見せてもらえますか?


# 別案。VB2005用。
# http://www.vb-user.net/junk/replySamples/2007.10.05.00.23/ShortcutReader.zip
引用返信 編集キー/
■8659 / inTopicNo.8)  Re[6]: ショートカットのリンク先を取得する方法
□投稿者/ とも (5回)-(2007/10/05(Fri) 11:18:46)
皆さん説明不足ですいません。
以下のコードで指示の部分で問題が発生しています。


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim WSH As Object
Dim WshSCut As Object
Dim X1 As String
Dim XX As String = Me.TextBox1.Text

X1 = XX
If LCase(IO.Path.GetExtension(Me.TextBox1.Text)) = ".lnk" Or LCase(IO.Path.GetExtension(XX)) = ".url" Then
WSH = CreateObject("WScript.Shell")

WshSCut = WSH.CreateShortcut(XX)
X1 = WshSCut.TargetPath    ←ここで問題の値になる。
WSH = Nothing
WshSCut = Nothing
End If

MsgBox(X1)
End Sub
引用返信 編集キー/
■8661 / inTopicNo.9)  Re[7]: ショートカットのリンク先を取得する方法
□投稿者/ 魔界の仮面弁士 (446回)-(2007/10/05(Fri) 12:14:49)
No8659 (とも さん) に返信
> 以下のコードで指示の部分で問題が発生しています。
> X1 = WshSCut.TargetPath    ←ここで問題の値になる。

その『問題』についての説明を、具体的にお願いします。

  何という値が得られるはずなのに、
  どのようなデータになってしまうのか。
引用返信 編集キー/
■8663 / inTopicNo.10)  Re[8]: ショートカットのリンク先を取得する方法
□投稿者/ とも (6回)-(2007/10/05(Fri) 13:20:20)
No8661 (魔界の仮面弁士 さん) に返信
> ■No8659 (とも さん) に返信
>>以下のコードで指示の部分で問題が発生しています。
>> X1 = WshSCut.TargetPath    ←ここで問題の値になる。
>
> その『問題』についての説明を、具体的にお願いします。
>
>   何という値が得られるはずなのに、
>   どのようなデータになってしまうのか。

次のようになります。
正しいリンク先:\\aa\bb\cc\dd\TEST-AA12345ああ
おかしいリンク先:\\aa\bb\cc\dd\TEST-A~1
となってしまいます。
引用返信 編集キー/
■8664 / inTopicNo.11)  Re[9]: ショートカットのリンク先を取得する方法
□投稿者/ 魔界の仮面弁士 (447回)-(2007/10/05(Fri) 13:40:31)
No8659 (とも さん)
> WshSCut = Nothing
COM オブジェクトの解放が目的なら、Nothing を代入するのではなく、
Marshal.ReleaseComObject メソッドを呼び出す必要があります。


■No8646 (とも さん)
> なぜか文字化けします。No8663 (とも さん)
> 正しいリンク先:\\aa\bb\cc\dd\TEST-AA12345ああ
> おかしいリンク先:\\aa\bb\cc\dd\TEST-A~1

それは、『文字化け』ではないと思いますよ。
単に短い形式のファイル名(8.3 形式)で表現されているだけであり、正しいパスを指しているかと。


ショートカット自体が、短い方の名前で登録されているか、または何らかの理由で
短い方の名前が帰ってきているのではないでしょうか。


少なくとも当方の Windows Server 2003 の環境では、下記のコードにて、期待する結果が得られています。


Imports System
Imports System.IO.File
Imports System.IO.Path
Imports System.Runtime.InteropServices.Marshal
Public Class Sample
  Public Shared Sub Main(ByVal args() As String)
    Dim file As String = "C:\Sample.lnk"
    If args.Length > 0 Then file = args(0)

    If Not Exists(file)
      Console.WriteLine(file & "が見つかりません。")
      Exit Sub
    End If

    Dim ext As String = GetExtension(file).ToLower()
    If ext <> ".lnk" AndAlso ext <> ".url" Then
      Console.WriteLine(file & "は利用できません。")
      Console.WriteLine("拡張子 .LNK または .URL のファイル名を指定してください。")
      Exit Sub
    End If

    Dim O As Object = Nothing
    Dim L As Object = Nothing
    Try
      O = CreateObject("WScript.Shell")
      L = O.CreateShortcut( file )

      Console.WriteLine( file & "のリンク先:")
      Console.WriteLine( L.TargetPath )
    Catch e As Exception
      Console.WriteLine( e.ToString() )
    Finally
      If L IsNot Nothing Then ReleaseComObject(L)
      If L IsNot Nothing Then ReleaseComObject(O)
    End Try
  End Sub
End Class


それで駄目なら、別の方法を試してみるのも手かと。

今回使用した WshShortcut オブジェクトによる方法や、私の No8655 のような方法以外にも、
ShellLinkObject オブジェクトを使う方法などもあるわけですし。

引用返信 編集キー/
■8665 / inTopicNo.12)  Re[10]: ショートカットのリンク先を取得する方法
□投稿者/ とも (7回)-(2007/10/05(Fri) 14:10:54)
2007/10/05(Fri) 14:13:59 編集(投稿者)

魔界の仮面弁士さん
ありがとうございます。
やはり解決しませんでした。
どうもWinXPで作ったショートカットをWIN2000サーバーに持って行くとリンク先が文字化け(ファイル名(8.3 形式)関連?)
するようです。
http://support.microsoft.com/kb/940077/ja
ここにある内容を修正してもなおらないのでお手上げかも知れません。

\\aa\bb\cc\dd\00-あああ程2?????\00-MCPP*?????
\\aa\bb\cc\dd\00-あああ程(AA文書)\00-MCPPAキ

ちなみにWIN2000サーバー内で作成したショートカットは正常に表示できました・・・。


引用返信 編集キー/
■8666 / inTopicNo.13)  Re[11]: ショートカットのリンク先を取得する方法
□投稿者/ 魔界の仮面弁士 (448回)-(2007/10/05(Fri) 15:02:41)
No8665 (とも さん) に返信
> どうもWinXPで作ったショートカットをWIN2000サーバーに持って行くと
なるほど、Win2000 機を用意して、そちらにコピーしてみたら
現象が再現しました。

> http://support.microsoft.com/kb/940077/ja
> ここにある内容を修正してもなおらないのでお手上げかも知れません。
状況を確認すると、
 (1) XP機のレジストリを修正し、PCを再起動。
 (2) そのXP機で、ショートカットを再作成。
 (3) それをWin2000サーバにコピー。
 (4) Win2000 上で、そのプロパティを見ると、リンクが化けていた。
という事でしょうか。
プロパティ画面で見て化けるなら、プログラムでも取得できないかも…。

> \\aa\bb\cc\dd\00-あああ程2^C^D?????^T\00-MCPP*^C^D^D?????^T
> \\aa\bb\cc\dd\00-あああ程(AA文書)\00-MCPPAキ
こちらは先ほどの例とは異なり、完全に文字化けしてしまっていますね。

試すのであれば、IShellLinkA / IShellLinkW それぞれのインターフェイスで、
GetPath メソッドの最後の引数に、SLGP_SHORTPATH フラグを試してみて、
「文字化けしていない短い形式のままで」取得できないか調査するとか。
引用返信 編集キー/
■8674 / inTopicNo.14)  Re[12]: ショートカットのリンク先を取得する方法
□投稿者/ mあ (91回)-(2007/10/06(Sat) 01:47:23)
2007/10/06(Sat) 02:07:07 編集(投稿者)
2007/10/06(Sat) 01:55:45 編集(投稿者)

WSHのバージョンは?

5.6 入っていますか?

うちにも、Win2K マシンありますが、それに標準で入ってるWSHには結構バグがあったよーな、
まともに使いたいなら、5.6 以上入れてくれ、ってどこかで読んで、直に更新した記憶がある
けど。

http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/install.htm
ここみると、Win2Kの標準コンポーネントのバージョンは2.0 だそーな。
記憶が曖昧で申し訳ないが、Win2K はショートネームの解決がうまく
いかない、ってどこかで見たよーな肝するが・・・嘘かもしれない。


WSHは (旧)WindowsUpdate では更新対象にはならない
からね。必要なら勝手に自己判断でインストールしてく
ださい、って趣旨だった肝する。

引用返信 編集キー/
■8717 / inTopicNo.15)  Re[13]: ショートカットのリンク先を取得する方法
□投稿者/ とも (8回)-(2007/10/09(Tue) 08:22:19)
いろいろ調べてみましたが解決しそうにありません・・・。
また何かお気づきの点あれば教えてください。
ありがとうございました。
引用返信 編集キー/
■8724 / inTopicNo.16)  Re[14]: ショートカットのリンク先を取得する方法
□投稿者/ 774RR (52回)-(2007/10/09(Tue) 10:09:12)
なにが解決してないのかわからないけど、結局のところ Microsoft の仕様どおりなのでは?
KB940077 をよく読んだのかな?

> 上記変更の適用後、Windows XP で新たに作成されるフォルダやファイルにおいて、
> ショート ネームの情報が保持されなくなります。
と書いてあるぞ。つまり
**レジストリを変更する前に作ってあるファイルに関しては
**レジストリ変更後にショートカットを作ったとしても
**ショートカット内にはロングファイル名とショートファイル名が両方記録される
→W2K はショートカット内にロングとショートと両方ある場合にはショートファイル名を採用する
→→文字化けは直らない
ということだ。

XP側で **レジストリ変更後にロングファイル名なファイルを作り**
それへのショートカットを作ってみるテストをしたけど W2K でも文字化けしてないぞ。

W2K の挙動を変更するレジストリ(ショートカット中のショートファイル名を使わないようにする)が
あれば解決かな?俺はそこまで調べてないので、もう少し調査してみれば吉かも。

引用返信 編集キー/
■8733 / inTopicNo.17)  Re[12]: ショートカットのリンク先を取得する方法
□投稿者/ 魔界の仮面弁士 (452回)-(2007/10/09(Tue) 11:51:22)
No8666 (魔界の仮面弁士) に追記
> 試すのであれば、IShellLinkA / IShellLinkW それぞれのインターフェイスで、
> GetPath メソッドの最後の引数に、SLGP_SHORTPATH フラグを試してみて、
> 「文字化けしていない短い形式のままで」取得できないか調査するとか。

A/W それぞれのインターフェイスで、SLGP フラグのすべての組み合わせを
試してみましたが、No8665 の文字化けは改善されませんでした。m(_ _)m

ということで、プログラム側での対応は無理だと思います。
KB940077 にあるように、環境側の対応で凌ぐしかないかと。

# 残る道となると、lnk ファイルのバイナリを自己解析するぐらいしか……。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -