Änderungen der ActiveX Aufrufe in Visual Studio .NET

  1. Optionale Parameter werden beim Aufruf eines Mitglieds immer mit einem Wert an das ActiveX gesendet. Dies ist der standard Initialisierungswert des Typs der übergebenen Variablen. In der Regel werden dabei von NET keine Ausnahmen gemacht, auch wenn der optionale Parameter einen anderen Vorgabewert in der Deklaration der Methode hat. Dieser Unterschied kann zu einer Fehlermeldung im ActiveX führen. Zur Abhilfe muss der jeweilige Parameter mit dem Wert angegeben werden, welcher dem optionalen Parameter in der Deklaration als Vorgabewert zugewiesen wird, z.B.

    Public Function dtHoliday(Optional enumIndexGE As enumGermanLegalHolidays = -1, Optional enumIndexUS As enumUSLegalHolidays = -1) As Date

    -1 muss verwendet werden, die optionalen Parameter enumIndexGE und enumIndexUS dürfen nicht ausgelassen werden, da sonst ausdrücklich 0 übertragen wird.

    Die obigen Ausführungen gelten für NET 2002. Verschärfend kommt für NET 2005 hinzu, dass optionale Parameter immer mit einem Wert beim Methodenaufruf angegeben werden müssen. Geschieht dies nicht, erhält man die Fehlermeldung "Fehler bei der Überladungsauflösung, da keine zugreifbare <Methodenname> diese Anzahl von Argumenten akzeptiert." Optionale Parameter sind immer noch Sprachbestandteil von NET 2005, sie können jedoch im Kontext von ActiveX Methodenaufrufen durch NET 2005 Code nicht genutzt werden. 
  2. Wenn ein ActiveX Mitglied ein 'ParamArray' von 'Variant' Werten erwartet, wird diese Deklaration in ein Array von Werten des 'Object' Typs uminterpretiert. Diese Parameter müssen dann als ein Array übergeben werden und nicht als eine Serie von 'Object' Werten. Deshalb muss im ersten Schritt ein Array von 'Object' Variablen definiert werden, welches dann als Ganzes dem Miglied des ActiveX übergeben wird anstelle einer Liste von einzelnen  'Object' Werten. Das folgende Beispiel soll dies demonstrieren:

    Public Function afMXGenerate(lRows As Long, lColumns As Long, ParamArray fValues() As Variant) As Variant

    Für diese Funktion kann dann der folgende Aufruf verwendet werden:


    Dim vArray() As Object = {-888.888, 0, 1, -999.999, 0, 1, 1, -999.999, 0, 0, 4, -1, -999.999, 0, -1, 2, -1, 1, -999.999, 0, 0, 6, -9, -23, 8, -999.999, 0, 0, 0, 0, 0, 0, 1, 1, -999.999}
    Dim vArrayResult As Array
    vArrayResult = Math.afMxGenerate(7, 7, vArray)

  3. Aus dem obigen Beispiel kann auch entnommen werden, wie der in NET nicht mehr vorhandene Datentyp 'Variant' ersetzt wird. Jeder 'Variant' Wert wird beim Aufruf eines Mitglieds wie ein 'Object' Typ behandelt. Einerseits ist damit die Deklaration entsprechender Variablen in NET 'As Object' möglich, andererseits ist die Verwendung passender spezieller NET Typen eine kompatible Lösung. Im obigen Beispiel ist dies durch die Deklaration 'As Array' gegeben. Alle Typumwandlungen sollten und müssen in der Regel vollständig und ausdrücklich erfolgen.
  4. Die ActiveX Attribute können in einigen Fällen im NET Eigenschaftenfenster nicht verfügbar sein. Stattdessen müssen sie dann innerhalb des Codes zugewiesen werden. Diese Veränderung tritt auf, wenn die 'Property Let' bzw. 'Property Get' Prozedur nicht ausschließlich mit einem 'ByVal' Parameter im ActiveX deklariert wurde, oder 'ByVal' Attribute des ActiveX mit dem Typ 'Enum' deklariert wurden. In diesem Fall sind die Let bzw. Set und die Get Prozeduren im Codezugriff voneinander getrennt, siehe den nächsten Punkt.
  5. Bei einigen Attributen von ActiveX Elementen sind die Let bzw. Set und die Get Prozeduren von einander getrennt. Es gibt in NET in solchen Fällen je eine Methode, dessen Namen mit 'set_' und eine Methode, dessen Namen mit 'get_' beginnt. In VS 6 wird das Attribut stattdessen ohne Parameter verwendet in Form des Auslesens und der Zuweisung in Gleichungen,z.B.

    'Demo.lYear=lYear' und 'lYear=Demo.lYear' in VB 6,
    'Demo.set_lYear(lYear)' und 'lYear=Demo.get_lYear' in NET.
  6. Ähnlich wie bei 'ParamArray' werden auch bei Ereignissen, welche durch ein ActiveX an die verwendende Applikation gesendet werden, die Parameter zu einem Parameter zusammengefasst. Dieser Parameter enthält als Strukturobjekt alle Parameter des ActiveX Ereignisses als Attribute. Zum Beispiel:

    Public Event Message(ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long, ByVal hwnd As Long)

    Die obige Deklaration definiert den Sender im ActiveX. Dies führt zu folgender Senke in der verwendenden Applikation:

    Private Sub Subclassing_Message(ByVal sender As Object, ByVal e As AxSensalgo_Subclassing.__Subclassing_MessageEvent) Handles Subclassing.Message

      [ Der e Parameter umfasst alle Parameter des Subclassing Message Events, diese sind

        e.msg
        e.hwnd
        e.lp
        e.wp              ]

    End Sub 

  7. Die Hilfedatei ist nicht durch Drücken von <F1> verfügbar. Stattdessen starten Sie die Hilfedatei über den Windows Explorer oder das Windows Start Menü. Die *.chm Hilfedateien von Sensalgo ActiveX Komponenten befinden sich im Windows Systemverzeichnis.
  8. Sollten Konstanten, etwa von bisherigen 'Enum' Attributen (siehe Punkt 4.), benötigt werden, welche das ActiveX als öffentliche Mitglieder bereitstellt, so können diese am einfachsten über den Objektkatalog gefunden werden. Sie werden dann über die Deklaration zusätzlicher Variablen verwendet. Dies kann im Code z.B. folgendermaßen aussehen:

Diese Regeln wurden in den ActiveX Beispiel Projekten berücksichtigt.