WIN32OLE extension using in/out SAFEARRAYs (Matlab interface)

R

Ryan Hinton

I am having trouble calling a COM object (Matlab) using the excellent
WIN32OLE Ruby extension. Several other calls have worked fine, but
this call involves some in/out SAFEARRAYs. Here is the method
signature.

GetFullMatrix([in] BSTR varname, [in] BSTR workspace,
[in, out] SAFEARRAY(double) *pr,
[in, out] SAFEARRAY(double) *pi)

The server uses the sizes of the arrays pr and pi to fill them with the
requested data--hence their dual in/out nature. Does anyone know how
to properly make a call like this? Is it possible? My most successful
attempts have given me the following error.

WIN32OLERuntimeError: GetFullMatrix
OLE error code:0 in <Unknown>
<No Description>
HRESULT error code:0x80020005
Type mismatch.
from (irb):30:in `method_missing'
from (irb):30
from :0

In case you're running on Windows with Matlab installed, here is the
code I am using.

require 'win32ole'
matlab = WIN32OLE.new('Matlab.Application')
matlab.Execute('bob = 1:5;')
t1 = Array.new(5, 0.0)
t2 = t1.dup
t3 = matlab.GetFullMatrix('bob', 'base', t1, t2)
 
M

Masaki Suketa

Hello,

In message "WIN32OLE extension using in/out SAFEARRAYs (Matlab interface)"
I am having trouble calling a COM object (Matlab) using the excellent
WIN32OLE Ruby extension. Several other calls have worked fine, but
this call involves some in/out SAFEARRAYs. Here is the method
signature.

GetFullMatrix([in] BSTR varname, [in] BSTR workspace,
[in, out] SAFEARRAY(double) *pr,
[in, out] SAFEARRAY(double) *pi)

The server uses the sizes of the arrays pr and pi to fill them with the
requested data--hence their dual in/out nature. Does anyone know how
to properly make a call like this? Is it possible? My most successful
attempts have given me the following error.

I do not have MATLAB, But I read the web document about MATLAB(Japanese).
And the article discribes Matlab provides GetWorkspaceData for VBScript.
Because VBScript does not support SAFEARRAY and you can not use
GetFullMatrix in VBScript.

Win32OLE may be same as VBScript because Win32OLE
calls GetFullMatrix with VT_VARIANT|VT_BYREF or VT_ARRAY(SAFEARRAY).
But MATLAB expect VT_ARRAY|VT_BYREF (SAFEARRAY *).
So you get Type mysmatch error.
t3 = matlab.GetFullMatrix('bob', 'base', t1, t2)

Could you try GetWorkspaceData instead?
Sorry, but I do not know how to use GetWorkspaceData exactly.

Regards,
Masaki Suketa
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top