FIX: "Invalid Procedure Call" Error with Preserve Keyword

ID: Q193092


The information in this article applies to:
  • Microsoft Data Access SDK, version 2.0
  • Microsoft Visual Basic Learning, Professional, and Enterprise Editions for Windows, version 6.0


SYMPTOMS

The following error occurs if a variant set equal to an Array() function is redimensioned using the Preserve keyword:

Run-time error '5' "Invalid Procedure Call or Argument"
NOTE: This behavior occurs only under the following two conditions:
  • If Microsoft Data Access Components (MDAC) 2.0 or Visual Studio 6.0 is installed on the computer.

    -and-


  • If the array has not been initialized.



CAUSE

This error occurs with the newer version of the OLE automation core file, (version 2.304261). The Oleaut32.dll file is installed in your system directory when you install MDAC 2.0 or Visual Studio 6.0 products.


RESOLUTION

Here are two ways to resolve this problem:

Method One

  • Revert to the older version of Oleaut32.dll (version 2.20.4118). This can be done by re-installing the Windows NT Service Pack 3, which overwrites the newer version of the .dll file.


  • -or -

  • Re-install Visual Basic 5.0, either Service Pack 2 or Service pack 3, which also overwrites the newer version of the .dll file.


NOTE: The preceding workaround can only be used with a Visual Basic 5.0 application running with MDAC 2.0 installed on the computer. The newer version of the automation file, Oleaut32.dll (version 2.304261), must be present on a computer that runs a Visual Basic 6.0 application.

Method Two

You can choose to keep the newer version of the Oleaut32.dll file. However, you cannot preserve your array unless it was initialized prior to the call. For example:

      Sub Command1_Click ()
          Dim VarArr as Variant
          Dim lngSubScript As Long

          VarArr = Array()

          ' Get largest available subscript for the array.
          lngSubScript = UBound(A)

          If (lngSubScript <> -1) Then
             ' Re-allocate 5 elements of the array and preserve its values.
             ReDim Preserve VarArr(5)
          Else
             ' Re-allocate 5 elements of the array.
             ReDim VarArr(5)
          End If
      End Sub 
NOTE: The preceding workaround applies to both Visual Basic 5.0 applications and Visual Basic 6.0 applications running with the newer version of the OLE automation file.


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.

This bug has been corrected in Microsoft Visual Basic Learning, Professional, and Enterprise Editions for Windows, version 6.0, Service Pack 1.


MORE INFORMATION

Steps to Reproduce Behavior

  1. Start a new project in Visual Basic and choose Standard EXE. Form1 is created by default.


  2. Add a CommandButton, named Command1, to Form1.


  3. Paste the following code in the General Declaration section of Form1:


  4. 
          Option Explicit
          Dim VarArr As Variant
    
          Private Sub Command1_Click()
    
             ' Get the variant to hold an array.
             VarArr = Array()
    
             ' Re-allocate 5 elements of the array and preserve its values.
             ReDim Preserve VarArr(5)         '<--- Error 5 occurs here
    
          End Sub 
  5. Run the application or press the F5 key. Click the Command1 button. The "Error 5" occurs.



REFERENCES

For additional information, please see the following articles in the Microsoft Knowledge Base:

Q187282 INFO: List of Visual Basic Run-Time Files Installed by Product
Q190130 INFO: Description of VB 6.0 Run Time and OLE Automation Files

Additional query words:

Keywords : kbADO200 kbADO210fix kbVBp600 kbVS600 kbGrpVB kbGrpMDAC kbDSupport
Version : WINDOWS:2.0,6.0
Platform : WINDOWS
Issue type : kbbug


Last Reviewed: November 11, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.