/* HKEY_CLASSES_ROOT\ TypeLib\ {GUID}\ Version\ (既定) 名前 数字←マイナーバージョンらしい win32/win16など\ (既定) 所在 */ #define WIN32_LEAN_AND_MEAN #include #include #include #include #define AUTOMATIC_SAVE_FILE #define DEFAULT_FILE_NAME "ViewRef.txt" #define NAME_LEN 0x100 #define MAX_LEN 0x100 FILE* fp; void GetSZ(char* key, char* result) { HKEY handle; static BYTE data[MAX_LEN]; DWORD datalen; DWORD typeval; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, key, 0, KEY_QUERY_VALUE, &handle) != ERROR_SUCCESS){ fprintf(stderr, "RegOpenKeyEx(%s) failed.\n", key); return; } datalen = MAX_LEN - 1; typeval = REG_SZ; if(RegQueryValueEx(handle, NULL, NULL, &typeval, (BYTE*)data, &datalen) == ERROR_SUCCESS) { strcpy(result, (char*)data); } else { fprintf(stderr, "RegQueryValueEx(%s, NULL) failed.\n", key); } RegCloseKey(handle); } void Registry_foreach(HKEY key, char* rname, int (*func)(char* basename, char* keyname)) { HKEY handle; if(RegOpenKeyEx(key, rname, 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &handle) != ERROR_SUCCESS) { fprintf(stderr, "RegOpenKeyEx(%s) failed.\n", rname); return; } char name[NAME_LEN]; char classname[NAME_LEN]; DWORD namesize; DWORD classnamesize; DWORD index = 0; FILETIME dummy; LONG result; do{ namesize = classnamesize = NAME_LEN - 1; result = RegEnumKeyEx(handle, index, (char*)name, &namesize, NULL, (char*)classname, &classnamesize, &dummy); if(result != ERROR_SUCCESS) break; if(!func(rname, name))break; index++; } while(1); RegCloseKey(handle); } int Query_Body_func(char* basename, char* keyname) { char buf[MAX_LEN]; sprintf(buf, "%s\\%s", basename, keyname); char buf2[MAX_LEN]; GetSZ(buf, buf2); fprintf(fp, "%s(%s), ", buf2, keyname); return 1; } void Query_Body(char* minorversion) { Registry_foreach(HKEY_CLASSES_ROOT, minorversion, Query_Body_func); } int Query_MinorVersion_func(char* basename, char* keyname) { if(keyname[0] != '0'){ if(atoi(keyname) == 0) return 1; } char buf[MAX_LEN]; fprintf(fp, "%s: ", keyname); sprintf(buf, "%s\\%s", basename, keyname); Query_Body(buf); return 1; } void Query_MinorVersion(char* product) { Registry_foreach(HKEY_CLASSES_ROOT, product, Query_MinorVersion_func); } int Query_Product_func(char* basename, char* keyname) { char buf[NAME_LEN * 2]; char buf2[NAME_LEN * 2]; sprintf(buf, "%s\\%s", basename, keyname); GetSZ(buf, buf2); fprintf(fp, "%s (%s)\t", buf2, keyname); sprintf(buf, "%s\\%s", basename, keyname); Query_MinorVersion(buf); fprintf(fp, "\n"); return 1; } void Query_Product(char* rname) { Registry_foreach(HKEY_CLASSES_ROOT, rname, Query_Product_func); // バージョン検索ループ } int main_func(char* basename, char* keyname) { char buf[NAME_LEN]; sprintf(buf, "%s\\%s", basename, keyname); Query_Product(buf); return 1; } int main(int argc, char* argv[]) { char* filename; if(argc >= 2){ filename = argv[1]; fp = fopen(filename, "w+"); } else { #ifdef AUTOMATIC_SAVE_FILE filename = DEFAULT_FILE_NAME; fp = fopen(DEFAULT_FILE_NAME, "w+"); #else filename = "(stdout)"; fp = stdout; #endif } if(fp == NULL){ perror(argv[0]); return 1; } Registry_foreach(HKEY_CLASSES_ROOT, "TypeLib", main_func); // GUID検索ループ return 0; }