Wie MFC ActiveX-Steuerelemente als sicher für Skripterstellung und Initialisierung zu markieren.

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 161873 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Zusammenfassung

Standardmäßig werden die MFC-ActiveX-Steuerelemente nicht als sicher für Skripterstellung und sicher für Initialisierung markiert. Dies wird deutlich, wenn das Steuerelement in Internet Explorer mit der Sicherheitsstufe auf Mittel oder Hoch ausgeführt wird. In beiden Modi können Warnungen, dass die Daten des Steuerelements nicht sicher ist oder, dass das Steuerelement möglicherweise nicht sicher für die Verwendung mit Skripts angezeigt werden.

Es sind zwei Methoden, die ein Steuerelement verwenden kann, um diesen Fehler zu vermeiden. Der erste umfasst das Steuerelement die IObjectSafety-Schnittstelle implementiert und ist nützlich für Steuerelemente, die Ihr Verhalten ändern und "sicher", wenn im Kontext eines Internetbrowsers ausgeführt werden. Die zweite umfasst, ändern DllRegisterServer-Funktion des Steuerelements, um das Steuerelement in der Registrierung "sicher" zu markieren. Dieser Artikel behandelt die zweite der folgenden Methoden. Die erste Methode, die IObjectSafety-Schnittstelle implementieren, wird im Internet Client SDK behandelt.

Bitte bedenken Sie, dass ein Steuerelement nur soll als sicher gekennzeichnet werden, wenn es, in der Tat sicher ist. Finden Sie in der Dokumentation Internet Client SDK eine Beschreibung dazu. Finden Sie unter Component Development Bereich unter "Sichere Initialisierung und Scripting für ActiveX-Steuerelemente".

Hinweis: Wie Sie ein Steuerelement sicher für Download markieren wird in diesem Artikel nicht behandelt. Weitere Informationen zu Code downloaden und Codesignaturen finden Sie im Internet Client SDK.

Weitere Informationen

Führen Sie diese Schritte aus, um Ihr MFC-ActiveX-Steuerelement als sicher für Skripterstellung und sicher für Initialisierung zu markieren:
  1. Implementieren Sie die Hilfsfunktionen CreateComponentCategory und RegisterCLSIDInCategory, indem Sie die folgenden cathelp.h und cathelp.cpp Dateien zum Projekt hinzufügen.

    Cathelp.h

          #include "comcat.h"
    
          // Helper function to create a component category and associated
          // description
          HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);
    
          // Helper function to register a CLSID as belonging to a component
          // category
          HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
    						

    Cathelp.cpp

          #include "comcat.h"
    
          // Helper function to create a component category and associated
          // description
          HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
          {
             ICatRegister* pcr = NULL ;
             HRESULT hr = S_OK ;
    
             hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                                   NULL,
                                   CLSCTX_INPROC_SERVER,
                                   IID_ICatRegister,
                                   (void**)&pcr);
             if (FAILED(hr))
                return hr;
    
             // Make sure the HKCR\Component Categories\{..catid...}
             // key is registered
             CATEGORYINFO catinfo;
             catinfo.catid = catid;
             catinfo.lcid = 0x0409 ; // english
    
             // Make sure the provided description is not too long.
             // Only copy the first 127 characters if it is
             int len = wcslen(catDescription);
             if (len>127)
                len = 127;
             wcsncpy(catinfo.szDescription, catDescription, len);
             // Make sure the description is null terminated
             catinfo.szDescription[len] = '\0';
    
             hr = pcr->RegisterCategories(1, &catinfo);
             pcr->Release();
    
             return hr;
          }
    
          // Helper function to register a CLSID as belonging to a component
          // category
          HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
          {
             // Register your component categories information.
             ICatRegister* pcr = NULL ;
             HRESULT hr = S_OK ;
             hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                                   NULL,
                                   CLSCTX_INPROC_SERVER,
                                   IID_ICatRegister,
                                   (void**)&pcr);
             if (SUCCEEDED(hr))
             {
                // Register this category as being "implemented" by
                // the class.
                CATID rgcatid[1] ;
                rgcatid[0] = catid;
                hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
             }
    
             if (pcr != NULL)
                pcr->Release();
    
             return hr;
          }
    						
  2. Ändern Sie DllRegisterServer um das Steuerelement als sicher markieren. Suchen Sie die Implementierung der DllRegisterServer in einer CPP-Datei in Ihrem Projekt. Sie benötigen mehrere Dinge dieser .cpp-Datei hinzuzufügen. Die Datei, die CreateComponentCategory und RegisterCLSIDInCategory implementiert:
          #include "CatHelp.h"
    						
    Definieren der Sicherheit Komponentenkategorien zugeordnete GUID:
          const CATID CATID_SafeForScripting     =
          {0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
          const CATID CATID_SafeForInitializing  =
          {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
    						
    definieren die dem Steuerelement zugeordnete GUID. Der Einfachheit halber können Sie die GUID aus der IMPLEMENT_OLECREATE_EX -Makro in die wichtigsten cpp-Datei für das Steuerelement leihen. Das Format leicht anpassen, sodass wie folgt aussieht:
          const GUID CDECL BASED_CODE _ctlid =
          { 0x43bd9e45, 0x328f, 0x11d0,
                  { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
    						
    in das Steuerelement als beide sicher zu kennzeichnen, für Skripterstellung und Initialisierung, DllRegisterServer-Funktion wie folgt ändern:
          STDAPI DllRegisterServer(void)
          {
              AFX_MANAGE_STATE(_afxModuleAddrThis);
    
              if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
                  return ResultFromScode(SELFREG_E_TYPELIB);
    
              if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
                  return ResultFromScode(SELFREG_E_CLASS);
    
              if (FAILED( CreateComponentCategory(
                      CATID_SafeForScripting,
                      L"Controls that are safely scriptable") ))
                    return ResultFromScode(SELFREG_E_CLASS);
    
              if (FAILED( CreateComponentCategory(
                      CATID_SafeForInitializing,
                      L"Controls safely initializable from persistent data") ))
                    return ResultFromScode(SELFREG_E_CLASS);
    
              if (FAILED( RegisterCLSIDInCategory(
                      _ctlid, CATID_SafeForScripting) ))
                    return ResultFromScode(SELFREG_E_CLASS);
    
              if (FAILED( RegisterCLSIDInCategory(
                      _ctlid, CATID_SafeForInitializing) ))
                    return ResultFromScode(SELFREG_E_CLASS);
    
              return NOERROR;
          }
    						
Sie würden nicht normalerweise DllUnregisterServer-Funktion folgenden zwei Gründen ändern:
  • Sie möchten eine Komponentenkategorie entfernen, da andere Steuerelemente verwendet werden können.
  • Es gibt zwar eine UnRegisterCLSIDInCategory-Funktion definiert, entfernt standardmäßig DllUnregisterServer des Steuerelements Eintrag aus der Registrierung vollständig. Daher ist die Kategorie aus Registrierung des Steuerelements entfernt von geringem nutzen.
Nach dem Kompilieren und registriert das Steuerelement, sollten Sie die folgenden Einträge in der Registrierung finden:
   HKEY_CLASSES_ROOT\Component
   Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}

   HKEY_CLASSES_ROOT\Component
   Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}

   HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
   Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}

   HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
   Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
				

Informationsquellen

Internet Client SDK - Komponenten Development - sichere Initialisierung und Scripting für ActiveX-Steuerelemente

Eigenschaften

Artikel-ID: 161873 - Geändert am: Donnerstag, 1. September 2005 - Version: 3.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C++ 4.2 Enterprise Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Internet Client Software Development Kit 4.0
  • Microsoft Internet Client Software Development Kit 4.01
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
Keywords: 
kbmt kbmfc kbctrl kbhowto kbinprocsvr KB161873 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 161873
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com