Microsoft KB Archive/190210

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

Article ID: 190210

Article Last Modified on 3/3/2005

-

APPLIES TO


 * Microsoft Visual Basic 5.0 Learning Edition
 * Microsoft Visual Basic 6.0 Learning Edition
 * Microsoft Visual Basic 5.0 Professional Edition
 * Microsoft Visual Basic 6.0 Professional Edition
 * Microsoft Visual Basic 5.0 Enterprise Edition
 * Microsoft Visual Basic 6.0 Enterprise Edition

-



This article was previously published under Q190210



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.



Steps to Reproduce Behavior
 Create a new ActiveX Control project in Visual Basic. UserControl1 is created by default. From the Project menu, click Components and select Microsoft Windows Common Controls.  Add the following code to the UserControl: 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  Change the project name to PassTree. From the File menu, click Make PassTree.ocx.</li> Start a new Standard EXE project. Form1 is created by default.</li> From the Project menu, click Components and select Microsoft Windows Common Controls.</li> Select PassTree, and click OK. PassTree is added to the Toolbox.</li> Add an instance of the TreeView control and the PassTree control to Form1.</li>  Add a CommandButton to Form1. Insert the following code in the Command1_Click event: Set Me.UserControl11.Tree = Treeview1 </li> Run the project and click the CommandButton. Note that you should not see an error message.</li> Copy the PassTree.ocx to another computer that has Visual Basic installed.</li> Register the OCX on the second computer. The command line is similar to the following:

Regsvr32.exe \PassTree.ocx

</li> Repeat steps 6 through 11 on the second computer.</li> You should see:

Error 13: Type Mismatch error.

</li></ol>

<div class="references_section">