• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

VB.NET AsctiveX-DLL mit IObjectSafety

NetAktiv

Senior HTML'ler
Hallo,

will man lästige Abfragen beim Aufruf einer ActiveX-DLL aus einem Browser-Script beim IE vermeiden, dann muss man das Interface IObjectSafety implementieren. Ich bin dabei auf die Seite How to implement IObjectSafety in VB.Net - Sujith Nair - Site Home - MSDN Blogs gestoßen und habe versucht, das wie unten nachzuvollziehen. Allerdings kam bei mir mit VS2010 der Fehler, dass die Guid aus dem Beispiel fehlerhaft sei (das lag an der nicht-Hex HJ20). Ich habe das auf 0020 geändert. Aber bei mir kommt beim Erstellen des Objekts immer noch diese Sicherheitsabfrage.

Muss denn diese Guid stimmen oder kann man eine beliebige wählen (hab leider kein anderes Beispiel gefunden)?
Was kann denn sonst die Ursache sein?

Hinweis: Ich habe noch in jede Funktion ein WriteDebugInfo addiert und nur die Methode GetVersion wird protokolliert, also werden die Interface-Methoden nicht mal aufgerufen. Bei einer DLL, die ich für VB6 erstellt habe, werden diese Methoden vor jedem Aufruf einer anderen Methode der Klasse aufgerufen.

Code:
Public Class SafeCall    
    Implements IObjectSafety
    'declare constants     
    Private Const SAFE_UNTRUSTED_CALLER As Integer = &H1    
    Private Const SAFE_UNTRUSTED_DATA As Integer = &H2
    'Now we need to implement GetInterfaceSafetyOptions and SetInterfaceSafetyOptions in the class.    
   
    Public Function GetInterfaceSafetyOptions(ByRef iid As Guid, ByRef pdwSupportedOptions As Integer, _        
          ByRef pdwEnabledOptions As Integer) As Integer Implements IObjectSafety.GetInterfaceSafetyOptions
              pdwSupportedOptions = SAFE_UNTRUSTED_CALLER Or SAFE_UNTRUSTED_DATA            
              pdwEnabledOptions = SAFE_UNTRUSTED_CALLER Or SAFE_FOR_UNTRUSTED_DATA        
              Return 0
    End Function

    Public Function SetInterfaceSafetyOptions(ByRef iid As Guid, ByVal dwOptionSetMask As Integer, _
             ByVal dwEnabledOptions As Integer) As Integer Implements IObjectSafety.SetInterfaceSafetyOptions  
            Return 0    
    End Function
    
    Public Function GetVersion() As String        
         Return (System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString())    
    End Function
End Class


<ComImport()> _   
<Guid("CB6ADC81-93C1-11CF-0020-00805F2CD064")> _   
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IObjectSafety
    Function GetInterfaceSafetyOptions(ByRef iid As Guid, ByRef pdwSupportedOptions As Integer, ByRef pdwEnabledOptions As Integer) As Integer    
    Function SetInterfaceSafetyOptions(ByRef iid As Guid, ByVal dwOptionSetMask As Integer, ByVal dwEnabledOptions As Integer) As Integer
End Interface
 
Zuletzt bearbeitet:
Werbung:
Ich habe nun weiter geforscht, es muss die Guid vom Interface korrekt sein. Ich habe den C# Code aus pinvoke.net: IObjectSafety (Interfaces) nach VB übersetzt, die Guid hatte dort den korrekten Wert CB5BDC81-93C1-11CF-8F20-00805F2CD064 und mit der folgenden Interface-Definition passt nun alles:

Code:
<ComImport(), GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")> _
<InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IObjectSafety

    <PreserveSig()> _
    Function GetInterfaceSafetyOptions(ByRef riid As Guid, _ 
         <MarshalAs(UnmanagedType.U4)> ByRef pdwSupportedOptions As Integer, _ 
         <MarshalAs(UnmanagedType.U4)> ByRef pdwEnabledOptions As Integer) As Integer


    <PreserveSig()> _
    Function SetInterfaceSafetyOptions(ByRef riid As Guid, _ 
        <MarshalAs(UnmanagedType.U4)> ByVal dwOptionSetMask As Integer, _ 
        <MarshalAs(UnmanagedType.U4)> ByVal dwEnabledOptions As Integer) As Integer

End Interface
 
Zuletzt bearbeitet:
Zurück
Oben