error after return from dll.

I have this code:
////////////////////////
#include "stdafx.h"
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)

{

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
DWORD dwParam1;
UINT  uParam2=0, uReturnVal=0;

hDLL = LoadLibrary("azza");
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"test2");
   if (!lpfnDllFunc1)
   {
      // handle the error
      FreeLibrary(hDLL);
      MessageBox(0,"error","error",0);
   }
   else
   {
      // call the function
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
   }
}
return 0;
}
//////////////////////////

which calls function test2 in azza.dll.
When I run the program, the function is executed, but after the execution of the function, I have the following error:


/////////////////
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Error!

Program: ... Files\Microsoft Visual Studio\MyProjects\user\Debug\user.exe
Module:
File: i386\chkesp.c
Line: 42

The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

(Press Retry to debug the application)
---------------------------
Afbreken   Opnieuw   Negeren  
---------------------------
/////////////////////

I'm new to c++. What does this error means, and how should I solve it ??
pliniusAsked:
Who is Participating?
 
jkrConnect With a Mentor Commented:
Well, that is the problem:

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);

and

extern "C" __declspec(dllexport)void test2();

simply do _not_ match - use either

typedef void (*LPFNDLLFUNC1)();

or

extern "C" __declspec(dllexport) UINT CALLBACK test2(DWORD,UINT);


0
 
jkrCommented:
>>The value of ESP was not properly saved across a function call

This means that either the parameter list or the calling convention for "test2()" don't match in both projects.
0
 
GloomyFriarCommented:
Show how the test2 function is declared in the dll.
0
Cloud Class® Course: Microsoft Office 2010

This course will introduce you to the interfaces and features of Microsoft Office 2010 Word, Excel, PowerPoint, Outlook, and Access. You will learn about the features that are shared between all products in the Office suite, as well as the new features that are product specific.

 
GloomyFriarConnect With a Mentor Commented:
Try to do so:

in dll:
extern "C"  UINT __declspec(dllexport) test2(DWORD,UINT);

in exe:
typedef UINT (__cdecl *LPFNDLLFUNC1)(DWORD,UINT);
0
 
pliniusAuthor Commented:
this is my dll.
/////////////////
// azza.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

extern "C" __declspec(dllexport)void test2();

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                               )
{
    return TRUE;
}


void test2(){MessageBox(0,"test2","hallo",0);}
////////////////
0
 
pliniusAuthor Commented:
thanks.
0
 
jkrCommented:
Don't want to be picky, but in which way did I 'assist'? I consider the following the answer:

Comment from jkr  Date: 11/13/2003 02:39AM GMT  
>>The value of ESP was not properly saved across a function call

This means that either the parameter list or the calling convention for "test2()" don't match in both projects.  
0
 
pliniusAuthor Commented:
actually, this didn't assisted (I don't know what ESP & calling convention are, since I'm actually Dutch). It was
"
Well, that is the problem:
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
and
extern "C" __declspec(dllexport)void test2();
simply do _not_ match - use either
typedef void (*LPFNDLLFUNC1)();
or
extern "C" __declspec(dllexport) UINT CALLBACK test2(DWORD,UINT);

"
that helped me.
0
 
jkrCommented:
So, that was still me :o)
0
 
GloomyFriarCommented:
Hey, jkr, do you want to say, that my suggestion is wrong?
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.