Microsoft KB Archive/247713

= BUG: ClassView does not show all methods for an interface in Visual C++ 6.0 =

Article ID: 247713

Article Last Modified on 9/1/2005

-

APPLIES TO


 * Microsoft Visual C++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 6.0 Standard Edition

-



This article was previously published under Q247713



SYMPTOMS
In ClassView, an interface node inside a class that implements the interface does not contain all of the interface methods. Instead, one or more of the methods appears as regular class member functions.



CAUSE
The misplaced method contains at least one parameter that is mismatched with the data type specified in the interface description. This may occur when using logically equivalent types, or when "struct" or "class" is specified as part of a parameter's data type.



RESOLUTION
If the method contains logically equivalent types, edit the interface's .idl file or the class's .h file so the declarations match exactly. For example, if the .idl file contains the method HRESULT MyMethod(BYTE * p); and the .h file declares the implementation method as HRESULT MyMethod(PBYTE p); modify the PBYTE in the .h file to read BYTE *.

If the .idl file explicitly specifies a class or structure in a parameter type declaration, modify the declaration to use a typedef equivalent. For example, instead of struct MyStruct {  int i; }; ... interface IMyIF {  HRESULT MyMethod(struct MyStruct * pMyStruct); } use the following: typedef struct MyStruct_tag {  int i; } MyStruct; ... interface IMyIF {  HRESULT MyMethod(MyStruct * pMyStruct); }



STATUS
Microsoft has confirmed that this is a bug in the Microsoft products that are listed in the "Applies to" section.



MORE INFORMATION
Even though two types are logically equivalent, ClassView sees them as different since the syntax is different. If the .idl file explicitly specifies a class or structure in a parameter type declaration, a bug in ClassView's parser strips the word "class" or "struct" from the declaration. Since in either of these cases the interface and implementation declarations no longer match according to ClassView, it displays the method outside of the interface.

Steps to reproduce the behavior

 * 1) Create a default ATL COM AppWizard project. In this example, it is named MyProj.
 * 2) In ClassView, right-click the MyProj classes node. Select New class.
 * 3) In the New Class dialog box, select ATL Class as the class type, and type CMyIF for the class name. Click OK.
 * 4) Right-click the interface in ClassView and select Add Method.
 * 5) In the Add Method to Interface dialog box, type MyMethod for Method name, and type struct MyStruct for Parameters. Click OK.
 * 6) In ClassView, click the + to expand the MyProj classes node, the CMyIF node, the IMyIF node inside it that has just been revealed, and the IMyIF node at the same level as CMyIF.

The method MyMethod appears as a member of CMyIF, rather than as a member of the implemented IMyIF. The "struct" has been stripped off. However, MyMethod displays properly in the IMyIF interface definition node.

