[ruby-list:41810] Re: Win32OLE and MATLAB

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2006-02-03 09:24:43 UTC
List: ruby-list #41810
山本です。

>> >どなたか、MATLABをWin32OLEから利用したことがある方はいらっしゃいますか?
>> >最近、Win32OLEからMATLABが動かないというメールを頂戴したのですが、
>> >MATLABを持ってないので、ちょっとだけ困ってます。
>> 
>> MATLAB ではないのですが、最近 RubyForge に
>> 
>> http://rubyforge.org/tracker/index.php?func=detail&aid=3237&group_id=426&atid=1698
>> 
>> という報告がありました。もしかすると関係あるかもしれません。
>
>情報ありがとうございます。
>詳しく調べてみないとわかりませんが、一見したところ Member not found なので
>あまり関係ないような気がします。
>
>  MS-Wordだったら、まだ調べる手立てはある
>  助田 雅紀

試しに、SAFEARRAY(double) [in, out] を引数に持つ、何もしないオートメーションを
作ってみたところ、同じエラーが出ました。

C++Builder で作ったバイナリを

http://www.ccsnet.ne.jp/~ocean/Project1.zip

においておきます。なお、SAFEARRAY(VARIANT) だとエラーになりませんでした。

require 'win32ole'
matlab = WIN32OLE.new('Project1.Win32OleBug')
matlab.GetFullMatrix([0.0])

追記:

http://homepage3.nifty.com/hippo2000/perltips/Win32/OLE/Variant.htm

に

  SAFEARRAY variantを作るためには、配列要素の基本型に加えてVT_ARRAYフラグを指定しなければなりません

と書いてあるのを見て、試しにこうしてみたところ、エラーが出なくなりました。参考になれば。

Index: win32ole.c
===================================================================
RCS file: /src/ruby/ext/win32ole/win32ole.c,v
retrieving revision 1.43
diff -u -w -b -p -r1.43 win32ole.c
--- win32ole.c	12 Dec 2005 00:35:07 -0000	1.43
+++ win32ole.c	3 Feb 2006 09:20:10 -0000
@@ -813,7 +813,7 @@ ole_val2variant(val, var)
         if(pid) free(pid);
 
         if (SUCCEEDED(hr)) {
-            V_VT(var) = VT_VARIANT | VT_ARRAY;
+            V_VT(var) = VT_R8 | VT_ARRAY;
             V_ARRAY(var) = psa;
         }
         else if (psa != NULL)




In This Thread