/* * call-seq: * WIN32OLE_TYPE.progids * * Returns array of ProgID. */ static VALUE foletype_s_progids(VALUE self) { HKEY hclsids, hclsid; DWORD i; LONG err; VALUE clsid; VALUE v = rb_str_new2(""); VALUE progids = rb_ary_new(); err = reg_open_key(HKEY_CLASSES_ROOT, "CLSID", &hclsids); if(err != ERROR_SUCCESS) { return progids; } for(i = 0; ; i++) { clsid = reg_enum_key(hclsids, i); if (clsid == Qnil) break; err = reg_open_vkey(hclsids, clsid, &hclsid); if (err != ERROR_SUCCESS) continue; if ((v = reg_get_val2(hclsid, "ProgID")) != Qnil) rb_ary_push(progids, v); if ((v = reg_get_val2(hclsid, "VersionIndependentProgID")) != Qnil) rb_ary_push(progids, v); RegCloseKey(hclsid); } RegCloseKey(hclsids); return progids; }
static VALUE reg_get_typelib_file_path(HKEY hkey) { VALUE path = Qnil; path = reg_get_val2(hkey, "win64"); if (path != Qnil) { return path; } path = reg_get_val2(hkey, "win32"); if (path != Qnil) { return path; } path = reg_get_val2(hkey, "win16"); return path; }
static VALUE typelib_file_from_clsid(VALUE ole) { HKEY hroot, hclsid; LONG err; VALUE typelib; char path[MAX_PATH + 1]; err = reg_open_key(HKEY_CLASSES_ROOT, "CLSID", &hroot); if (err != ERROR_SUCCESS) { return Qnil; } err = reg_open_key(hroot, StringValuePtr(ole), &hclsid); if (err != ERROR_SUCCESS) { RegCloseKey(hroot); return Qnil; } typelib = reg_get_val2(hclsid, "InprocServer32"); RegCloseKey(hroot); RegCloseKey(hclsid); if (typelib != Qnil) { ExpandEnvironmentStrings(StringValuePtr(typelib), path, sizeof(path)); path[MAX_PATH] = '\0'; typelib = rb_str_new2(path); } return typelib; }
/* * call-seq: * * WIN32OLE_TYPELIB.typelibs * * Returns the array of WIN32OLE_TYPELIB object. * * tlibs = WIN32OLE_TYPELIB.typelibs * */ static VALUE foletypelib_s_typelibs(VALUE self) { HKEY htypelib, hguid; DWORD i, j; LONG err; VALUE guid; VALUE version; VALUE name = Qnil; VALUE typelibs = rb_ary_new(); VALUE typelib = Qnil; HRESULT hr; ITypeLib *pTypeLib; err = reg_open_key(HKEY_CLASSES_ROOT, "TypeLib", &htypelib); if(err != ERROR_SUCCESS) { return typelibs; } for(i = 0; ; i++) { guid = reg_enum_key(htypelib, i); if (guid == Qnil) break; err = reg_open_vkey(htypelib, guid, &hguid); if (err != ERROR_SUCCESS) continue; for(j = 0; ; j++) { version = reg_enum_key(hguid, j); if (version == Qnil) break; if ( (name = reg_get_val2(hguid, StringValuePtr(version))) != Qnil ) { hr = oletypelib_from_guid(guid, version, &pTypeLib); if (SUCCEEDED(hr)) { typelib = create_win32ole_typelib(pTypeLib); rb_ary_push(typelibs, typelib); } } } RegCloseKey(hguid); } RegCloseKey(htypelib); return typelibs; }