Article ID: 198017 - Last Review: June 1, 2005 - Revision: 4.0

BUG: You receive an "Unable to create the function" error message when you try to add a method as the variable type in the ATL Interface Wizard with Visual C++

This article was previously published under Q198017

On This Page

Expand all | Collapse all

SYMPTOMS

In the ATL Interface Wizard with Visual C++ 6.0, you receive the following error message:
"Unable to create the function because the header or the
implementation file could not be found."
This problem occurs when you add a method that has either SAFEARRAY(oleautomationtype)" or "SAFEARRAY(oleautomationtype)*" as the variable type. oleautomationtype is an OLE automation-compatible data type.

CAUSE

This is due to a bug in the ATL Interface Wizard.

WORKAROUND

Add these methods by manually editing the .idl, .h, and .cpp files.

The following shows the changes when adding two methods (called Test and Test2 that have SAFEARRAY(BSTR)* and SAFEARRAY(BSTR), respectively) to an interface called IATLObj. IATLObj is implemented by an ATL class called CATLObj.

  1. Add this code for the new methods in the .IDL file:
          interface IATLObj : IDispatch
          {
             [id(1)] HRESULT Test([out] SAFEARRAY(BSTR) *ppArrayBstr);
             [id(2)] HRESULT Test2([in] SAFEARRAY(BSTR) pArrayBstr);
          };
    						
  2. Add this code to the .H file for the ATL COM object:
          STDMETHOD(Test)(SAFEARRAY **ppArrayBstr);
          STDMETHOD(Test2)(SAFEARRAY *pArrayBstr);
    						
  3. And add this code to the .CPP file for the ATL COM object:
          STDMETHODIMP CATLObj::Test(SAFEARRAY **ppArrayBstr)
          {
             return S_OK;
          }
    
          STDMETHODIMP CATLObj::Test2(SAFEARRAY *pArrayBstr)
          {
             return S_OK;
          }

STATUS

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

MORE INFORMATION

Steps to reproduce the behavior

  1. Create a new ATL/COM Application Wizard Project.
  2. Insert a new ATL COM Object with the default settings.
  3. Add a new method with the ATL COM Object Wizard by right-clicking the interface to add the method and by selecting "Add Method."
  4. Give the method a name.
  5. Add one parameter with SAFEARRAY(BSTR)* as the type For example: [out] SAFEARRAY(BSTR) *pArrayBSTR. Note that when you click OK on the "Add Method to Interface" dialog box, a message box appears with the error mentioned above.

REFERENCES

For more information, click the following article number to view the article in the Microsoft Knowledge Base:
196837  (http://support.microsoft.com/kb/196837/ ) BUG: Compile errors result for certain ATL method parameters

APPLIES TO
  • Microsoft ActiveX Template Library 3.0, when used with:
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Keywords: 
kberrmsg kbtshoot kbbug kbautomation kbwizard kbcollectionclass kbpending KB198017
 

Article Translations