PRB: Passing ActiveX Control to Component Gives "Type Mismatch" Error Message

ID: Q190210


The information in this article applies to:
  • Microsoft Visual Basic Learning, Professional, and Enterprise Editions for Windows, versions 5.0, 6.0


SYMPTOMS

When you pass an ActiveX control to another ActiveX component in Visual Basic, a Type Mismatch error might occur. The problem does not occur on your development computer, but it does occur after the control is installed on another computer. This problem occurs even if you used the Setup Wizard to install the .ocx and the .ocx has been properly registered.


CAUSE

ActiveX controls are private objects that belong to the form class and they should not be passed out to external components. By design, Visual Basic wraps each .ocx in an extended control, which provides the basic services offered by the container to the programmer. When you pass a control object to another component, you are in fact passing the Extender object. If your component expects an interface pointer that is early bound as the base control, a type mismatch error occurs because the interface IDs of the base control and the Extender object do not match.

For example, if you pass a TreeView control as a method to another control and attempt to set it to a variable declared as TreeView, an error occurs when the control is executed on a non-development computer.


RESOLUTION

If possible, do not pass ActiveX controls to other components in your project. If the component needs a specific control to function correctly, include that control as part of the component. Microsoft does not recommend that you pass private objects to components outside of the current project.

If you must pass ActiveX controls to your component, do not attempt to use early binding, use late binding instead. If you pass the control as a variable of type Object, any late bound calls to the base control will succeed since the extender is designed to forward unrecognized property or method calls to the internal base control.


STATUS

This behavior is by design.


MORE INFORMATION

Steps to Reproduce Behavior

  1. Create a new ActiveX Control project in Visual Basic. UserControl1 is created by default.


  2. From the Project menu, click Components and select Microsoft Windows Common Controls.


  3. Add the following code to the UserControl:


  4. 
          Dim m_tree As TreeView
          Public Property Set tree(obj As Object)
            ' You must use obj as a late bound object.
            ' The next line causes the error.
             Set m_tree = obj
          End Property 
  5. Change the project name to PassTree.


  6. From the File menu, click Make PassTree.ocx.


  7. Start a new Standard EXE project. Form1 is created by default.


  8. From the Project menu, click Components and select Microsoft Windows Common Controls.


  9. Select PassTree, and click OK. PassTree is added to the Toolbox.


  10. Add an instance of the TreeView control and the PassTree control to Form1.


  11. Add a CommandButton to Form1. Insert the following code in the Command1_Click event:


  12. 
          Set Me.UserControl11.Tree = Treeview1 
  13. Run the project and click the CommandButton. Note that you should not see an error message.


  14. Copy the PassTree.ocx to another computer that has Visual Basic installed.


  15. Register the OCX on the second computer. The command line is similar to the following:


  16. Regsvr32.exe <path>\PassTree.ocx
  17. Repeat steps 6 through 11 on the second computer.


  18. You should see:


  19. Error 13: Type Mismatch error.


REFERENCES

Visual Basic Help, version 6.0; topic: Data Types Allowed in Properties and Methods

Visual Basic 5.0 Books Online: Data Types Allowed in Properties and Methods

Additional query words:

Keywords : kbnokeyword kbVBp500 kbVBp600 kbGrpVB
Version : WINDOWS:5.0,6.0
Platform : WINDOWS
Issue type : kbprb


Last Reviewed: January 5, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.