none
August 13, 2019—KB4512508 (OS Build 18362.295) - Invalid Procedure Call Error mit VB6 RRS feed

  • Frage

  • Hallo miteinander,

    KB4512508 sorgt auch bei unseren Kunden für unmut, da damit unsere Anwendung nicht mehr lauffähig ist. In folgendem Artikel ist der Sachverhalt bereits beschrieben:

    https://support.microsoft.com/ja-jp/help/4512508/windows-10-update-kb4512508

    Unter "Known issues in this update" findet  sich folgende Beschreibung:

    After installing this update, applications that were made using Visual Basic 6 (VB6), macros using Visual Basic for Applications (VBA), and scripts or apps using Visual Basic Scripting Edition (VBScript) may stop responding and you may receive an "invalid procedure call error."

    Als Workaround ist folgende Stellungnahme  zu finden:

    Microsoft is presently investigating this issue and will provide an update when available.

    Wir benötigen hier dringend eine Lösung, da das Update derzeit nicht eingespielt werden kann. Viele Kunden haben das Update zurückgestellt, allerdings ist ein Rollback nicht von jedem Nutzer ohne weiteres durchzuführen. Mein Ziel ist es, dass das Thema mit hoher Priorität untersucht wird und dass wir aktiv über eine Lösung informiert werden. Wie können wir dies erreichen?

    Donnerstag, 15. August 2019 13:32

Antworten

  • Die Lösung funktioniert als solche. Wenn an sehr vielen Stellen mit ParamArrays als Übergabeparameter gearbeitet wird, kann es einen sehr hohen Aufwand bedeuten, einige hundert von Stellen anzupassen und individuell zu testen.

    Da Microsoft mittlerweile funktionierende Patches für alle Betriebssysteme freigegeben hat, betrachte ich das Thema als erledigt.

    Danke an alle, die sich am Thread beteiligt haben.


    COM_HC

    • Als Antwort markiert COM_HC Mittwoch, 11. September 2019 11:08
    Mittwoch, 11. September 2019 11:08

Alle Antworten

  • Da Microsoft das Problem ja nicht genau beschreibt, z.B. bei welchem Aufruf, kann man auch keine Umgehung schaffen und muss das Update bis zur Behebung halt zurückstellen.
    Es sei denn, du kannst den ominösen Fehler genau einkreisen, bei welchem Aufruf denn der Absturz passiert.
    Donnerstag, 15. August 2019 15:54
  • Wir haben das gleich Problem in einer relativ großen VB6 Anwendung die immer noch gepflegt wird. Bei uns hat sich heraus gestellt, dass der Fehler nur auftritt wenn ein leeres Array an eine Funktion übergeben wird, die einen Variant als Argument erwartet. Vielleicht hilft das ja jemandem.
    Freitag, 16. August 2019 08:06
  • Wir hatten nun auf einem Windows Server 2012 R2 ebenso nach dem Windows Update eine nicht funktionierende VB6-Anwendung. Allerdings stürzt diese nicht ab, sondern macht ohne Fehlermeldung einfach ganz normal weiter.
    Es werden halt nur keine Daten mehr angezeigt.
    Ein Fehler lässt sich da gar nicht erst einkreisen.
    Nach Rückstellen des Updates funktioniert wieder alles.

    Freitag, 16. August 2019 12:55
  • Zu obiger Beschreibung habe ich eine Eränzung:

    Um mit variablen Arrays umzugehen hat man in VB folgende Möglichkeit:

    dim MyArray() as variant
    redim MyArray(nn)

    Der Dim als leeres Array ist Voraussetzung um einen Redim durchzuführen.
    Nun kann man allerdings diese Variable vor der Zuweisung per Redim nicht abfragen!
    Also auch "Ubound(MyArray)" schlägt fehl, da die Variable noch nicht erstellt ist.
    Deshalb hat man sich gerne damit beholfen, der Variablen z.B. in Class_Initialize ein leeres Array zuzuweisen.

    MyArray = Array()

    Somit ergibt UBound(MyArray) dann -1 als leeres Array,
    Und genau diese Zuweisung führt nun zu dem "Invalid Procedure Call".

    "Erase MyArray" ist da keine Hilfe, da diese den Speicher wieder freigibt und Ubound() wieder fehlschlägt.
    Eine Umgehung ist die Bereitstellung einer Funktion aus einer anderen Programmiersprache via COM-Objekt, die ein leeres Variant-Array zur Verfügung stellt.
    Split(Empty) liefert leider nur ein leeres StringArray zurück, hilft da also nicht.

    Die obige Fehlersituation beim Funktionsaufruf ergibt sich durch die implizite Zuweisung.

    Unsere Anwendung funktioniert nun wieder.

    Montag, 19. August 2019 10:22
  • Hier die Lösung für VB6/VBA. Für VBScript gibt es eigentlich keine Lösung außer auf die Zuweisung mittles leerem Array zu verzichten. Hier hilft eine Empty-Zuweisung, da ja jeder Variable sowieso typlos ist.
    Die Lösung habe ich in folgendem Thread gefunden:
    https://stackoverflow.com/questions/43005454/vba-create-empty-array

    Private Declare Function EmptyDateArray Lib "oleaut32" Alias "SafeArrayCreateVector" (Optional ByVal vt As VbVarType = vbDate, Optional ByVal lLow As Long = 0, Optional ByVal lCount As Long = 0) As Date()
    

    Hier kann man sich verschiedene Funktionen definieren um unterschiedliche leere Arrays zuzuweisen.
    Z.B.:

    Private Declare Function EmptyVariantArray Lib "oleaut32" Alias "SafeArrayCreateVector" (Optional ByVal vt As VbVarType = vbVariant, Optional ByVal lLow As Long = 0, Optional ByVal lCount As Long = 0) As Variant()
    Dim MyVar() as Variant
    MyVar = EmptyVariantArray

    Dies führt dann nicht mehr zum Fehler und ist mittels VB6/VBA native lösbar.



    Dienstag, 20. August 2019 13:19
  • Die Lösung funktioniert als solche. Wenn an sehr vielen Stellen mit ParamArrays als Übergabeparameter gearbeitet wird, kann es einen sehr hohen Aufwand bedeuten, einige hundert von Stellen anzupassen und individuell zu testen.

    Da Microsoft mittlerweile funktionierende Patches für alle Betriebssysteme freigegeben hat, betrachte ich das Thema als erledigt.

    Danke an alle, die sich am Thread beteiligt haben.


    COM_HC

    • Als Antwort markiert COM_HC Mittwoch, 11. September 2019 11:08
    Mittwoch, 11. September 2019 11:08