感谢大哥回复,但我的意思是不是这个。
我现在遇到的问题是需调用一个 Win32 的 COM 控件,用 Python 行得通,但是用 Ruby 就真的遇到问题了。
例如,现在需要调用 某个 Win32 COM 控件 my_com 的某个方法 my_method,这个方法在 SDK 中的说明如下:
VARIANT_BOOL my_method
(LONG UserID,
BSTR *Name,
BSTR *Password
)
这个方法的 input parameter 是 UserID,另外两个带星号的参数是 output parameter 或者说是 reference parameter,也就是返回值。
用 python 很容易解决这个问题:
# 下面的 xxxxx.xxxxx 是 COM 控件对象,例如 Excel.Application
my_com = win32com.client.Dispatch('xxxxx.xxxxx')
myUserID = '10001'
# python 只需要这样,方法在调用时不需要写返回值参数,myName, myPassword 直接作为返回值
myUserID, myName, myPassword = my_com.my_method(myUserID)
print(myName) # "张三"
print(myPassword) # "888888"
我尝试了 Ruby,按照 ruby-doc 网站http://ruby-doc.com/stdlib-2.6.5/libdoc/win32ole/rdoc/WIN32OLE.html中的例子,效果不理想,获取不到返回值:
require "win32ole"
include WIN32OLE::VARIANT
# 下面的 xxxxx.xxxxx 是 COM 控件对象,例如 Excel.Application
my_com = WIN32OLE.new('xxxxx.xxxxx')
# 直接调用
myUserID = '10001'
myName = ''
myPassword = ''
p my_com.my_method(myUserID, myName, myPassword) # 返回 True,证明确实执行了
p WIN32OLE::ARGV # 返回 ['10001', '', ''],没有获取到返回值
# 换一种方法
myUserID = WIN32OLE_VARIANT.new('10001', VT_I4)
myName = WIN32OLE_VARIANT.new('', VT_BSTR)
myPassword = WIN32OLE_VARIANT.new('', VT_BSTR)
p mycom.invoke('my_method', myUserID, myName, myPassword) # 返回 True,证明确实执行了
p myName.value # 返回 "",仍然没有获取到返回值
p myPassword.value # 返回 "",仍然没有获取到返回值