From: Masaki Suketa Date: 2010-05-25T20:22:59+09:00 Subject: [ruby-dev:41411] Re: [Bug #3339] win32ole test failure 助田です。 On Tue, May 25, 2010 at 04:25:13PM +0900, Usaku NAKAMURA wrote: > 直前のInvokeVerbが失敗してるんだろうとは思うんですが、原因を調査するには > 何をすればいいですか? > ご報告ありがとうございます。 以下に記載したスクリプトの実行結果を教えていただけますか? 期待している結果は、 (1) カレントディレクトリに test.txt ができている。 (2) test.txt へのショートカットが2つできている。 (3) 「ショートカットの作成(&S)」と出力される。 です。 # -*- encoding:Windows-31J -*- require 'win32ole' WIN32OLE.codepage = 932 fso = WIN32OLE.new('Scripting.FileSystemObject') cfolder = fso.getFolder(".") f = cfolder.CreateTextFile("test.txt") f.close shell = WIN32OLE.new('Shell.Application') nsp = shell.namespace(cfolder.path) fi = nsp.parseName("test.txt") shortcut = fi.verbs.each.collect{|verb| verb.name }.find {|name| name.unpack("C*") == [ 131, 86, 131, 135, 129, 91, 131, 103, 131, 74, 131, 98, 131, 103, 130, 204, 141, 236, 144, 172, 40, 38, 83, 41] } puts shortcut arg = WIN32OLE_VARIANT.new("ショートカットの作成(&S)") fi.InvokeVerb(arg) arg = WIN32OLE_VARIANT.new(shortcut) fi.InvokeVerb(arg) * test_folderitem2_invokeverb.rb が何をやっているか? テストは、InvokeVerbが、Win32OLE でも実行できることを確認しています。 InvokeVerbは引数を値渡しにする必要があります。 Win32OLEでは InvokeVerb("ショートカットの作成(&S)") とやると参照渡しになってしまい、ショートカットができません。 テストでは、WIN32OLE_VARIANT を使えば、引数の 値渡しが実現でき、ショートカットができることを確認しています。 助田