You receive a C2564 error or a C2197 error when you port code that uses GetProcAddress from C to C++ (117428)
The information in this article applies to:
- Microsoft Visual C++, 32-bit Editions 1.0
- Microsoft Visual C++, 32-bit Editions 2.0
- Microsoft Visual C++, 32-bit Editions 2.1
- Microsoft Visual C++, 32-bit Editions 4.0
- Microsoft Visual C++, 32-bit Editions 6.0
- Microsoft Visual C++, 32-bit Editions 5.0
This article was previously published under Q117428 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)¶m2);
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)¶m2);
FreeLibrary (hLib);
}
}
Modification Type: | Major | Last Reviewed: | 9/30/2005 |
---|
Keywords: | kbtshoot kbinfo kbLangCPP KB117428 |
---|
|