Project

General

Profile

Bug #3339

win32ole test failure

Added by usa (Usaku NAKAMURA) over 10 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
ruby 1.9.3dev (2010-05-25 trunk 28007) [i386-mswin32]
Backport:
[ruby-dev:41407]

Description

=begin
win32oleのテストが1件失敗します。
環境はWindows 7(32bit)です。
直前のInvokeVerbが失敗してるんだろうとは思うんですが、原因を調査するには
何をすればいいですか?

1) Failure:
test_invokeverb(TestInvokeVerb) [test/win32ole/test_folderitem2_invokeverb.rb:75]:
expected but was
.
=end

#1

Updated by suke (Masaki Suketa) over 10 years ago

=begin
助田です。

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 を使えば、引数の
値渡しが実現でき、ショートカットができることを確認しています。

助田

=end

#2

Updated by usa (Usaku NAKAMURA) over 10 years ago

=begin
こんにちは、なかむら(う)です。

In message "[ruby-dev:41411] Re: [Bug #3339] win32ole test failure"
on May.25,2010 20:22:59, masaki.suketa@nifty.ne.jp wrote:

以下に記載したスクリプトの実行結果を教えていただけますか?
期待している結果は、
(1) カレントディレクトリに test.txt ができている。
(2) test.txt へのショートカットが2つできている。
(3) 「ショートカットの作成(&S)」と出力される。
です。

(1) 0バイトのファイル test.txt が作成される
(2) ショートカットは一切作成されていない
(3) 「ショートカットの作成(&S)」は出力されている。

InvokeVerbの実行結果(HRESULTとか)を取る方法とかないんですかね
え。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#3

Updated by suke (Masaki Suketa) over 10 years ago

=begin
助田です。

On Tue, May 25, 2010 at 08:44:06PM +0900, U.Nakamura wrote:

(1) 0バイトのファイル test.txt が作成される
(2) ショートカットは一切作成されていない
(3) 「ショートカットの作成(&S)」は出力されている。

ありがとうございます。

うーん。よくわからないです...。
(3) が出力されているということは、ちゃんとエクスプローラの
コンテキストメニューに「ショートカットの作成(&S)」はあるみ
たいですね。

InvokeVerbの実行結果(HRESULTとか)を取る方法とかないんですかね
え。

Cレベルでは、InvokeVerbを実行したときに、HRESULTを見てます。
で、HRESULTがエラーなら、Win32OLERuntimeError になるはずなんで
すよね。
逆にHRESULTが0なのにメソッドが実は失敗しているというのは
Win32OLEでは拾えないです...。

試しに最後の1行を
fi.InvokeVerb("ショートカットの作成(&S)")
としたらどうなりますか?

最後の行のところで、メモ帳が起動(コンテキストメニューの一番
上の動作「開く」が実行される)しますか?

助田

=end

#4

Updated by usa (Usaku NAKAMURA) over 10 years ago

=begin
こんにちは、なかむら(う)です。

In message "[ruby-dev:41413] Re: [Bug #3339] win32ole test failure"
on May.25,2010 21:50:28, masaki.suketa@nifty.ne.jp wrote:

うーん。よくわからないです...。
(3) が出力されているということは、ちゃんとエクスプローラの
コンテキストメニューに「ショートカットの作成(&S)」はあるみ
たいですね。

ありますね。
ちょっとドキドキしながら確認しましたが、エクスプローラのコン
テキストメニューからならショートカットもちゃんと作成されます。

InvokeVerbの実行結果(HRESULTとか)を取る方法とかないんですかね
え。

Cレベルでは、InvokeVerbを実行したときに、HRESULTを見てます。
で、HRESULTがエラーなら、Win32OLERuntimeError になるはずなんで
すよね。
逆にHRESULTが0なのにメソッドが実は失敗しているというのは
Win32OLEでは拾えないです...。

ああ、なるほど...

試しに最後の1行を
fi.InvokeVerb("ショートカットの作成(&S)")
としたらどうなりますか?

最後の行のところで、メモ帳が起動(コンテキストメニューの一番
上の動作「開く」が実行される)しますか?

ちゃんとメモ帳が起動しやがりました。
ということは、ピンポイントで「ショートカットの作成」だけが実
行できない秘密があるんですかねえ。

しかし、これが起きてるのが実はうちだけだったら嫌だな。
誰か他に再現する人いますか?
私の他の環境だと、例えばXP x64 + ruby mswin64版ではこの問題は
発生していません。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#5

Updated by tarui (Masaya Tarui) over 10 years ago

=begin
樽家です。

しかし、これが起きてるのが実はうちだけだったら嫌だな。
誰か他に再現する人いますか?
私の他の環境だと、例えばXP x64 + ruby mswin64版ではこの問題は
発生していません。

私の環境だと実はこのテスト、gitのシェル拡張らしきdllに突入してそのなかでロックしてしまいます。どう見ても環境依存なのと調べるのが難しそうだったのでしばらくテストから外してました。

外出先なので帰ったら再度詳しく書きます。

--
樽家昌也(Masaya TARUI)
No Tool,No Life.

=end

#6

Updated by suke (Masaki Suketa) over 10 years ago

=begin
助田です。

On Wed, May 26, 2010 at 12:27:29PM +0900, H. Shimura wrote:

しかし、これが起きてるのが実はうちだけだったら嫌だな。
誰か他に再現する人いますか?
私の他の環境だと、例えばXP x64 + ruby mswin64版ではこの問題は
発生していません。

手元の Windows7 Pro.(64bit)、
ruby 1.9.1p243 (2009-07-16 revision 24175) i386-mswin32
で再現します。

Windows7 だと駄目なんでしょうかね。

偶然、こんなのを見つけました。
http://logicalerror.seesaa.net/article/127271246.html

VBScript の例なんですが、コードの下にある説明の中に、
Vista で InvokeVerb に日本語の引数を渡すと動かなくて
英語の properties を渡すと動く(XPでは日本語でも
動作する)と書いてあるのが気になります。

試しに、Windows7の環境で、日本語をやめて
arg = WIN32OLE_VARIANT.new("Create Shortcut(&S)")
fi.InvokeVerb(arg)
とやったらどうなりますか?

今だにVistaもWindows7も触ったことがなくてXP専門
助田

=end

#7

Updated by suke (Masaki Suketa) over 10 years ago

=begin
助田です。
すいません。

On Wed, May 26, 2010 at 09:34:58PM +0900, Masaki Suketa wrote:

試しに、Windows7の環境で、日本語をやめて
arg = WIN32OLE_VARIANT.new("Create Shortcut(&S)")
fi.InvokeVerb(arg)
とやったらどうなりますか?

上のに追加で、
fi.InvokeVerb(("Create Shortcut(&S)")
というのも、試してみていただけますか?

助田

=end

#8

Updated by usa (Usaku NAKAMURA) over 10 years ago

=begin
こんにちは、なかむら(う)です。

In message "[ruby-dev:41426] Re: [Bug #3339] win32ole test failure"
on May.26,2010 21:46:25, masaki.suketa@nifty.ne.jp wrote:

試しに、Windows7の環境で、日本語をやめて
arg = WIN32OLE_VARIANT.new("Create Shortcut(&S)")
fi.InvokeVerb(arg)
とやったらどうなりますか?

何も起きないままですねえ。

上のに追加で、
fi.InvokeVerb(("Create Shortcut(&S)")
というのも、試してみていただけますか?

メモ帳が無事に立ち上がります。

どうでもいいですが、「&」の前の「\」にはなんか深い意味があり
ますか?
一応、「\」なし、「\」あり、「\」と試しましたが違いは特にな
さそうです。

あと、この場合正しい指定は "Create &Shortcut" のような気もし
たのでそちらも試しましたが、状況に変化はありませんでした。

とかやってるとキリがなさそうなので、念のためWSHを使って同等の
処理を実行してみましたが、同様に日本語だろうが英語だろうがエ
ラーなしでショートカットも作成されませんでした。
なんだかわかんないけど何か問題があるんでしょうねえ。
どうしましょ。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#9

Updated by suke (Masaki Suketa) over 10 years ago

=begin
助田です。

On Wed, May 26, 2010 at 11:09:54PM +0900, U.Nakamura wrote:

どうでもいいですが、「&」の前の「\」にはなんか深い意味があり
ますか?

言われてみれば、特に意味はありませんでした。

とかやってるとキリがなさそうなので、念のためWSHを使って同等の
処理を実行してみましたが、同様に日本語だろうが英語だろうがエ
ラーなしでショートカットも作成されませんでした。
なんだかわかんないけど何か問題があるんでしょうねえ。
どうしましょ。

いろいろすいません。
お手数ですが、InvokeVerb の代わりに、InvokeVerbEx を
使うとどうなりますか?

元々本当にやりたいテストは、
値渡ししか受け付けないCOMのメソッドの場合に
WIN32OLE_VARIANT を使えば、値渡しで呼び出すことができるか?
ということなので、InvokeVerb に拘りはありません。

InvokeVerbが動かないのは、それはそれで問題かも知れませんが
WSHでも動かないのなら、ちょっと手が出せそうにないし...。

助田

=end

#10

Updated by usa (Usaku NAKAMURA) over 10 years ago

=begin
こんにちは、なかむら(う)です。

In message "[ruby-dev:41428] Re: [Bug #3339] win32ole test failure"
on May.27,2010 00:08:03, masaki.suketa@nifty.ne.jp wrote:

いろいろすいません。
お手数ですが、InvokeVerb の代わりに、InvokeVerbEx を
使うとどうなりますか?

現象に変化なし、です。

そういえば言い忘れていましたが、verbのDoItを直接呼べば無事に
ショートカットは作成されます。
InvokeVerbとVistaでぐぐると、なんか動かんからDoIt呼ぶように変
えたら動いた、という事例は幾つか散見されますね。
でも原因まで報告してる人はいなさそうです。

元々本当にやりたいテストは、
値渡ししか受け付けないCOMのメソッドの場合に
WIN32OLE_VARIANT を使えば、値渡しで呼び出すことができるか?
ということなので、InvokeVerb に拘りはありません。

InvokeVerbが動かないのは、それはそれで問題かも知れませんが
WSHでも動かないのなら、ちょっと手が出せそうにないし...。

うーん。
せめて原因がわかればすっきりするんですが...

そういえば、絶対にverbとして存在しない文字列をWIN32OLE_VARIANT
化してInvokeVerbに渡してもやはりノーエラーで何も起きないまま
になります。
ので、もしこちら側に問題があるとしたら、間違ったものを渡して
いる可能性はありますね。
# WSHの結果を見る限り、たぶん違うと思いますが

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#11

Updated by suke (Masaki Suketa) over 10 years ago

=begin
助田です。

On Thu, May 27, 2010 at 09:44:49AM +0900, U.Nakamura wrote:

現象に変化なし、です。

そうですか。残念。

そういえば言い忘れていましたが、verbのDoItを直接呼べば無事に
ショートカットは作成されます。

なるほど、Ruby 経由(Win32OLE)だからショートカットが作れない
ということではないのですね。

InvokeVerbとVistaでぐぐると、なんか動かんからDoIt呼ぶように変
えたら動いた、という事例は幾つか散見されますね。

そうなんですよ。

ので、もしこちら側に問題があるとしたら、間違ったものを渡して
いる可能性はありますね。

WSHの結果を見る限り、たぶん違うと思いますが

そうですね。
ただ、WIN32OLE_VARIANT を使えば、第2引数で型指定することで
適切な渡し方ができるようになるのかも知れないです。
そのための WIN32OLE_VARIANT なのです。

WIN32OLE_VARIANT を使うことで呼び出しができる
Windows標準で提供されるCOMのメソッドが他にあれば
そっちに変更するんですけど、InvokeVerb(Ex) 以外に
そういうメソッドを知らないのです。
(使っても使わなくても呼び出せるメソッドは結構あるはずです。)

助田

=end

#12

Updated by tarui (Masaya Tarui) over 10 years ago

=begin
樽家です。

しかし、これが起きてるのが実はうちだけだったら嫌だな。
誰か他に再現する人いますか?
私の他の環境だと、例えばXP x64 + ruby mswin64版ではこの問題は
発生していません。

私の環境だと実はこのテスト、gitのシェル拡張らしきdllに突入してそのなかでロックしてしまいます。どう見ても環境依存なのと調べるのが難しそうだったのでしばらくテストから外してました。

外出先なので帰ったら再度詳しく書きます。

これについて、大分古い話になってしまいましたが、
あれから何度か追試をしてたんですが、再現しなくなってしまったため忘れてください。
すいません。

=end

#13

Updated by mame (Yusuke Endoh) over 10 years ago

=begin
遠藤です。

この件、今はもう手の出し方を思いつかないということでいいですか。

手が出せないものはしょうがないので、新たな手がかりが出てくるまで
優先度を Low にするということでどうでしょう。
反対がなければ勝手にやってしまいます。

--
Yusuke Endoh mame@tsg.ne.jp
=end

#14

Updated by suke (Masaki Suketa) over 10 years ago

=begin
助田です。

On Fri, Jun 18, 2010 at 02:52:51AM +0900, Yusuke Endoh wrote:

この件、今はもう手の出し方を思いつかないということでいいですか。

はい。

手が出せないものはしょうがないので、新たな手がかりが出てくるまで
優先度を Low にするということでどうでしょう。
反対がなければ勝手にやってしまいます。

すいません。お願いします。

助田

=end

#15

Updated by mame (Yusuke Endoh) over 10 years ago

  • Priority changed from Normal to 3

=begin

=end

#16

Updated by arton (Akio Tajima) about 10 years ago

=begin
artonです。

以下の方法でテスト可能です。
上で出ていますが、英語Verbなら利用可能で、かつショートカット作成の英語VerbはLinkです。

*** test_folderitem2_invokeverb.rb~ Tue Jul 27 00:00:56 2010
--- test_folderitem2_invokeverb.rb Sun Oct 03 19:11:17 2010
*************** if defined?(WIN32OLE)
*** 62,68 ****
--- 62,73 ----
def test_invokeverb
# this test should run only when "Create Shortcut (&S)"
# is found in context menu,
+

  • # in Windows Vista (not tested), Windows 7
  • # The verb must take English verb.
  • # Creating Shortcut is "Link" if @shortcut
  • @shortcut = "Link" links = find_link(@dummy_path) assert_equal(0, links.size)

=end

#17

Updated by suke (Masaki Suketa) about 10 years ago

=begin
助田です。

On Sun, Oct 03, 2010 at 07:12:20PM +0900, Akio Tajima wrote:

上で出ていますが、英語Verbなら利用可能で、かつショートカット作成の英語VerbはLinkです。

ありがとうございます。
Windows XP でも Link でOKでした。
コミットしていただけますか?

助田 雅紀

=end

#18

Updated by arton (Akio Tajima) about 10 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r29399.
Usaku, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Also available in: Atom PDF