FIX: JActiveX fails for COM Property Declared as IUnknown
ID: Q233359
|
The information in this article applies to:
-
Microsoft Visual J++, version 6.0
-
Microsoft Win32 Virtual Machine
-
Microsoft SDK for Java, versions 1.51, 2.0, 2.01, 2.02, 3.0, 3.1, 3.2
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:
- Declare the property as Object in Visual Basic. It will then be exposed as
IDispatch in the type library and Object in Java.
- 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:
; IUnknown!
[{00000000-0000-0000-C000-000000000046}]
Use Class=com.ms.com.IUnknown
- If the configuration file were called mappings.jnf, JActiveX would be invoked like this:
jactivex /d . /javatlb /t mappings.jnf MyControl.DLL
- 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
- Create an ActiveX DLL (say Project1.dll) using Visual Basic 6.0, and include the following code:
Public Property Get NewEnum() As IUnknown
Set NewEnum = Nothing
End Property
- Create a Windows Application using Visual J++ 6.0.
- Select Project.Add COM Wrapper.
- In the COM Wrappers dialog box, select the Project1.dll created in step 1.
- This will create two wrapper class files, project1 and stdole2.
- Build the application .
- 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