dll中传指针参数出错

xw9207 2003-04-01 09:24:43
在编写dll时,传入值参数没有错误。
而使用传入指针参数,在显式调用返回后出现内存泄漏的错误。
下面是部分源代码,望各位能给予帮助。
scan.h
#ifdef SCAN_EXPORTS
#define SCAN_API __declspec(dllexport)
#else
#define SCAN_API __declspec(dllimport)
#endif
SCAN_API int FunctionDll( char* a )

scan.cpp
SCAN_API int FunctionDll( char* a )
{
return 2;
}

scan.def
LIBRARY Write
EXPORTS
FunctionDll @1

dll调用
HINSTANCE m_lib;
typedef int (CALLBACK *FunctionDll) ( char *p );
FunctionDll aDll;
m_lib = LoadLibrary("Scan.dll");
assert(m_lib);
aDll = ( FunctionDll )GetProcAddress( m_lib, "FunctionDll");
assert(aDll);
char strExample[10];
strcpy(strExample,"Hello");
int ret = aDll( strExample);
ret = ret +1;
在debug下,从dll返回时出错 是memory leak。但如果用lib库方式调用就没有问题。
我不知道问题出在那里。而且如果不传入指针的话,一切都正常。
谢谢高手帮忙!

...全文
40 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiadrun 2003-04-01
  • 打赏
  • 举报
回复
CALLBACK一般用在回调函数中。
#define CALLBACK __stdcall

如果你的DLL去掉 CALLBACK ,它将无法被非C语言程序调用。

修改办法:将dll中的SCAN_API int FunctionDll( char* a )
改为:SCAN_API __stdcall int FunctionDll( char* a )
In355Hz 2003-04-01
  • 打赏
  • 举报
回复
CALLBACK 是 __stdcall 调用,你的 DLL 函数是 __cdecl 调用(这是默认的),你这样会造成调用后栈指针没有恢复。
@BruceYan@ 2003-04-01
  • 打赏
  • 举报
回复
typedef int (CALLBACK *FunctionDll) ( char *p );
这句好象去掉 CALLBACK 就行了吧;
xw9207 2003-04-01
  • 打赏
  • 举报
回复
关键不是FreeLibrary(aDll),刚刚试了一下,在于
typedef int (CALLBACK *FunctionDll) ( char *p );
如果改为
typedef int (*FunctionDll) ( char *p );
就没有错误了。
另外,请问CALLBACK回调函数主要的作用是什么?
谢谢o_racle.
o_racle 2003-04-01
  • 打赏
  • 举报
回复
在ret = ret +1;后面加上FreeLibrary(aDll);试试!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧