diff options
Diffstat (limited to 'ext/com/COM.c')
| -rw-r--r-- | ext/com/COM.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/ext/com/COM.c b/ext/com/COM.c index de98c35aba..373ad06c04 100644 --- a/ext/com/COM.c +++ b/ext/com/COM.c @@ -1093,33 +1093,42 @@ static int php_COM_load_typelib(char *typelib_name, int mode) if(!FAILED(CLSIDFromString(p, &clsid))) { HRESULT hr; + WORD major_i = 1; + WORD minor_i = 0; if(major && minor) { - hr = LoadRegTypeLib((REFGUID) &clsid, 1, 0, LANG_NEUTRAL, &TypeLib); + major_i = (WORD) atoi(major); + minor_i = (WORD) atoi(minor); } - if(!major || !minor || FAILED(hr)) + hr = LoadRegTypeLib((REFGUID) &clsid, major_i, minor_i, LANG_NEUTRAL, &TypeLib); + + if(FAILED(hr) && (!major || !minor)) { - IDispatch *i_dispatch; + IDispatch *Dispatch; ITypeInfo *TypeInfo; int idx; - if(FAILED(CoCreateInstance(&clsid, NULL, CLSCTX_SERVER, &IID_IDispatch, (LPVOID *) &i_dispatch))) + if(FAILED(CoCreateInstance(&clsid, NULL, CLSCTX_SERVER, &IID_IDispatch, (LPVOID *) &Dispatch))) { efree(p); return FAILURE; } - if(FAILED(i_dispatch->lpVtbl->GetTypeInfo(i_dispatch, 0, LANG_NEUTRAL, &TypeInfo))) + if(FAILED(Dispatch->lpVtbl->GetTypeInfo(Dispatch, 0, LANG_NEUTRAL, &TypeInfo))) { + Dispatch->lpVtbl->Release(Dispatch); efree(p); return FAILURE; } + Dispatch->lpVtbl->Release(Dispatch); if(FAILED(TypeInfo->lpVtbl->GetContainingTypeLib(TypeInfo, &TypeLib, &idx))) { + TypeInfo->lpVtbl->Release(TypeInfo); efree(p); return FAILURE; } + TypeInfo->lpVtbl->Release(TypeInfo); } } else |
