PRB: WFC-basierte ActiveX-Steuerelement ist nicht sicher für Skripting

Problembeschreibung

Wenn Sie Microsoft Windows Foundation Classes für Java (WFC) verwenden, um ein ActiveX-Steuerelement zu erstellen, möglicherweise die folgende Fehlermeldung (oder ähnlich) host das Steuerelement in Internet Explorer 5:

Diese Seite enthält möglicherweise nicht sicher – Steuerelemente und Steuerelemente nicht für Skriptcode verfügbar gemacht werden oder überhaupt nicht auf der Seite geladen.

URSACHE

Dieses Problem tritt auf, weil standardmäßig WFC-basierte ActiveX-Steuerelemente nicht sicher für Skripting als werden und Internet Explorer 5 so konfiguriert ist, dass ein ActiveX-Steuerelement, das nicht als sicher für Skripting markiert ist scripting deaktivieren.

Lösung

Um ein ActiveX-Steuerelement als sicher für Skripting programmgesteuert zu markieren, müssen Sie wie folgt die IObjectSafety Component Object Model (COM)-Schnittstelle implementieren:

  1. Erstellen Sie die folgende Objsafe.idl Datei, die eine Bibliothek für IObjectSafetyerstellt:
    //+---------------------------------------------------------------------------// //  Copyright 1996-1997 Microsoft Corporation. All Rights Reserved.// //  Contents:   Object Safety Interfaces (should come from ObjSafe.idl)// //----------------------------------------------------------------------------[  uuid(58357B30-FCF0-11d2-9AFA-0008C76BD28A),  helpstring("IObjectSafety Type Library")]library ObjSafe{   importlib("StdOle2.Tlb");   [      object,      uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),      pointer_default(unique)   ]   interface IObjectSafety : IUnknown   {      HRESULT GetInterfaceSafetyOptions(          [in]  REFIID riid,                  // Interface that we want options for          [out] DWORD  * pdwSupportedOptions, // Options meaningful on this interface          [out] DWORD  * pdwEnabledOptions);  // Current option values on this interface      HRESULT SetInterfaceSafetyOptions(          [in]  REFIID riid,                  // Interface to set options for          [in]  DWORD  dwOptionSetMask,       // Options to change          [in]  DWORD  dwEnabledOptions);     // New option values   }}
  2. Befehlszeile geben Sie folgenden Befehl eine Typbibliotheksdatei (.tlb) zu erstellen:
    MIDL-objsafe.idl
  3. Erstellen Sie in Visual J++ 6.0 ein WFC-Projekt
  4. Erstellen Sie eine Wrapperklasse für die Objsafe.tlb-Datei, die Sie in Schritt 2 erstellt haben. Dazu klicken Sie auf Project.Add COM-Wrapperund dann auf Objsafe.tlb.
  5. Implementieren Sie IObjectSafety -Schnittstellenmethoden, wie im folgenden Artikel der Microsoft Web Workshop aufgeführt:Das folgende Codebeispiel veranschaulicht die IObjectSafety in Java implementieren:

    import com.ms.wfc.core.*;import com.ms.wfc.ui.*;import objsafe.*;/** * This class is a visual component. The entry point for class execution * is the constructor. *  * This class can be used as an ActiveX control.  * Select the check box for this class on the Project Properties  * COM Classes tab, or remove the  // from the next line.//*@com.register ( clsid=04FF1C46-3F64-4055-8CDD-0A46A7177B77,typelib=5D3EA1DE-AC49-4ADF-9FD3-22E273DF1B24 ) *@com.register ( clsid=5B255D39-21F4-421B-84E2-F12A6598B1D4,typelib=1A4FF1B3-6FBA-4FB0-889E-369947A5A72D ) */ public class Control1 extends UserControl implements IObjectSafety{   public Control1()      {// Required for Visual J++ Form Designer support:initForm();// TO DO: Add any constructor code after initForm call.      }      public String TestSafetyMethod()      {return "Passed!";      }      //Implement IObjectSafety:public void GetInterfaceSafetyOptions(com.ms.com._Guid riid, int[] pdwSupportedOptions, int[]  pdwEnabledOptions)   {      pdwSupportedOptions[0] = INTERFACE_SAFE_FOR_UNTRUSTED_CALLER | INTERFACE_SAFE_FOR_UNTRUSTED_DATA;      if (riid != null)      {   com.ms.wfc.util.Debug.println("riid: " + riid.toString());   if (riid.equals(IID_IDispatch))           {             pdwEnabledOptions[0] = 0;     if (SAFE_FOR_SCRIPTING) pdwEnabledOptions[0] = INTERFACE_SAFE_FOR_UNTRUSTED_CALLER;   }   else if (  riid.equals(IID_IPersistPropertyBag)    || riid.equals(IID_IPersistStorage)    || riid.equals(IID_IPersistStream) )   {pdwEnabledOptions[0] = 0;if (SAFE_FOR_INITIALIZATION) pdwEnabledOptions[0] = INTERFACE_SAFE_FOR_UNTRUSTED_DATA;   }   else throw new com.ms.com.ComFailException(E_NOINTERFACE);}   }public void SetInterfaceSafetyOptions(com.ms.com._Guid riid, int dwOptionSetMask, int dwEnabledOptions){   if (riid != null)   {      com.ms.wfc.util.Debug.println("riid: " + riid.toString());      if (riid.equals(IID_IDispatch))      {         if ((dwEnabledOptions & dwOptionSetMask) != INTERFACE_SAFE_FOR_UNTRUSTED_CALLER) {       throw new com.ms.com.ComFailException(E_FAIL); } else {     if (SAFE_FOR_SCRIPTING == false)     {   throw new com.ms.com.ComFailException(E_FAIL);     } }      }      else if (  riid.equals(IID_IPersistPropertyBag)  || riid.equals(IID_IPersistStorage)  || riid.equals(IID_IPersistStreamInit)  || riid.equals(IID_IPersistStream) )      {   if ((dwEnabledOptions & dwOptionSetMask) !=INTERFACE_SAFE_FOR_UNTRUSTED_DATA)   {     throw new com.ms.com.ComFailException(E_FAIL);   }   else   {       if (SAFE_FOR_INITIALIZATION == false)       {   throw new com.ms.com.ComFailException(E_FAIL);       }   }      }      else throw new com.ms.com.ComFailException(E_NOINTERFACE);   }}//GUIDs for IObjectSafety methods:public static final com.ms.com._Guid IID_IDispatch = new com.ms.com._Guid("{00020400-0000-0000-C000-000000000046}");public static final com.ms.com._Guid IID_IPersistStorage = new com.ms.com._Guid("{0000010A-0000-0000-C000-000000000046}");public static final com.ms.com._Guid IID_IPersistStream = new com.ms.com._Guid("{00000109-0000-0000-C000-000000000046}");public static final com.ms.com._Guid IID_IPersistPropertyBag = new com.ms.com._Guid("{37D84F60-42CB-11CE-8135-00AA004BB851}");public static final com.ms.com._Guid IID_IPersistStreamInit = new com.ms.com._Guid("{7FD52380-4E07-101B-AE2D-08002B2EC713}");//Constants for IObjectSafety methods:public static final int INTERFACE_SAFE_FOR_UNTRUSTED_CALLER = 0x1;public static final int INTERFACE_SAFE_FOR_UNTRUSTED_DATA   = 0x2;public static final int E_NOINTERFACE = 0x80004002;public static final int E_FAIL        = 0x80004005;//IObjectSafety settings:public static final boolean SAFE_FOR_SCRIPTING = true;public static final boolean SAFE_FOR_INITIALIZATION = true;   /**     * NOTE: The Visual J++ Form Designer requires the following code.     * You can use the Form editor to modify the code; however, do     * not use the code editor to modify the code.   */      Container components = new Container();     Label label1 = new Label();     private void initForm()     {this.setSize(new Point(164, 71));this.setText("Control1");label1.setLocation(new Point(32, 24));label1.setSize(new Point(100, 16));label1.setTabIndex(0);label1.setTabStop(false);label1.setText("IObjectSafety Rules!");this.setNewControls(new Control[] {label1});      }// NOTE: End of Form Designer support code.      public static class ClassInfo extends UserControl.ClassInfo      {// TO DO: Add your property and event information here.      }}
  6. Erstellen Sie das Projekt.
  7. Folgen Sie den Schritten im Microsoft Knowledge Base Artikel 247315 auf das Steuerelement als COM-Dynamic Link Library (DLL) Datei packen und in einer CAB-Datei auf das Steuerelement von scripting packen.
  8. Erstellen Sie eine neue HTML-Datei, die die Installation beginnt, wenn darauf zugegriffen wird.

    Erstellen Sie die HTML-Datei in demselben Ordner wie die generierte CAB-Datei. Im folgende Beispiel wird davon ausgegangen, dass die CAB-Datei Cabinet1.cab heißt. Ersetzen Sie den Beispiel ClassID mit ClassID in das Tag "@com.register" innerhalb der ersten Kommentarblock in Control1.java aufgeführt:
    <HTML>      <script language=javascript for=window event=onload>      <!--         alert(Control1.TestSafetyMethod());      //-->      </script>    <BODY>   <OBJECT classid=clsid:99999999-9999-9999-9999-999999999999 id=Control1 VIEWASTEXT codeBase="Cabinet1.CAB#version=1,1,1,1">   </OBJECT>   You should see a MessageBox saying "Passed".   </BODY>   </HTML>

Weitere Informationen

Markieren Sie die Steuerelemente als sicher für Skripting nur, wenn alle öffentlichen Methoden, die die Steuerelemente verfügbar machen keine Vorgänge durchführen, die außerhalb, d. h. alles, was die Sicherheit beeinträchtigen könnte insbesondere auf Datenträger oder Netzwerkressourcen oder Datei Enumerationen.

REFERENZEN

Weitere Informationen finden Sie in folgendem
um die Artikel in der Microsoft Knowledge Base:

182598 so wird's gemacht: Implementieren IObjectSafety in Visual Basic-Steuerelemente
Weitere Informationen zu sicheren Initialisierung und scripting von ActiveX-Steuerelementen finden Sie im MSDN-Artikel:
Weitere Informationen zu IObjectSafety Extensions finden Sie im MSDN-Artikel:
Weitere Informationen zur IObjectSafety -Schnittstelle finden Sie im MSDN-Artikel:
Supportinformationen zu Visual J++ und Java SDK finden Sie auf der folgenden Microsoft-Website:
Eigenschaften

Artikelnummer: 252661 – Letzte Überarbeitung: 15.02.2017 – Revision: 1

Microsoft Visual J++ 1.1 Standard Edition, Microsoft Visual J++ 6.0 Standard Edition, Microsoft Internet Explorer 5.0, Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5, Microsoft Software Development Kit für Java 1.51, Microsoft Software Development Kit for Java 3.2, Microsoft Software Development Kit for Java 4.0

Feedback