Article ID: 117428 - Last Review: September 30, 2005 - Revision: 3.0

You receive a C2564 error or a C2197 error when you port code that uses GetProcAddress from C to C++

This article was previously published under Q117428
Expand all | Collapse all

SUMMARY

When porting code that uses GetProcAddress() from C to C++, the C++ compiler for MS-DOS can return the following error message:
error C2564: formal/actual parameters mismatch in call through pointer to function
The error message that is returned with the 32-bit compiler is:
error C2197: 'int (__stdcall *)(void )' : too many actual parameters

MORE INFORMATION

In a traditional C application, use GetProcAddress() to obtain the address of a function to be called. Declare a variable of type FARPROC, initialize the pointer with the value returned from GetProcAddress(), and then call the function through a pointer as shown:
void func1(void)
{
   HINSTANCE       hLib;
   FARPROC         lpfnDLLProc;
   UINT            param1 = 1;
   int             param2;

   hLib = LoadLibrary ("dll1.dll");
   if (hLib)
   {
      lpfnDLLProc = GetProcAddress (hLib, "DLLProc");
      (*lpfnDLLProc) (param1, (LPINT)&param2);
      FreeLibrary (hLib);
   }
}
				
When not compiling with STRICT, FARPROC is defined in the WINDOWS.H file as follows:
typedef int (CALLBACK* FARPROC)();
				
When the sample code above is converted to C++, a type-mismatch error occurs because C and C++ have a fundamental difference in the way they interpret empty parentheses in function declarations. In C, a function declared as follows:
int (*funcptr)();
				
declares a function that accepts an unknown number of arguments. In C++, the same declaration represents a function that accepts no arguments. In other words, in C++, the statement is equivalent to:
int (*funcptr)(void);
				
Because of this difference, when a pointer of type FARPROC is used to call a function with parameters in C, no error occurs. In C++, when the function being passed to GetProcAddress() has parameters, the formal/actual-parameter-mismatch error occurs because the function of type FARPROC is defined as a function that has void parameters rather than as a function that accepts parameters.

To eliminate the error, define the function pointer as a pointer to a function with the correct number of parameters and then typecast the return value from GetProcAddress() to the appropriate type:
typedef void (CALLBACK *ULPRET)(UINT,LPINT);

void func1(void)
{
   HINSTANCE       hLib;
   ULPRET          lpfnDLLProc;
   UINT            param1 = 1;
   int             param2;

   hLib = LoadLibrary ("dll1.dll");
   if (hLib)
   {
      lpfnDLLProc = (ULPRET) GetProcAddress (hLib,"DLLProc");
      (*lpfnDLLProc) (param1, (LPINT)&param2);
      FreeLibrary (hLib);
   }
}
				

APPLIES TO
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 6.0 Service Pack 5
  • Microsoft Visual C++ 5.0 Standard Edition
Keywords: 
kbtshoot kbinfo kblangcpp KB117428
Retired KB ArticleRetired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.
 

Article Translations