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



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
  • Microsoft Visual C++, 32-bit Professional Edition 6.0
  • Microsoft Visual C++, 32-bit Learning Edition 6.0

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.

REFERENCES

For more information about the ClassView display, click the following article numbers to view the articles in the Microsoft Knowledge Base:

201097 ClassView does not display COM interface nodes

138953 BUG: Static identifiers do not show up in ClassView

194840 FIX: The "*" key does not expand all ClassView branches properly

167905 How to exclude include file class definitions from ClassView

140439 FIX: Namespace scoped casses don't show up in ClassView

205402 FIX: ClassView doesn't show derived classes in embedded namespace


Modification Type:MajorLast Reviewed:9/1/2005
Keywords:kbBug kbClassView kbide kbwizard KB247713 kbAudDeveloper