// @pymethod <o PyUnicode>|pythoncom|QueryPathOfRegTypeLib|Retrieves the path of a registered type library. PyObject *pythoncom_querypathofregtypelib(PyObject *self, PyObject *args) { PyObject *obIID; int major, minor; LCID lcid = LOCALE_USER_DEFAULT; // @pyparm <o PyIID>|iid||The IID of the type library. // @pyparm int|versionMajor||The major version number of the library // @pyparm int|versionMinor||The minor version number of the library // @pyparm int|lcid|LOCALE_USER_DEFAULT|The locale ID to use. if (!PyArg_ParseTuple(args, "Oii|i", &obIID, &major, &minor, &lcid)) return NULL; CLSID clsid; if (!PyWinObject_AsIID(obIID, &clsid)) return NULL; BSTR result; PY_INTERFACE_PRECALL; HRESULT hr = QueryPathOfRegTypeLib(clsid, major, minor, lcid, &result); PY_INTERFACE_POSTCALL; if (FAILED(hr)) return PyCom_BuildPyException(hr); return PyWinObject_FromBstr( result, TRUE ); }
/* * call-seq: * WIN32OLE_TYPELIB#path -> The type library file path. * * Returns the type library file path. * * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library') * puts tlib.path #-> 'C:\...\EXCEL9.OLB' */ static VALUE foletypelib_path(VALUE self) { TLIBATTR *pTLibAttr; HRESULT hr = S_OK; BSTR bstr; LCID lcid = cWIN32OLE_lcid; VALUE path; ITypeLib *pTypeLib; pTypeLib = itypelib(self); oletypelib_get_libattr(pTypeLib, &pTLibAttr); hr = QueryPathOfRegTypeLib(&pTLibAttr->guid, pTLibAttr->wMajorVerNum, pTLibAttr->wMinorVerNum, lcid, &bstr); if (FAILED(hr)) { pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr); ole_raise(hr, eWIN32OLERuntimeError, "failed to QueryPathOfRegTypeTypeLib"); } pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr); path = WC2VSTR(bstr); return path; }
static void test_QueryPathOfRegTypeLib(void) { static const struct test_data { WORD maj, min; HRESULT ret; const WCHAR path[16]; } td[] = { { 1, 0, TYPE_E_LIBNOTREGISTERED, { 0 } }, { 3, 0, S_OK, {'f','a','k','e','_','3','_','0','.','d','l','l',0 } }, { 3, 1, S_OK, {'f','a','k','e','_','3','_','1','.','d','l','l',0 } }, { 3, 22, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } }, { 3, 37, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } }, { 3, 40, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } }, { 4, 0, TYPE_E_LIBNOTREGISTERED, { 0 } } }; static const WCHAR base[] = {'f','a','k','e',0}; UINT i; RPC_STATUS status; GUID uid; WCHAR uid_str[40]; HRESULT ret; BSTR path; status = UuidCreate(&uid); ok(!status, "UuidCreate error %08lx\n", status); StringFromGUID2(&uid, uid_str, 40); /*trace("GUID: %s\n", wine_dbgstr_w(uid_str));*/ if (!do_typelib_reg_key(&uid, 3, 0, base, 0)) return; if (!do_typelib_reg_key(&uid, 3, 1, base, 0)) return; if (!do_typelib_reg_key(&uid, 3, 37, base, 0)) return; for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) { ret = QueryPathOfRegTypeLib(&uid, td[i].maj, td[i].min, 0, &path); ok(ret == td[i].ret, "QueryPathOfRegTypeLib(%u.%u) returned %08x\n", td[i].maj, td[i].min, ret); if (ret == S_OK) { ok(!lstrcmpW(td[i].path, path), "typelib %u.%u path doesn't match\n", td[i].maj, td[i].min); SysFreeString(path); } } do_typelib_reg_key(&uid, 0, 0, NULL, 1); }
BSTR primQueryPathOfRegTypeLib ( GUID* rguid , unsigned short maj , unsigned short min ) { BSTR bs; HRESULT hr; bs = SysAllocStringByteLen (NULL, 255); hr = QueryPathOfRegTypeLib ( rguid, maj, min, GetUserDefaultLCID(), &bs); if (FAILED(hr)) { SysFreeString(bs); return NULL; } return bs; }