//testDll.h
WINAPI int testDll(int a,int b);//testDll.def
EXPORTS
testDll @1//testDll.cpp
#include <windows.h>WINAPI int testDll(int a,int b){
char mess[512]; HMODULE hDllModule; //Ö¸Ïò¶¯Ì¬¿âµÄ¾ä±ú
int ret;
ret = 0;
int (* start_gprs_server)(HWND,int,int,char *); //¶¨ÒåÒ»¸öÖ¸Ïòº¯ÊýµÄµØÖ·µÄÖ¸Õë
ret = 1;
hDllModule=LoadLibrary("gprs_dll.dll");
ret = 2;
if (hDllModule!=NULL) //Åжϵ÷ÓÃÊÇ·ñ³É¹¦
{
//´Ó¶¯Ì¬¿âÖÐÈ¡º¯ÊýµØÖ·
start_gprs_server = (int (*)(HWND,int,int,char *))GetProcAddress(hDllModule,"start_gprs_server");
ret = 3;
if (start_gprs_server !=NULL) //ÅжÏÊÇ·ñÈ¡µ½¸Ãº¯ÊýµØÖ·
{
//¿ÉÒÔÏÈÉ趨¹¤×÷ģʽ
//SetWorkMode(1) //0;1;2
ret = 4;
ret = ret + (*start_gprs_server)(NULL,123,5002,mess);
ret = 5;
}
}
return (a+b);}
运行到(*start_gprs_server)(NULL,123,5002,mess);
总是出错。
提示:
The value of ESP was not a properly saved accross a function call。This is usually a result
of calling a function declared with one calling convention with a function poiter
declared with a different calling convention 。有方法可以解决?
WINAPI int testDll(int a,int b);//testDll.def
EXPORTS
testDll @1//testDll.cpp
#include <windows.h>WINAPI int testDll(int a,int b){
char mess[512]; HMODULE hDllModule; //Ö¸Ïò¶¯Ì¬¿âµÄ¾ä±ú
int ret;
ret = 0;
int (* start_gprs_server)(HWND,int,int,char *); //¶¨ÒåÒ»¸öÖ¸Ïòº¯ÊýµÄµØÖ·µÄÖ¸Õë
ret = 1;
hDllModule=LoadLibrary("gprs_dll.dll");
ret = 2;
if (hDllModule!=NULL) //Åжϵ÷ÓÃÊÇ·ñ³É¹¦
{
//´Ó¶¯Ì¬¿âÖÐÈ¡º¯ÊýµØÖ·
start_gprs_server = (int (*)(HWND,int,int,char *))GetProcAddress(hDllModule,"start_gprs_server");
ret = 3;
if (start_gprs_server !=NULL) //ÅжÏÊÇ·ñÈ¡µ½¸Ãº¯ÊýµØÖ·
{
//¿ÉÒÔÏÈÉ趨¹¤×÷ģʽ
//SetWorkMode(1) //0;1;2
ret = 4;
ret = ret + (*start_gprs_server)(NULL,123,5002,mess);
ret = 5;
}
}
return (a+b);}
运行到(*start_gprs_server)(NULL,123,5002,mess);
总是出错。
提示:
The value of ESP was not a properly saved accross a function call。This is usually a result
of calling a function declared with one calling convention with a function poiter
declared with a different calling convention 。有方法可以解决?
解决方案 »
- 请问下面是什么控件//有办法把蓝色变成红色吗?
- 请问如何向线程函数传递多个参数?
- divx5.0.2里如何设置帧率?
- 老弟有问题?
- 多文档界面,如何控制子窗口创建的数目??100分求解
- 初学Dao编程,请问各位在Dao中如何使用COleVariant对象?有没有详细参考?
- 字符串处理
- 怎样初始化ToolBar上Button的状态?
- 今年咋过年呀?!!
- 有了.net以后,还有多少非单机的应用在使用com/dcom,能否举例?
- ADO+SQL Server,删除数据时为什么"多步OLE DB操作出错,多步OLE DB操作没被完成"
- (急)请问一个用ATL写的控件如何改变Static Text的文字颜色?
WINAPI int testDll(int a,int b)
{
//前面都一样
start_gprs_server = (STARTSERVER*)GetProcAddress(hDllModule,"start_gprs_server");
}
这个问题是因为堆栈指针不平衡,可能是函数退出的时候没有恢复堆栈导致的,上次我出现这问题的解决办法有两个:
一个是_asm{sub 4;(根据实际情况而定)};内嵌汇编,自己使堆栈平衡;
二是明白你使用函数的堆栈平衡机制,_stdcall约定还是_cdecl约定,然后和你的编译器调用约定一样就行了.一般在VC++6下,找到出错函数,声明为:extern "C" 返回值 _stdcall 函数名 (参数);就解决问题了.
如 EnochShen(小疯子:真的好菜—知耻而后勇!) 和 BigFanOfCpp(((Bytes)+_ALGIN-1) & ~(_ALGIN-1)) 所述