// @object TLIBATTR|Type library attributes are represented as a tuple of: PyObject *PyITypeLib::GetLibAttr() { TLIBATTR *attr; ITypeLib *pMyTypeLib = GetI(this); if (pMyTypeLib==NULL) return NULL; PY_INTERFACE_PRECALL; SCODE sc = pMyTypeLib->GetLibAttr(&attr); PY_INTERFACE_POSTCALL; if (FAILED(sc)) return PyCom_BuildPyException(sc, pMyTypeLib, IID_ITypeLib); PyObject *obIID = PyWinObject_FromIID(attr->guid); PyObject *ret = NULL; if (obIID!=NULL) { ret = Py_BuildValue("Oiiiii", obIID, // @tupleitem 0|<o PyIID>|IID|The IID for the library attr->lcid, // @tupleitem 1|int|lcid|The default locale ID for the library attr->syskind, // @tupleitem 2|int|syskind|Identifies the target operating system platform attr->wMajorVerNum, // @tupleitem 3|int|majorVersion|The major version number of the library attr->wMinorVerNum, // @tupleitem 4|int|minorVersion|The minor version number of the library attr->wLibFlags); // @tupleitem 5|int|flags|Flags for the library. Py_DECREF(obIID); } { PY_INTERFACE_PRECALL; pMyTypeLib->ReleaseTLibAttr(attr); PY_INTERFACE_POSTCALL; } return ret; }
JNIEXPORT jobject JNICALL Java_org_racob_com_TypeInfo_getContainingTypeLib (JNIEnv *env, jobject obj, jint pointer) { ITypeInfo *typeInfo = (ITypeInfo *) pointer; ITypeLib* typeLib = NULL; unsigned int index = 0; HRESULT hr = typeInfo->GetContainingTypeLib(&typeLib, &index); if (!SUCCEEDED(hr)) { ThrowComFail(env, "GetContainingTypeLib failed", hr); return NULL; } int typeCount = typeLib->GetTypeInfoCount(); if (typeCount == E_NOTIMPL) { ThrowComFail(env, "GetContainingTypeLib failed to get count", hr); return NULL; } TLIBATTR *libAttr = NULL; hr = typeLib->GetLibAttr(&libAttr); if (!SUCCEEDED(hr)) { ThrowComFail(env, "Automation.loadTypeLibEx failed", hr); return NULL; } jstring guid = makeGUIDString(env, libAttr->guid); jclass autoClass = env->FindClass("org/racob/com/TypeLib"); jmethodID autoCons = env->GetMethodID(autoClass, "<init>", "(IILjava/lang/String;IIII)V"); jobject newAuto = env->NewObject(autoClass, autoCons, (jint) typeLib, index, guid, typeCount, libAttr->wLibFlags, libAttr->wMajorVerNum, libAttr->wMinorVerNum); typeLib->ReleaseTLibAttr(libAttr); return newAuto; }
int GetTLBVersion(tstring& filepath, DWORD& high, DWORD & low) { #ifdef _WIN32 int found = 0; TCHAR fullpath[1024]; TCHAR *p; if (!GetFullPathName(filepath.c_str(), COUNTOF(fullpath), fullpath, &p)) return 0; ITypeLib* typeLib; HRESULT hr; #ifdef _UNICODE hr = LoadTypeLib(fullpath, &typeLib); #else // If built without UNICODE, we still need to convert this string to a Unicode string. WCHAR *ole_filename = (WCHAR*) WinWStrDupFromTChar(fullpath); if (!ole_filename) return 0; hr = LoadTypeLib(ole_filename, &typeLib); free(ole_filename); #endif //~ _UNICODE if (SUCCEEDED(hr)) { TLIBATTR* typelibAttr; hr = typeLib->GetLibAttr(&typelibAttr); if (SUCCEEDED(hr)) { high = typelibAttr->wMajorVerNum; low = typelibAttr->wMinorVerNum; found = 1; } typeLib->Release(); } return found; #else return 0; #endif //~ _WIN32 }
HRESULT ComReg::UnRegisterTypeLibResource(const wchar_t* fullpath) { ITypeLib* pTypeLib; HRESULT hr = LoadTypeLib(fullpath, &pTypeLib); //Does not register if filename is a full path, which is what we want. if (FAILED(hr)) return hr; assert(pTypeLib); TLIBATTR* pLibAttr; hr = pTypeLib->GetLibAttr(&pLibAttr); if (FAILED(hr)) { pTypeLib->Release(); pTypeLib = 0; return hr; } assert(pLibAttr); const TLIBATTR a(*pLibAttr); pTypeLib->ReleaseTLibAttr(pLibAttr); pTypeLib->Release(); pTypeLib = 0; hr = UnRegisterTypeLib( a.guid, a.wMajorVerNum, a.wMinorVerNum, a.lcid, a.syskind); return hr; }
HRESULT ComReg::GetTypeLibAttr( const wchar_t* fullpath, TLIBATTR& a) { ITypeLib* pTypeLib; HRESULT hr = LoadTypeLib(fullpath, &pTypeLib); //Does not register if filename is a full path, which is what we want. if (FAILED(hr)) return hr; assert(pTypeLib); TLIBATTR* pLibAttr; hr = pTypeLib->GetLibAttr(&pLibAttr); if (FAILED(hr)) { pTypeLib->Release(); pTypeLib = 0; return hr; } assert(pLibAttr); a = *pLibAttr; pTypeLib->ReleaseTLibAttr(pLibAttr); pTypeLib->Release(); pTypeLib = 0; return S_OK; }
STDAPI DllUnregisterServer() { HRESULT hr = AMovieDllRegisterServer2(FALSE); // unregister type library WCHAR achFileName[MAX_PATH]; GetModuleFileNameW(g_hInst, achFileName, MAX_PATH); ITypeLib* pTypeLib; LoadTypeLib(achFileName, &pTypeLib); if (pTypeLib) { TLIBATTR* ptla; hr = pTypeLib->GetLibAttr(&ptla); if (SUCCEEDED(hr)) { hr = UnRegisterTypeLib(ptla->guid, ptla->wMajorVerNum, ptla->wMinorVerNum, ptla->lcid, ptla->syskind); pTypeLib->ReleaseTLibAttr(ptla); } pTypeLib->Release(); } return hr; }
int main(int argc, char* argv[]) { // Parse the command line string cmdline; string mode; string filename; string filepath; int filefound = 0; if (argc != 4) return 1; // Get the full path of the local file mode = argv[1]; filename = argv[2]; char buf[MAX_PATH]; GetCurrentDirectory(MAX_PATH, buf); filepath = buf; if ((filename.substr(0, 1).compare("\\") != 0) && (filename.substr(1, 1).compare(":") != 0)) { // Path is relative if (filepath.substr(filepath.length() - 1, 1).compare("\\") != 0) filepath.append("\\"); filepath.append(filename); } else if ((filename.substr(0, 1).compare("\\") == 0) && (filename.substr(1, 1).compare("\\") != 0)) { // Path is relative to current root if (filepath.substr(1, 1).compare(":") == 0) { // Standard path filepath = filepath.substr(0, filepath.find('\\')); filepath.append(filename); } else { // UNC path filepath = filepath.substr(0, filepath.find('\\', filepath.find('\\', 2) + 1)); filepath.append(filename); } } else { // Absolute path filepath = filename; } // Validate filename WIN32_FIND_DATA wfd; HANDLE hFind = FindFirstFile(filepath.c_str(), &wfd); if (hFind != INVALID_HANDLE_VALUE) { filefound = 1; FindClose(hFind); } int versionfound = 0; DWORD low = 0, high = 0; if (filefound) { // Get version // DLL if (mode.compare("D") == 0) { DWORD versionsize; DWORD temp; versionsize = GetFileVersionInfoSize((char*)filepath.c_str(), &temp); if (versionsize) { void *buf; buf = (void *)GlobalAlloc(GPTR, versionsize); if (buf) { UINT uLen; VS_FIXEDFILEINFO *pvsf; if (GetFileVersionInfo((char*)filepath.c_str(), 0, versionsize, buf) && VerQueryValue(buf, "\\", (void**)&pvsf,&uLen)) { high = pvsf->dwFileVersionMS; low = pvsf->dwFileVersionLS; versionfound = 1; } GlobalFree(buf); } } } // TLB if (mode.compare("T") == 0) { wchar_t ole_filename[1024]; MultiByteToWideChar(CP_ACP, 0, filepath.c_str(), filepath.length() + 1, ole_filename, 1024); ITypeLib* typeLib; HRESULT hr; hr = LoadTypeLib(ole_filename, &typeLib); if (SUCCEEDED(hr)) { TLIBATTR* typelibAttr; hr = typeLib->GetLibAttr(&typelibAttr); if (SUCCEEDED(hr)) { high = typelibAttr->wMajorVerNum; low = typelibAttr->wMinorVerNum; versionfound = 1; } typeLib->Release(); } } } // Write the version to an NSIS header file ofstream header(argv[3], ofstream::out); if (header) { if (!filefound) { header << "!define LIBRARY_VERSION_FILENOTFOUND" << endl; } else if (!versionfound) { header << "!define LIBRARY_VERSION_NONE" << endl; } else { header << "!define LIBRARY_VERSION_HIGH " << high << endl; header << "!define LIBRARY_VERSION_LOW " << low << endl; } header.close(); } return 0; }
STDAPI DllUnregisterServer(VOID) #endif { HRESULT rslt; HINSTANCE hInst; hInst = GetModuleHandle(DBCLIENT_DLL); if (hInst) { DBIPATH pszDllPath = { 0 }; OLECHAR pszDllPathw[DBIMAXPATHLEN+1] = { 0 }; GetModuleFileName(hInst, pszDllPath, sizeof(pszDllPath)); MultiByteToWideChar(0, 0, pszDllPath, -1, pszDllPathw, sizeof(pszDllPathw)/sizeof(pszDllPathw[0])); ITypeLib *pTypeLib = 0; ; // oleauto.h rslt = LoadTypeLib(pszDllPathw, &pTypeLib); if (!rslt) { TLIBATTR *pLibAttr = 0; // oaidl.h pTypeLib->GetLibAttr(&pLibAttr); HRESULT hr = UnRegisterTypeLib(pLibAttr->guid, pLibAttr->wMajorVerNum, pLibAttr->wMinorVerNum, pLibAttr->lcid, pLibAttr->syskind); if (hr != S_OK) { regError("ERROR: UnregisterTypeLib returned %lX", hr); } pTypeLib->ReleaseTLibAttr(pLibAttr); pTypeLib->Release(); pTypeLib = 0; } else { regError("ERROR: LoadTypeLib returned %lX", rslt); } } #ifdef MIDAS_DLL // DSBASE rslt = Register_IF(NULL, PROGID_MDSBASE, NULL, PROGID_MDSBASE_1, NULL, CLSID_MDSBASE_1, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_MDSBASE_1, NULL, NULL, NULL, CLSID_MDSBASE_1, FALSE); // DSCursor if (!rslt) rslt = Register_IF(NULL, PROGID_MDSCURSOR, NULL, PROGID_MDSCURSOR_1, NULL, CLSID_MDSCURSOR_1, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_MDSCURSOR_1, NULL, NULL, NULL, CLSID_MDSCURSOR_1, FALSE); // DSDATAPACKET if (!rslt) rslt = Register_IF(NULL, PROGID_MDATAPACKETREAD, NULL, NULL, NULL, CLSID_MDATAPACKETREAD, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_MDATAPACKETWRITE, NULL, NULL, NULL, CLSID_MDATAPACKETWRITE, FALSE); #else // DSBASE rslt = Register_IF(NULL, PROGID_DSBASE, NULL, PROGID_DSBASE_2, NULL, CLSID_DSBASE_2, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_DSBASE_1, NULL, NULL, NULL, CLSID_DSBASE_1, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_DSBASE_2, NULL, NULL, NULL, CLSID_DSBASE_2, FALSE); // DSCursor if (!rslt) rslt = Register_IF(NULL, PROGID_DSCURSOR, NULL, PROGID_DSCURSOR_2, NULL, CLSID_DSCURSOR_2, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_DSCURSOR_1, NULL, NULL, NULL, CLSID_DSCURSOR_1, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_DSCURSOR_2, NULL, NULL, NULL, CLSID_DSCURSOR_2, FALSE); // DSDATAPACKET if (!rslt) rslt = Register_IF(NULL, PROGID_DATAPACKETREAD, NULL, NULL, NULL, CLSID_DATAPACKETREAD, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_DATAPACKETWRITE, NULL, NULL, NULL, CLSID_DATAPACKETWRITE, FALSE); #endif return rslt; }