Microsoft KB Archive/241862

= The MFC wizard does not generate code for the methods that take a BYTE or BYTE* as a parameter =

Article ID: 241862

Article Last Modified on 9/1/2005

-

APPLIES TO

 The ClassWizard, when used with:  Microsoft Visual C++ 4.0 Standard Edition

 Microsoft Visual C++ 4.1 Subscription

 Microsoft Visual C++ 4.2 Enterprise Edition

 Microsoft Visual C++ 4.2 Professional Edition</li></ul>

 Microsoft Visual C++ 5.0 Enterprise Edition</li></ul>

 Microsoft Visual C++ 5.0 Professional Edition</li></ul>

 Microsoft Visual C++ 6.0 Enterprise Edition</li></ul>

 Microsoft Visual C++ 6.0 Professional Edition</li></ul>

 Microsoft Visual C++ 6.0 Standard Edition</li></ul> </li> The Component Gallery, when used with:  Microsoft Visual C++ 4.0 Standard Edition</li></ul>

 Microsoft Visual C++ 4.1 Subscription</li></ul>

 <li>Microsoft Visual C++ 4.2 Enterprise Edition</li></ul>

<ul> <li>Microsoft Visual C++ 4.2 Professional Edition</li></ul>

<ul> <li>Microsoft Visual C++ 5.0 Enterprise Edition</li></ul>

<ul> <li>Microsoft Visual C++ 5.0 Professional Edition</li></ul>

<ul> <li>Microsoft Visual C++ 6.0 Enterprise Edition</li></ul>

<ul> <li>Microsoft Visual C++ 6.0 Professional Edition</li></ul>

<ul> <li>Microsoft Visual C++ 6.0 Standard Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q241862

<div class="symptoms_section">

SYMPTOMS
When generating wrapper classes for a COM server that has methods that take a BYTE or BYTE* as a parameter, the MFC wizards do not generate code for these methods. The wizard does place a comment in the wrapper class header file that states that the method was not emitted due to an invalid return type or parameter type. Following is the exact text: // Operations public: // method 'PassByte' not emitted because of invalid return type or parameter type BYTE and BYTE* are both OLE Automation compatible data types, thus this message can be somewhat confusing.

<div class="cause_section">

CAUSE
This is due to bugs in ClassWizard and Component Gallery not recognizing BYTE and BYTE* as valid OLE Automation data types.

<div class="resolution_section">

RESOLUTION
You can add the methods that were omitted manually. For example, given a method PassByte that takes a single BYTE parameter and another method PassBytePointer that takes a single BYTE* parameter, you could add the following code to the wrapper class in the wrapper class header file as follows: // Operations public: // method 'PassByte' not emitted because of invalid return type or parameter type void PassByte(BYTE byteVal);

// method 'PassBytePointer' not emitted because of invalid return type or parameter type void PassBytePointer(BYTE *pbyteVal); Next, you need to add the code to the wrapper class source file. Given the example above, it should look like the following:

//Do NOT use VTS_UI1. It has a value of "0x0F" which is incorrect. //The correct value for VT_UI1 is 17 or 0x11
 * 1) define MY_VTS_UI1 "\x11"

//Do NOT use VTS_PUI1. It has a value of "0x4F" which is incorrect. //The correct value for VT_PUI1 is 81 or 0x51
 * 1) define MY_VTS_PUI1 "\x51"

void C_UserControl1::PassByte(BYTE byteVal) { static BYTE parms[] = MY_VTS_UI1; //please note that this is not VTS_UI1

DISPID dispid = 0x60030000; InvokeHelper(dispid, DISPATCH_METHOD, VT_EMPTY, NULL, parms, byteVal); }

void C_UserControl1::PassBytePointer(BYTE *pbyteVal) { static BYTE parms[] = MY_VTS_PUI1; //please note that this is not VTS_PUI1

DISPID dispid = 0x60030001; //notice that this is different! InvokeHelper(dispid, DISPATCH_METHOD, VT_EMPTY, NULL, parms, pbyteVal); } It is important to note that you need to get the DISPIDs for the omitted methods using a type library viewing tool. OLE/COM Object Viewer is one such tool. You can access this tool from the Tools menu in Visual C++. In OLE/COM Object Viewer, select the File menu and the View Typelib menu item. Next, find the .tlb or .ocx file for the COM server and click Open. This opens a new window with a tree control on the left side. Select the topmost item in the tree control and you will see all of the methods on the right with their corresponding DISPID's.

A second important point is that VTS_UI1 and VTS_PUI1 are not used above. For more informationon this bug, click the following article number to view the article in the Microsoft Knowledge Base:

242588 VTS_U1 and VTS_PUI1 are defined incorrectly in the AfxDisp.h header file

<div class="status_section">

STATUS
Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.

<div class="moreinformation_section">

Steps to reproduce the behavior
<ol> <li>Create a new Visual Basic ActiveX control.</li> <li> Add one method that takes a BYTE parameter. For example:

Public Sub PassByte(ByVal b as Byte) End Sub </li> <li>Build the control.</li> <li>Create a new MFC Dialog based application.</li> <li>Add the Visual Basic control that was generated in step 3 using Component Gallery. Do this by going to the Project menu, select Add Components and Controls, and then selecting Registered ActiveX Controls.</li> <li>After you select the Visual Basic control and click OK, Component Gallery presents the Confirm Classes dialog. Click OK on the Confirm Classes dialog box to generate the wrapper code.</li></ol>

To see the missing method, open up the generated wrapper class header file. You should see the text that states the method PassByte was not emitted because of invalid return type or parameter type.

<div class="references_section">