うえのです。

仕事で Ruby から SQLServer を使うことになったんですが、
image 型に書き込むための AppendChunk というメソッドを
Ruby + win32ole で使おうとして躓いています。

どうもこのメソッドは、バイナリデータをそのまま表現した
BSTR 型の引数を要求しているようで、String オブジェクトから
BSTR を生成する際に ole_mb2wc でワイドキャラクタ化してしまう
win32ole では期待通りの結果が得られません。

とりあえず、こんな感じで対処してみました。

  rs.Fields(0).AppendChunk WIN32OLE_BSTR.new("hoge")

のように使います。


--- win32ole.c.orig	Sat Feb 23 14:41:36 2002
+++ win32ole.c	Sat Feb 23 15:03:40 2002
@@ -134,6 +134,7 @@ VALUE cWIN32OLE_VARIABLE;
 VALUE cWIN32OLE_METHOD;
 VALUE cWIN32OLE_PARAM;
 VALUE cWIN32OLE_EVENT;
+VALUE cWIN32OLE_BSTR;
 VALUE eWIN32OLE_RUNTIME_ERROR;
 VALUE mWIN32OLE_VARIANT;
 
@@ -650,7 +651,11 @@ ole_val2variant(val, var)
     }
     case T_STRING:
         V_VT(var) = VT_BSTR;
-        V_BSTR(var) = ole_mb2wc(STR2CSTR(val), -1);
+        if (rb_obj_is_kind_of(val, cWIN32OLE_BSTR)) {
+            V_BSTR(var) = SysAllocStringByteLen(RSTRING(val)->ptr, RSTRING(val)->len);
+        } else {
+            V_BSTR(var) = ole_mb2wc(STR2CSTR(val), -1);
+        }
         break;
     case T_FIXNUM:
         V_VT(var) = VT_I4;
@@ -4468,4 +4473,6 @@ Init_win32ole()
     rb_define_method(cWIN32OLE_EVENT, "on_event", fev_on_event, -1);
     rb_define_method(cWIN32OLE_EVENT, "on_event_with_out_args", fev_on_event_with_out_args, -1);
     eWIN32OLE_RUNTIME_ERROR = rb_define_class("WIN32OLERuntimeError", rb_eRuntimeError);
+
+    cWIN32OLE_BSTR = rb_define_class("WIN32OLE_BSTR", rb_cString);
 }



# Windows をこんなに使い込んだのって何年振りだろう… ;p


 --  ----  -     - - -- -
うえの かつひろ <unnie / blue.sky.or.jp>