Microsoft KB Archive/184898

= PRB: Can't Use Late Binding When Server Method Uses UDT =

Article ID: 184898

Article Last Modified on 5/13/2003

-

APPLIES TO


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

-



This article was previously published under Q184898



SYMPTOMS
When you have an ActiveX server that you created with Visual Basic version 6.0, you receive an error when accessing a method or property that accepts and/or returns a user-defined type (UDT).

You receive one of the following errors when accessing a method that returns a UDT or accepts a UDT as an argument:

Run-time Error '429':

ActiveX component can't create object

-or-

Compile error:

Only user-defined types defined in public object modules can be coerced

to or from a variant or passed to late-bound functions.



CAUSE
A method that returns or accepts a user-defined type (UDT) cannot be called when using late binding.

Dim oMyObject as Object Dim MyUDT as Object Set oMyObject = CreateObject("MyProject.MyClass") MyUDT = oMyObject.MyMethod   '<-- This line generates a run-time error '   if MyMethod returns a UDT.



RESOLUTION
To correct this problem, you can use either of the following two solutions:


 * Use early binding instead of late binding.
 * Modify the server so that the method returns an object of another class rather than a UDT.



STATUS
This behavior is by design.



Steps to Reproduce Behavior
 Create a new ActiveX EXE project. On the Project menu, click Properties. Change the Project Name to "TestServer" and click OK.  Add the following code to Class1: Public Type MyUDT x as Long y as Long End Type

Public Function MyMethod as MyUDT MyMethod.x = 1 MyMethod.y = 2 End Function

 On the File menu, click Make TestServer.EXE. Close this project and start a new Standard EXE project.</li> Add two command buttons to Form1.</li>  Add the following code to Form1: Private Type MyUDT x as Long y as Long End Type

Private Sub Command1_Click Dim obj1 as Object Dim obj2 as Object Set obj1 = CreateObject("TestServer.Class1") obj2 = obj1.MyMethod          '<== Generates run-time error #429. End Sub

Private Sub Command2_Click Dim obj1 as Object Dim mu as MyUDT Set obj1 = CreateObject("TestServer.Class1") mu = obj1.MyMethod            '<== Generates compile error. End Sub

</li> Run the project by pressing F5 and click Command1. You receive the run-time error #429. Click End to end the program.</li> Run the project once more and click Command2. You receive the compile error described at the beginning of this article.</li></ol>

<div class="references_section">