FIX: JActiveX fails for COM Property Declared as IUnknown

ID: Q233359


The information in this article applies to:


SYMPTOMS

The following error is generated when trying to build a Java project that imports a COM component whose property is declared as type IUnknown:

Undefined name 'stdole2.IUnknown' (J0049)


CAUSE

The problem is that JActiveX generates Java code that treats IUnknown as a user-defined type, rather than as com.ms.com.IUnknown.


RESOLUTION

The problem has been fixed for the JActiveX.exe version 3549 that ships with the SDK For Java version 3.2 available at:

http://www.microsoft.com/java

However, if you are still using a JActiveX prior to SDK3.2, you could still work around the problem using either of the following two ways:

  1. Declare the property as Object in Visual Basic. It will then be exposed as IDispatch in the type library and Object in Java.


  2. Use a configuration file that will tell JActiveX to use com.ms.com.IUnknown for all types with a GUID of IID_IUnknown. The config file will look like the following:


  3. 
      ; IUnknown!
      [{00000000-0000-0000-C000-000000000046}]
      Use Class=com.ms.com.IUnknown 
  4. If the configuration file were called mappings.jnf, JActiveX would be invoked like this:


  5. 
    jactivex /d .  /javatlb /t mappings.jnf MyControl.DLL 
  6. Note that the stdole2 package will not be created because there are no referenced types.



STATUS

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


MORE INFORMATION

Here is a sample case that reproduces the problem. In the following example, the COM component is an ActiveX DLL created using Visual Basic 6.0. This DLL implements a property declared to be of type IUnknown. When you run JActiveX or do an AddCOMWrapper from within Visual J++ 6.0, it treats this property IUnknown as a user-defined type rather than as com.ms.com.IUnknown. The problem is that Visual Basic is marking the IUnknown property type as a user-defined type (VT_USERDEFINED) instead of the usual IUnknown (VT_UNKNOWN).

Steps to Reproduce Behavior

  1. Create an ActiveX DLL (say Project1.dll) using Visual Basic 6.0, and include the following code:


  2. 
    Public Property Get NewEnum() As IUnknown
        Set NewEnum = Nothing
    End Property
     
  3. Create a Windows Application using Visual J++ 6.0.


  4. Select Project.Add COM Wrapper.


  5. In the COM Wrappers dialog box, select the Project1.dll created in step 1.


  6. This will create two wrapper class files, project1 and stdole2.


  7. Build the application .


  8. You see the above mentioned error.


Additional query words:


Keywords          : kbCompiler kbCOMt kbJava kbSDKJava kbVJ kbGrpJava 
Version           : WINDOWS:1.51,2.0,2.01,2.02,3.0,3.1,3.2,6.0
Platform          : WINDOWS 
Issue type        : kbbug 

Last Reviewed: June 7, 1999