delphi接口定义:
Function ZWConnect(PBuff: PChar):word;cdecl;export; vc6.0中代码:
CString sDllName="delphi.dll"
typedef int (CALLBACK* ZWConnect)(char* pcParam);HINSTANCE hInstance;
CString strParam;
strParam.Empty(); hInstance = LoadLibrary(sDllName);
if(hInstance!=NULL)
{
ZWConnect zwConnect;
zwConnect = (ZWConnect)GetProcAddress(hInstance,"ZWConnect");
zwConnect((LPSTR)(LPCTSTR)strParam);
} FreeLibrary(hInstance); 说明:
1、在debug和release配置下,能够正常调用和返回值,但是FreeLibrary(hInstance)会报错并退出程序,debug模式下错误提示为:the thread 0xFEC has exited with code -1073741571。
2、把VC中函数定义中的CALLBACK取消后过程和结果与原来完全相同;
3、换用char或者char*类型参数,并分配足够大内存(3000),结果与原来相同,在FreeLibrary处报错;
4、PBuff在delphi中应该被修改过,因为调用结束后参数会返回一个有意义的值
Function ZWConnect(PBuff: PChar):word;cdecl;export; vc6.0中代码:
CString sDllName="delphi.dll"
typedef int (CALLBACK* ZWConnect)(char* pcParam);HINSTANCE hInstance;
CString strParam;
strParam.Empty(); hInstance = LoadLibrary(sDllName);
if(hInstance!=NULL)
{
ZWConnect zwConnect;
zwConnect = (ZWConnect)GetProcAddress(hInstance,"ZWConnect");
zwConnect((LPSTR)(LPCTSTR)strParam);
} FreeLibrary(hInstance); 说明:
1、在debug和release配置下,能够正常调用和返回值,但是FreeLibrary(hInstance)会报错并退出程序,debug模式下错误提示为:the thread 0xFEC has exited with code -1073741571。
2、把VC中函数定义中的CALLBACK取消后过程和结果与原来完全相同;
3、换用char或者char*类型参数,并分配足够大内存(3000),结果与原来相同,在FreeLibrary处报错;
4、PBuff在delphi中应该被修改过,因为调用结束后参数会返回一个有意义的值
解决方案 »
- COM 控件打cab包以及页面引用COM控件的问题。
- 如何删除特定网站的缓存及cookie
- 出现"Buffer is too small”的问题
- CRC-16算法
- CComPtr<IOleObject> spOleObj;给解释一下这句话是什么意思?....等待...
- 新鲜出炉!!! 2004上海程序员生存现状调查!!! 答者有分!!! (续帖4)
- 一个简单的线程问题,切望指点
- 有几个VC语法问题,请大家提点一下
- 如何获得DSN连接的列表?
- keybd_event会黑屏,为什么?
- 求某达人帮解决个显示IP地址的小问题
- 异常: 0xC0000005: 读取位置 0x00d0ce28 时发生访问冲突的问题
如果LoadLibrary(sDllName);不成功也FreeLirary那就报错了
利用回调函数处理delhpi提供的数据,处理时有没有问题?会不会不小心把指针给改了?这类问题最好是联调。
strParam.Empty(); 你不可以在DELPHI编写的函数中,使用强制指针转化的方法用CString strParam,这是个错误的用法
应该使用 char sbuff[]这样的方法
并在调用前先 memset(sbuff ,0 ,xxx);你确定那个DLL没问题?如果换用 char 数组进去释放时还出问题,
那怎么看都象是DLL调用自释放函数或者你调用的函数本身发生了错误,而不是调用方的问题
Function ZWConnect(PBuff: PChar):word;cdecl;export; vc6.0中代码:
CString sDllName="delphi.dll" typedef int (CALLBACK* ZWConnect)(char* pcParam); cdecl 由调用者清除堆栈
stdcall 由被调的函数清除堆栈 CALLBACK是stdcall或者你被delphi部分,或者改调用部分typedef int (__cdecl* ZWConnect)(char* pcParam);