[#39106] What processor do you run ruby on? — "K.Sasada" <ko1@...>

 ささだです。

13 messages 2004/02/09
[#39200] Re: What processor do you run ruby on? — "K.Sasada" <ko1@...> 2004/02/17

"K.Sasada" <ko1@namikilab.tuat.ac.jp> wrote :

[#39207] Re: What processor do you run ruby on? — Isamu KOZUKA <kozuka@...> 2004/02/17

小塚@しなきゃならないテストがいっぱいだ〜....です。

[#39129] InternetExplorer ってインターフェースとして使える? — Shin-ichiro HARA <sinara@...>

原です。

34 messages 2004/02/10
[#39130] Re: InternetExplorer ってインターフェースとして使える? — Yac <yac@...> 2004/02/10

岡です。

[#39136] Re: InternetExplorer ってインターフェースとして使える? — Yac <yac@...> 2004/02/10

岡です。

[#39140] Re: InternetExplorer ってインターフェースとして使える? — arton <artonx@...> 2004/02/11

artonです。別件。

[#39144] Re: InternetExplorer ってインターフェースとして使える? — Shin-ichiro HARA <sinara@...> 2004/02/12

原です。

[#39145] Re: InternetExplorer ってインターフェースとして使える? — arton <artonx@...> 2004/02/12

artonです。

[#39146] Re: InternetExplorer ってインターフェースとして使える? — nobu.nakada@... 2004/02/12

なかだです。

[#39147] Re: InternetExplorer ってインターフェースとして使える? — arton <artonx@...> 2004/02/12

artonです。

[#39150] Re: InternetExplorer ってインターフェースとして使える? — nobu.nakada@... 2004/02/12

なかだです。

[#39151] Re: InternetExplorer ってインターフェースとして使える? — arton <artonx@...> 2004/02/12

artonです。

[#39275] DnD on win32 — Shinichiro HIDA <shinichiro@...>

飛田と申します。

21 messages 2004/02/26
[#39276] Re: DnD on win32 — たむらけんいち <sgs02516@...> 2004/02/26

たむらです。

[#39277] Re: DnD on win32 — Shinichiro HIDA <shinichiro@...> 2004/02/27

飛田です。

[#39278] Re: DnD on win32 — Itou-T15@... 2004/02/27

[#39288] 固有値、固有ベクトルの計算 — Masahiro Sato <msato@...>

19 messages 2004/02/27

[ruby-list:39161] Re: InternetExplorerってインターフェースとして使える?

From: nobu.nakada@...
Date: 2004-02-12 15:15:33 UTC
List: ruby-list #39161
なかだです。

At Thu, 12 Feb 2004 22:27:52 +0900,
arton wrote in [ruby-list:39157]:
> というわけで、スタック上に取れば良い引数にALLOCを使っていた点をALLOCAに
> 修正して、Hashに使用中のRuby側のインスタンスを保持するように修正したパッ
> チです。

同じオブジェクトに対しては同じWin32OLEIDispatchを使うようにして
みました。IDispatchVtblも共有するようにしてみましたが、ひょっと
してこれはなんかまずい?

もう一つ、ちょっと気になったのですが、ruby側が終了するときって
相手に対して何も通知などをする必要はないのでしょうか。


--- ext/win32ole/win32ole.c~	2004-02-12 22:43:59.000000000 +0900
+++ ext/win32ole/win32ole.c	2004-02-13 00:01:39.000000000 +0900
@@ -153,4 +153,5 @@ static HINSTANCE gole32 = NULL;
 static FNCOCREATEINSTANCEEX *gCoCreateInstanceEx = NULL;
 static VALUE com_hash;
+static IDispatchVtbl com_vtbl;
 
 struct oledata {
@@ -234,6 +235,5 @@ static ULONG ( STDMETHODCALLTYPE Release
     ULONG u = --(p->refcount);
     if (u == 0) {
-	free(p->dispatch.lpVtbl);
-	rb_hash_delete(com_hash, ULONG2NUM((ULONG)p));
+	st_delete(DATA_PTR(com_hash), p->obj, 0);
 	free(p);
     }
@@ -308,18 +308,18 @@ val2dispatch(val)
     VALUE val;
 {
+    struct st_table *tbl = DATA_PTR(com_hash);
     Win32OLEIDispatch* pdisp;
-    IDispatchVtbl* p = ALLOC(IDispatchVtbl);
-    p->QueryInterface = QueryInterface;
-    p->AddRef = AddRef;
-    p->Release = Release;
-    p->GetTypeInfoCount = GetTypeInfoCount;
-    p->GetTypeInfo = GetTypeInfo;
-    p->GetIDsOfNames = GetIDsOfNames;
-    p->Invoke = Invoke;
-    pdisp = ALLOC(Win32OLEIDispatch);
-    pdisp->dispatch.lpVtbl = p;
-    pdisp->refcount = 1;
-    pdisp->obj = val;
-    rb_hash_aset(com_hash, ULONG2NUM((ULONG)pdisp), val);
+    st_data_t data;
+
+    if (st_lookup(tbl, val, &data)) {
+	pdisp = (Win32OLEIDispatch *)(data & ~FIXNUM_FLAG);
+    }
+    else {
+	pdisp = ALLOC(Win32OLEIDispatch);
+	pdisp->dispatch.lpVtbl = &com_vtbl;
+	pdisp->refcount = 1;
+	pdisp->obj = val;
+	st_insert(tbl, val, (VALUE)pdisp | FIXNUM_FLAG);
+    }
     return &pdisp->dispatch;
 }
@@ -5408,5 +5408,13 @@ Init_win32ole()
     rb_global_variable(&ary_ole_event);
     id_events = rb_intern("events");
-    com_hash = rb_hash_new();
+
+    com_vtbl.QueryInterface = QueryInterface;
+    com_vtbl.AddRef = AddRef;
+    com_vtbl.Release = Release;
+    com_vtbl.GetTypeInfoCount = GetTypeInfoCount;
+    com_vtbl.GetTypeInfo = GetTypeInfo;
+    com_vtbl.GetIDsOfNames = GetIDsOfNames;
+    com_vtbl.Invoke = Invoke;
+    com_hash = Data_Wrap_Struct(rb_cData, rb_mark_hash, st_free_table, st_init_numtable());
     rb_global_variable(&com_hash);
 


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread