Registrien von COM-Objekten [DllRegisterServer]



  • Ich schreibe mir grad meine eigenen Komponenten und komme bei folgendem nicht weiter:

    Um die COM-Objekte in der DLL zu nutzen muss ich sie auch registrieren (wegen der CLSID nehm ich an 😕 ). Ich hab die Funktionen implementiert, und regsvr32.exe gibt keinen Error zurück. Deshalb glaube ich auch, dass mein Code zum Registrieren falsch ist..

    Der Code ist ursprünglich nicht von mir, ich hab ihn nur etwas abgeändert. Weiß irgendwer, wie man eine Komponente auf diese Weise richtig registrieren kann (oder ist das Beispiel vllt. doch richtig 😃 ).

    HRESULT  RegisterServer(void)
        {
        TCHAR *lpwszClsid;
    	//TCHAR szBuff[MAX_PATH]={0};
    	//TCHAR szClsid[MAX_PATH]={0}, szInproc[MAX_PATH]{0},szProgId[MAX_PATH]={0};
    	//TCHAR szDescriptionVal[256]={0};
    
    	TSTRING szBuff;
    	TSTRING szClsid, szInproc, szProgId;
    	TSTRING szDescriptionVal;
    
        StringFromCLSID(CLSID_IComponent, &lpwszClsid);
    	szClsid.append(lpwszClsid);
    
            /// "CLSID\\{GUID}\\InProcServer32"
    	szInproc.append(L"clsid\\");	// INPROC - STRING //
    	szInproc.append(szClsid);
    	szInproc.append(L"\\");
    	szInproc.append(L"InProcServer32");
    
            /// "CLSID\\{GUI}\\ProgId
    	szProgId.append(L"clsid\\");	/// PROGID - STRING //
    	szProgId.append(szClsid);
    	szProgId.append(L"\\ProgId");
    	//wsprintf(szProgId,"%s\\%s\\%s","clsid",szClsid,"ProgId");
    
        //
        //write the default value 
        //
        szBuff.append(L"COM-Objects");
    	//wsprintf(szBuff,"%s","Fast Addition Algorithm");
        //// Description: "CLSID\\{CLSID}
        szDescriptionVal.append(L"clsid\\");
    	szDescriptionVal.append(szClsid);
    	//wsprintf(szDescriptionVal,"%s\\%s","clsid",szClsid);
    
        HelperWriteKey (
                    HKEY_CLASSES_ROOT,
                    szDescriptionVal.c_str(),
                    NULL,//write to the "default" value
                    REG_SZ,
                    (void*)szBuff.c_str(),
                    szBuff.size()
                    );
    
        //
        //write the "InprocServer32" key data
        //
    	szBuff.clear();
        GetModuleFileName(
                    g_hModule,
                    (LPWCH)szBuff.c_str(),
                    szBuff.size());
        HelperWriteKey (
                    HKEY_CLASSES_ROOT,
                    szInproc.c_str(),
                    NULL,//write to the "default" value
                    REG_SZ,
                    (void*)szBuff.c_str(),
                    szBuff.size()
                    );
    
        //
        //write the "ProgId" key data under HKCR\clsid\{---}\ProgId
        //
        szBuff.assign(AddObjProgId);
        HelperWriteKey (
                    HKEY_CLASSES_ROOT,
                    szProgId.c_str(),
                    NULL,
                    REG_SZ,
                    (void*)szBuff.c_str(),
                    szBuff.size()
                    );
    
        //
        //write the "ProgId" data under HKCR\CodeGuru.FastAddition
        //
        szBuff.assign(L"COM-objects");
        HelperWriteKey (
                    HKEY_CLASSES_ROOT,
                    AddObjProgId,
                    NULL,
                    REG_SZ,
                    (void*)szBuff.c_str(),
                    szBuff.size()
                    );
    
        szProgId.assign(AddObjProgId);
    	szProgId.append(L"\\CLSID");
        HelperWriteKey (
                    HKEY_CLASSES_ROOT,
                    szProgId.c_str(),
                    NULL,
                    REG_SZ,
                    (void*)szClsid.c_str(),
                    szClsid.size()
                    );
    
        return 1;
    
        }
    

    danke für eure Antworten! 😉



  • ich hätte auch noch ein registry "makefile":

    REGEDIT
     HKEY_CLASSES_ROOT\HAWKlibraries.Component.1 = HAWKlibraries Component Version 1.0
     HKEY_CLASSES_ROOT\HAWKlibraries.Component.1\CLSID =  {5a749fa8-240a-400e-802b-42c6c9b3877f}
     HKEY_CLASSES_ROOT\HAWKlibraries.Component = HAWKlibraries Component 
     HKEY_CLASSES_ROOT\HAWKlibraries.Component\CurVer = HAWKlibraries.Component.1
     HKEY_CLASSES_ROOT\CLSID\{5a749fa8-240a-400e-802b-42c6c9b3877f} = HAWKlibraries Component 1.0
     HKEY_CLASS_ROOT\CLSID\{5a749fa8-240a-400e-802b-42c6c9b3877f}\InprocServer32 = C:\Dokumente und Einstellungen\Administrator\Desktop\TestCom\WinCOM\Debug\WinCOM.dll
     HKEY_CLASSES_ROOT\CLSID\{5a749fa8-240a-400e-802b-42c6c9b3877f}\ProgID = HAWKlibrariest.Component.1
     HKEY_CLASSES_ROOT\CLSID\{5a749fa8-240a-400e-802b-42c6c9b3877f}\VersionIndependentProgID = HAWKlibraries.Component
    


  • habs selber rausgefunden (entschuldigt die selbstgespräche 😃 ):

    um ein COM-Objekt zu registrieren sollte man folgende Werte festlegen:

    HKEY_CLASSES_ROOT
    ----- <Programm.Komponente.Version> [DESCR]*
    ---------CLSID --> default-Wert = CLSID (Typ: REG_SZ)*

    HKEY_CLASSES_ROOT
    --------CLSID
    ---------{CLSID der Komponente } [DESCR] *
    -------------InprocServer32 ---> default-Wert = Pfad + Name der DLL *
    -------------ProgId ---> default-Wert = <Programm.Komponente.Version> *

    Alle mit * versehenen Schlüssel müssen erstellt und gefüllt werden, dazu nimmt man RegSetEx und RegCreateEx. mit ner .reg datei ginge es natürlich auch.
    DESCR heißt, dass der default-Wert des Unterordners eine Beschreibung enthalten darf.


Anmelden zum Antworten