Piotr Caban : vbscript: Added partial implementation of IDispatch methods in IRegExp2.
Alexandre Julliard
julliard at winehq.org
Fri Feb 15 11:19:17 CST 2013
Module: wine
Branch: master
Commit: 08a16a28767923391b870132bd19dbb7cd94cf46
URL: http://source.winehq.org/git/wine.git/?a=commit;h=08a16a28767923391b870132bd19dbb7cd94cf46
Author: Piotr Caban <piotr at codeweavers.com>
Date: Fri Feb 15 15:10:27 2013 +0100
vbscript: Added partial implementation of IDispatch methods in IRegExp2.
---
dlls/vbscript/vbregexp.c | 97 +++++++++++++++++++++++++++++++++++++---
dlls/vbscript/vbscript.h | 1 +
dlls/vbscript/vbscript_main.c | 1 +
3 files changed, 91 insertions(+), 8 deletions(-)
diff --git a/dlls/vbscript/vbregexp.c b/dlls/vbscript/vbregexp.c
index 2bf866b..1afe44b 100644
--- a/dlls/vbscript/vbregexp.c
+++ b/dlls/vbscript/vbregexp.c
@@ -23,6 +23,62 @@
WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
+#define REGEXP_TID_LIST \
+ XDIID(RegExp2) \
+ XDIID(Match2) \
+ XDIID(MatchCollection2) \
+ XDIID(SubMatches)
+
+typedef enum {
+#define XDIID(iface) iface ## _tid,
+REGEXP_TID_LIST
+#undef XDIID
+ REGEXP_LAST_tid
+} regexp_tid_t;
+
+static REFIID tid_ids[] = {
+#define XDIID(iface) &IID_I ## iface,
+REGEXP_TID_LIST
+#undef XDIID
+};
+
+static ITypeLib *typelib;
+static ITypeInfo *typeinfos[REGEXP_LAST_tid];
+
+static HRESULT init_regexp_typeinfo(regexp_tid_t tid)
+{
+ HRESULT hres;
+
+ if(!typelib) {
+ static const WCHAR vbscript_dll3W[] = {'v','b','s','c','r','i','p','t','.','d','l','l','\\','3',0};
+ ITypeLib *tl;
+
+ hres = LoadTypeLib(vbscript_dll3W, &tl);
+ if(FAILED(hres)) {
+ ERR("LoadRegTypeLib failed: %08x\n", hres);
+ return hres;
+ }
+
+ if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
+ ITypeLib_Release(tl);
+ }
+
+ if(!typeinfos[tid]) {
+ ITypeInfo *ti;
+
+ hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
+ if(FAILED(hres)) {
+ ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hres);
+ return hres;
+ }
+
+ if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, NULL))
+ ITypeInfo_Release(ti);
+ }
+
+ return S_OK;
+}
+
typedef struct {
IRegExp2 IRegExp2_iface;
IRegExp IRegExp_iface;
@@ -78,8 +134,9 @@ static ULONG WINAPI RegExp2_Release(IRegExp2 *iface)
TRACE("(%p) ref=%d\n", This, ref);
- if(!ref)
+ if(!ref) {
heap_free(This);
+ }
return ref;
}
@@ -87,8 +144,11 @@ static ULONG WINAPI RegExp2_Release(IRegExp2 *iface)
static HRESULT WINAPI RegExp2_GetTypeInfoCount(IRegExp2 *iface, UINT *pctinfo)
{
RegExp2 *This = impl_from_IRegExp2(iface);
- FIXME("(%p)->(%p)\n", This, pctinfo);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, pctinfo);
+
+ *pctinfo = 1;
+ return S_OK;
}
static HRESULT WINAPI RegExp2_GetTypeInfo(IRegExp2 *iface,
@@ -103,9 +163,11 @@ static HRESULT WINAPI RegExp2_GetIDsOfNames(IRegExp2 *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
{
RegExp2 *This = impl_from_IRegExp2(iface);
- FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
- lcid, rgDispId);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid),
+ rgszNames, cNames, lcid, rgDispId);
+
+ return ITypeInfo_GetIDsOfNames(typeinfos[RegExp2_tid], rgszNames, cNames, rgDispId);
}
static HRESULT WINAPI RegExp2_Invoke(IRegExp2 *iface, DISPID dispIdMember,
@@ -113,9 +175,12 @@ static HRESULT WINAPI RegExp2_Invoke(IRegExp2 *iface, DISPID dispIdMember,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
RegExp2 *This = impl_from_IRegExp2(iface);
- FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
+
+ TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
- return E_NOTIMPL;
+
+ return ITypeInfo_Invoke(typeinfos[RegExp2_tid], iface, dispIdMember, wFlags,
+ pDispParams, pVarResult, pExcepInfo, puArgErr);
}
static HRESULT WINAPI RegExp2_get_Pattern(IRegExp2 *iface, BSTR *pPattern)
@@ -357,6 +422,10 @@ HRESULT WINAPI VBScriptRegExpFactory_CreateInstance(IClassFactory *iface, IUnkno
TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
+ hres = init_regexp_typeinfo(RegExp2_tid);
+ if(FAILED(hres))
+ return hres;
+
ret = heap_alloc_zero(sizeof(*ret));
if(!ret)
return E_OUTOFMEMORY;
@@ -370,3 +439,15 @@ HRESULT WINAPI VBScriptRegExpFactory_CreateInstance(IClassFactory *iface, IUnkno
IRegExp2_Release(&ret->IRegExp2_iface);
return hres;
}
+
+void release_regexp_typelib(void)
+{
+ DWORD i;
+
+ for(i=0; i<REGEXP_LAST_tid; i++) {
+ if(typeinfos[i])
+ ITypeInfo_Release(typeinfos[i]);
+ }
+ if(typelib)
+ ITypeLib_Release(typelib);
+}
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 868a9f4..e3d96d8 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -342,6 +342,7 @@ TID_LIST
} tid_t;
HRESULT get_typeinfo(tid_t,ITypeInfo**) DECLSPEC_HIDDEN;
+void release_regexp_typelib(void) DECLSPEC_HIDDEN;
#ifndef INT32_MIN
#define INT32_MIN (-2147483647-1)
diff --git a/dlls/vbscript/vbscript_main.c b/dlls/vbscript/vbscript_main.c
index eefb7a5..9ff2a51 100644
--- a/dlls/vbscript/vbscript_main.c
+++ b/dlls/vbscript/vbscript_main.c
@@ -285,6 +285,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
break;
case DLL_PROCESS_DETACH:
release_typelib();
+ release_regexp_typelib();
}
return TRUE;
More information about the wine-cvs
mailing list