// // Register the component in the registry. // HRESULT RegisterServer(const CLSID& clsid, // Class ID const char *szFileName, // DLL module handle const char* szProgID, // IDs const char* szDescription, // Description String const char* szVerIndProgID) // optional { // Convert the CLSID into a char. char szCLSID[CLSID_STRING_SIZE] ; CLSIDtoString(clsid, szCLSID, sizeof(szCLSID)) ; // Build the key CLSID\\{...} char szKey[64] ; strcpy(szKey, "CLSID\\") ; strcat(szKey, szCLSID) ; // Add the CLSID to the registry. SetKeyAndValue(szKey, NULL, szDescription) ; // Add the server filename subkey under the CLSID key. SetKeyAndValue(szKey, "InprocServer32", szFileName) ; // Add the ProgID subkey under the CLSID key. if (szProgID != NULL) { SetKeyAndValue(szKey, "ProgID", szProgID) ; SetKeyAndValue(szProgID, "CLSID", szCLSID) ; } if (szVerIndProgID) { // Add the version-independent ProgID subkey under CLSID key. SetKeyAndValue(szKey, "VersionIndependentProgID", szVerIndProgID) ; // Add the version-independent ProgID subkey under HKEY_CLASSES_ROOT. SetKeyAndValue(szVerIndProgID, NULL, szDescription) ; SetKeyAndValue(szVerIndProgID, "CLSID", szCLSID) ; SetKeyAndValue(szVerIndProgID, "CurVer", szProgID) ; // Add the versioned ProgID subkey under HKEY_CLASSES_ROOT. SetKeyAndValue(szProgID, NULL, szDescription) ; SetKeyAndValue(szProgID, "CLSID", szCLSID) ; } return S_OK ; }
/* static private */ HRESULT REGUTIL::_RegisterClassBase( REFCLSID rclsid, const char *szDesc, const char *szProgID, const char *szIndepProgID, char *szOutCLSID ) { char szID[64]; // the class ID to register. OLECHAR szWID[64]; // helper for the class ID to register. StringFromGUID2( rclsid, szWID, NumItems( szWID ) ); WideCharToMultiByte( CP_ACP, 0, szWID, -1, szID, sizeof( szID ), NULL, NULL ); strcpy( szOutCLSID, "CLSID\\" ); strcat( szOutCLSID, szID ); // create ProgID keys. SetKeyAndValue( szProgID, NULL, szDesc ); SetKeyAndValue( szProgID, "CLSID", szID ); // create VersionIndependentProgID keys. SetKeyAndValue( szIndepProgID, NULL, szDesc ); SetKeyAndValue( szIndepProgID, "CurVer", szProgID ); SetKeyAndValue( szIndepProgID, "CLSID", szID ); // create entries under CLSID. SetKeyAndValue( szOutCLSID, NULL, szDesc ); SetKeyAndValue( szOutCLSID, "ProgID", szProgID ); SetKeyAndValue( szOutCLSID, "VersionIndependentProgID", szIndepProgID ); SetKeyAndValue( szOutCLSID, "NotInsertable", NULL ); return S_OK; } // REGUTIL::_RegisterClassBase
/* static public */ HRESULT REGUTIL::RegisterCOMClass( REFCLSID rclsid, const char *szDesc, const char *szProgIDPrefix, int iVersion, const char *szClassProgID, const char *szThreadingModel, const char *szModule ) { HRESULT hr; char rcCLSID[MAX_LENGTH]; // CLSID\\szID. char rcProgID[MAX_LENGTH]; // szProgIDPrefix.szClassProgID char rcIndProgID[MAX_LENGTH]; // rcProgID.iVersion char rcInproc[MAX_LENGTH + 2]; // CLSID\\InprocServer32 // format the prog ID values. sprintf( rcIndProgID, "%s.%s", szProgIDPrefix, szClassProgID ) ; sprintf( rcProgID, "%s.%d", rcIndProgID, iVersion ); // do the initial portion. hr = REGUTIL::_RegisterClassBase( rclsid, szDesc, rcProgID, rcIndProgID, rcCLSID ); if ( SUCCEEDED( hr ) ) { // set the server path. SetKeyAndValue( rcCLSID, "InprocServer32", szModule ); // add the threading model information. sprintf( rcInproc, "%s\\%s", rcCLSID, "InprocServer32" ); SetRegValue( rcInproc, "ThreadingModel", szThreadingModel ); } return hr; } // REGUTIL::RegisterCOMClass
// returns 0 or winerror.h error code int reg(BOOL set, LPSTR keys) { WCHAR szwork[128]; char szID[128]; char szCLSID[128]; char szLIBID[128]; char iid[128]; char szLIBTYPELIBID[128]; char szdir[512]; char path[256]; char inter[256]; char typetext[256]; char progidcurtext[256]; char progidtext[256]; LPSTR p; char progidcur[100]; char module[_MAX_PATH]; int r; GetModuleFileNameA(g_hinst, module, sizeof(module)); #ifdef _JDLL char progid[100] = "JDLLServer"; char producttext[] = "J DLL Server "; #else char progid[100] = "JEXEServer"; char producttext[] = "J EXE Server "; #endif setguids(); strcat(progid, jclass); strcpy(progidcur, progid); strcat(progidcur, "."); strcat(progidcur, jversion); StringFromGUID2(jclsid, szwork, 128); toasc(szwork, szID); strcpy(szCLSID, "CLSID\\"); strcat(szCLSID, szID); StringFromGUID2(jlibid, szwork, 128); toasc(szwork, szLIBID); strcpy(szLIBTYPELIBID, "TypeLib\\"); strcat(szLIBTYPELIBID, szLIBID); StringFromGUID2(jiid, szwork, 128); toasc(szwork, iid); strcpy(inter, "Interface\\"); strcat(inter, iid); strcpy(szdir, module); p=strrchr(szdir, '\\'); *p=0; keys[0]=0; strcpy(progidtext, "Jsoftware : "); strcat(progidtext, producttext); strcat(progidtext, jclass); strcpy(progidcurtext, progidtext); strcat(progidcurtext, " (version "); strcat(progidcurtext, jversion); strcat(progidcurtext, ")"); //HKEY_CLASSES_ROOT\JServer.Object = J Server r=SetKeyAndValue(set, keys, progid, 0, progidtext); if(r) return r; //HKEY_CLASSES_ROOT\JServer.Object\CLSID = {21EB05E0-1AB3-11cf-A2AC-8FF70874C460} setpath(progid,"\\CLSID"); r=SetKeyAndValue(set, keys, path, 0, szID); if(r) return r; //HKEY_CLASSES_ROOT\JServer.Object\CurVer = JServer.Object.1 setpath(progid,"\\CurVer"); r=SetKeyAndValue(set, keys, path, 0, progidcur); if(r) return r; //HKEY_CLASSES_ROOT\JServer.Object\NotInsertable setpath(progid,"\\NotInsertable"); r=SetKeyAndValue(set, keys, path, 0, 0); if(r) return r; //HKEY_CLASSES_ROOT\JServer.Object.1 = J Server (Ver 1.0) r=SetKeyAndValue(set, keys, progidcur, 0, progidcurtext); if(r) return r; //HKEY_CLASSES_ROOT\JServer.Object.1\CLSID = {21EB05E0-1AB3-11cf-A2AC-8FF70874C460} setpath(progidcur,"\\CLSID"); r=SetKeyAndValue(set, keys, path, 0, szID); if(r) return r; //HKEY_CLASSES_ROOT\JServer.Object.1\NotInsertable setpath(progidcur, "\\NotInsertable"); r=SetKeyAndValue(set, keys, path, 0, 0); if(r) return r; //HKEY_CLASSES_ROOT\CLSID\{21EB05E0-1AB3-11cf-A2AC-8FF70874C460} = J Server (Ver 1.0) r=SetKeyAndValue(set, keys, szCLSID, 0, progidcurtext); if(r) return r; #ifdef _JDLL //HKEY_CLASSES_ROOT\CLSID\{21EB05E0-1AB3-11cf-A2AC-8FF70874C460}\InprocServer32 = d:\dev\jcom\jcom\windebug\jserver.dll r=SetKeyAndValue(set, keys, szCLSID, "InprocServer32", module); if(r) return r; r=SetKeyAndNamedValue(set, keys, szCLSID, "InprocServer32", "Apartment", "ThreadingModel"); if(r) return r; #else //HKEY_CLASSES_ROOT\CLSID\{21EB05E0-1AB3-11cf-A2AC-8FF70874C460}\LocalServer32 = d:\dev\jcom\jcom\windebug\jserver.dll r=SetKeyAndValue(set, keys, szCLSID, "LocalServer32", module); if(r) return r; //HKEY_CLASSES_ROOT\CLSID\{21EB05E0-1AB3-11cf-A2AC-8FF70874C460}\LocalHandler32 = ole32.dll r=SetKeyAndValue(set, keys, szCLSID, "LocalHandler32", "ole32.dll"); if(r) return r; #endif //HKEY_CLASSES_ROOT\CLSID\{21EB05E0-1AB3-11cf-A2AC-8FF70874C460}\ProgID = JServer.Object.1 r=SetKeyAndValue(set, keys, szCLSID, "ProgID", progidcur); if(r) return r; //HKEY_CLASSES_ROOT\CLSID\{21EB05E0-1AB3-11cf-A2AC-8FF70874C460}\VersionIndependentProgID = JServer.Object r=SetKeyAndValue(set, keys, szCLSID, "VersionIndependentProgID", progid); if(r) return r; //HKEY_CLASSES_ROOT\CLSID\{21EB05E0-1AB3-11cf-A2AC-8FF70874C460}\TypeLib = {21EB05E1-1AB3-11cf-A2AC-8FF70874C460} r=SetKeyAndValue(set, keys, szCLSID, "TypeLib", szLIBID); if(r) return r; //HKEY_CLASSES_ROOT\CLSID\{21EB05E0-1AB3-11cf-A2AC-8FF70874C460}\Programmable r=SetKeyAndValue(set, keys, szCLSID, "Programmable", 0); if(r) return r; //HKEY_CLASSES_ROOT\CLSID\{21EB05E0-1AB3-11cf-A2AC-8FF70874C460}\NotInsertable r=SetKeyAndValue(set, keys, szCLSID, "NotInsertable", 0); if(r) return r; //HKEY_CLASSES_ROOT\TypeLib\{21EB05E1-1AB3-11cf-A2AC-8FF70874C460} = J Server Type Library strcpy(typetext, producttext); strcat(typetext, jclass); strcat(typetext, " Type Library"); r=SetKeyAndValue(set, keys, szLIBTYPELIBID, 0, typetext); if(r) return r; //HKEY_CLASSES_ROOT\TypeLib\{21EB05E1-1AB3-11cf-A2AC-8FF70874C460}\DIR = d:\dev\jcom r=SetKeyAndValue(set, keys, szLIBTYPELIBID, "DIR", szdir); if(r) return r; //HKEY_CLASSES_ROOT\TypeLib\{21EB05E1-1AB3-11cf-A2AC-8FF70874C460}\HELPDIR = d:\dev\jcom\jcomhelp r=SetKeyAndValue(set, keys, szLIBTYPELIBID, "HELPDIR", szdir); if(r) return r; //HKEY_CLASSES_ROOT\TypeLib\{21EB05E1-1AB3-11cf-A2AC-8FF70874C460}\1.0 = J Server (Ver 1.0) Type Library setpath(jversion, ".0"); strcpy(typetext, producttext); strcat(typetext, jclass); strcat(typetext, " (version "); strcat(typetext, jversion); strcat(typetext, ") Type Library"); r=SetKeyAndValue(set, keys, szLIBTYPELIBID, path, typetext); if(r) return r; // note: key explicity added so we will be able to delete it //HKEY_CLASSES_ROOT\TypeLib\{21EB05E1-1AB3-11cf-A2AC-8FF70874C460}\1.0\0 setpath(jversion, ".0\\0"); r=SetKeyAndValue(set, keys, szLIBTYPELIBID, path, module); if(r) return r; //HKEY_CLASSES_ROOT\TypeLib\{21EB05E1-1AB3-11cf-A2AC-8FF70874C460}\1.0\0\win32 = d:\dev\jcom\jserver.tlb setpath(jversion, ".0\\0\\win32"); r=SetKeyAndValue(set, keys, szLIBTYPELIBID, path, module); if(r) return r; // interface must be registered for VB <set js as New IJEXEServer> //HKEY_CLASSES_ROOT\Interface\{21EB05E2-1AB3-11cf-A2AC-8FF70874C460} = IJEXEServer #ifdef _JDLL setpath("IJDLLServer", jclass); #else setpath("IJEXEServer", jclass); #endif r=SetKeyAndValue(set, keys, inter, 0, path); if(r) return r; //HKEY_CLASSES_ROOT\Interface\{21EB05E2-1AB3-11cf-A2AC-8FF70874C460}\ProxyStubClsid = {00020424-0000-0000-C000-000000000046} r=SetKeyAndValue(set, keys, inter, "ProxyStubClsid", INTERCLSID); if(r) return r; //HKEY_CLASSES_ROOT\Interface\{21EB05E2-1AB3-11cf-A2AC-8FF70874C460}\ProxyStubClsid32 = {00020424-0000-0000-C000-000000000046} r=SetKeyAndValue(set, keys, inter, "ProxyStubClsid32", INTERCLSID); if(r) return r; //HKEY_CLASSES_ROOT\Interface\{21EB05E2-1AB3-11cf-A2AC-8FF70874C460}\TypeLib = {21EB05E1-1AB3-11cf-A2AC-8FF70874C460} r=SetKeyAndValue(set, keys, inter, "TypeLib", szLIBID); if(r) return r; return 0; }