[#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:39145] Re: InternetExplorer ってインターフェースとして使える?

From: arton <artonx@...>
Date: 2004-02-12 10:26:38 UTC
List: ruby-list #39145
artonです。

On Thu, 12 Feb 2004 17:56:03 +0900
Shin-ichiro HARA <sinara@blade.nagaokaut.ac.jp>さん wrote:

> といったエラーが出ますね。attacEvent はあるのだけど、第2引数
> がわかりません。これは出来てもいい気がするんだけど、、、。
できるようにすることは可能なので、パッチを作ってテストしてみました。
問題なさそうだったので助田さんに取り込んでいただけるようお願いました。
原さんが試されるのでしたら添付のパッチをwin32ole.cに適用してみてください。
リリース版のruby-1.8.1/ext/win32ole/win32ole.c 用です。

-- 
arton <artonx@yahoo.co.jp>

Attachments (1)

patch.txt (4.44 KB, text/x-diff)
diff -u -C1 win32ole.c.old win32ole.c
*** win32ole.c.old	Thu Sep 25 08:54:22 2003
--- win32ole.c	Thu Feb 12 14:16:47 2004
***************
*** 194,195 ****
--- 194,323 ----
  static HRESULT ole_docinfo_from_type _((ITypeInfo *, BSTR *, BSTR *, DWORD *, BSTR *));
+ static char *ole_wc2mb(LPWSTR);
+ static VALUE ole_variant2val(VARIANT*);
+ static void ole_val2variant(VALUE, VARIANT*);
+ 
+ typedef struct _Win32OLEIDispatch
+ {
+     IDispatch dispatch;
+     ULONG refcount;
+     VALUE obj;
+ } Win32OLEIDispatch;
+ 
+ static HRESULT ( STDMETHODCALLTYPE QueryInterface )( 
+             IDispatch __RPC_FAR * This,
+             /* [in] */ REFIID riid,
+             /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+ {
+     if (MEMCMP(riid, &IID_IUnknown, GUID, 1) == 0
+ 	|| MEMCMP(riid, &IID_IDispatch, GUID, 1) == 0)
+     {
+ 	Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
+ 	p->refcount++;
+ 	*ppvObject = This;
+ 	return S_OK;
+     }
+     return E_NOINTERFACE;
+ }
+         
+ static ULONG ( STDMETHODCALLTYPE AddRef )( 
+             IDispatch __RPC_FAR * This)
+ {
+     Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
+     return ++(p->refcount);
+ }
+         
+ static ULONG ( STDMETHODCALLTYPE Release )( 
+             IDispatch __RPC_FAR * This)
+ {
+     Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
+     ULONG u = --(p->refcount);
+     if (u == 0) {
+ 	free(p->dispatch.lpVtbl);
+ 	free(p);
+     }
+     return u;
+ }
+         
+ static HRESULT ( STDMETHODCALLTYPE GetTypeInfoCount )( 
+             IDispatch __RPC_FAR * This,
+             /* [out] */ UINT __RPC_FAR *pctinfo)
+ {
+     return E_NOTIMPL;
+ }
+         
+ static HRESULT ( STDMETHODCALLTYPE GetTypeInfo )( 
+             IDispatch __RPC_FAR * This,
+             /* [in] */ UINT iTInfo,
+             /* [in] */ LCID lcid,
+             /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo)
+ {
+     return E_NOTIMPL;
+ }
+ 
+         
+ static HRESULT ( STDMETHODCALLTYPE GetIDsOfNames )( 
+             IDispatch __RPC_FAR * This,
+             /* [in] */ REFIID riid,
+             /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,
+             /* [in] */ UINT cNames,
+             /* [in] */ LCID lcid,
+             /* [size_is][out] */ DISPID __RPC_FAR *rgDispId)
+ {
+     Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
+     char* psz = ole_wc2mb(*rgszNames); // support only one method
+     *rgDispId = rb_intern(psz);
+     free(psz);
+     return S_OK;
+ }
+         
+ static /* [local] */ HRESULT ( STDMETHODCALLTYPE Invoke )( 
+             IDispatch __RPC_FAR * This,
+             /* [in] */ DISPID dispIdMember,
+             /* [in] */ REFIID riid,
+             /* [in] */ LCID lcid,
+             /* [in] */ WORD wFlags,
+             /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,
+             /* [out] */ VARIANT __RPC_FAR *pVarResult,
+             /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,
+             /* [out] */ UINT __RPC_FAR *puArgErr)
+ {
+     VALUE v;
+     int i;
+     int args = pDispParams->cArgs;
+     Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
+     VALUE* parg = ALLOC_N(VALUE, args);
+     for (i = 0; i < args; i++) {
+ 	*(parg + i) = ole_variant2val(&pDispParams->rgvarg[args - i - 1]);
+     }
+     if (dispIdMember == DISPID_VALUE) {
+ 	if (wFlags == DISPATCH_METHOD) {
+ 	    dispIdMember = rb_intern("call");
+ 	} else if (wFlags & DISPATCH_PROPERTYGET) {
+ 	    dispIdMember = rb_intern("value");
+ 	}
+     }
+     v = rb_funcall2(p->obj, dispIdMember, args, parg);
+     ole_val2variant(v, pVarResult);
+     return S_OK;
+ }
+ 
+ static IDispatch*
+ val2dispatch(val)
+     VALUE val;
+ {
+     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;
+     return &pdisp->dispatch;
+ }
  
***************
*** 700,702 ****
      default:
!         rb_raise(rb_eTypeError, "not valid value");
          break;
--- 828,831 ----
      default:
! 	V_VT(var) = VT_DISPATCH;
! 	V_DISPATCH(var) = val2dispatch(val);
          break;

In This Thread