首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Ruby和Win32OLE设置数组

使用Ruby和Win32OLE设置数组
EN

Stack Overflow用户
提问于 2014-12-04 23:49:41
回答 2查看 248关注 0票数 1

我正在尝试使用Rubyv1.93在COM对象中设置数组属性。将一个数组从COM编组到一个Ruby数组是可行的,但在另一个方向上不行。如何将Ruby数组编组到COM中?

该属性包含在.NET程序集中:

代码语言:javascript
复制
namespace LibForRuby
{
   public class MyClass
   {
      public MyClass()
      {
         MyInt = 1;
         MyArray = new[] {2, 3};
      }

      public int MyInt { get; set; }
      public int[] MyArray { get; set; }
   }
}

我的整个ruby脚本是:

代码语言:javascript
复制
require 'win32ole'

com_class = WIN32OLE.new('LibForRuby.MyClass')

puts 'Before:'
my_int = com_class.MyInt
puts my_int
my_array = com_class.MyArray
print my_array
puts

puts 'After:'
com_class.MyInt = 10
my_int = com_class.MyInt
puts my_int
com_class.MyArray = [20,30]
my_array = com_class.MyArray
print my_array

输出为:

代码语言:javascript
复制
C:\Ruby193\bin>test
Before:
1
[2, 3]
After:
10
C:/Ruby193/bin/test.rb:13:in `method_missing': (in setting property `MyArray': )
 (WIN32OLERuntimeError)
    OLE error code:0 in <Unknown>
      <No Description>
    HRESULT error code:0x80020005
      Type mismatch.
        from C:/Ruby193/bin/test.rb:13:in `<main>'
EN

回答 2

Stack Overflow用户

发布于 2014-12-06 00:57:45

试试这个:

代码语言:javascript
复制
puts 'After:'
com_class.MyInt = 10
my_int = com_class.MyInt
puts my_int
com_class._setproperty(
com_class.ole_method_help('MyArray').dispid,
[[20,30]], 
[WIN32OLE::VARIANT::VT_ARRAY]
)
my_array = com_class.MyArray
print my_array

确保在ruby-doc.org上查找#_setproperty方法,以了解为什么数组包含在数组中,以及为什么变量常量在数组中。

票数 0
EN

Stack Overflow用户

发布于 2018-01-28 05:53:14

虽然有点晚,但我在没有OpenSSL的情况下在ruby引擎中实现一些加密算法时,在尝试设置System.Security.Cryptography.TripleDESCryptoServiceProvider的密钥时遇到了同样的问题

这不起作用:

代码语言:javascript
复制
crypto = WIN32OLE.new("System.Security.Cryptography.TripleDESCryptoServiceProvider")
crypto.key = [62,116,108,70,56,97,100,107,61,51,53,75,123,100,115,97]

这是可行的:

代码语言:javascript
复制
arr = [1,2,3,4]
crypto = WIN32OLE.new("System.Security.Cryptography.TripleDESCryptoServiceProvider")
vArr = WIN32OLE_VARIANT.array([arr.length],WIN32OLE::VARIANT::VT_UI1)
arr.each_with_index {|val,index| vArr[index]=val}
crypto.key = vArr
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27298202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档