delphi调用C++编写的DLL出错。

zhouhui927 2008-03-04 02:55:10
现在有一个用C++编写的DLL动态链接库,其中有一个函数,如果用C++编写的应用程序去调用,则没有问题,如果用Delphi编写的应用程序去调用,则总是出现Raised exception class C0000005 with message 'access violation at 0x1000dbf6: write of address 0x00000000'异常,在delphi中调用方式没有问题,则两种方式调用时输入的参数都是一样的。请问有哪些情况会造成此问题?
...全文
86 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouhui927 2008-03-07
  • 打赏
  • 举报
回复
感谢大家的回复,分就平均散了。
zhouhui927 2008-03-07
  • 打赏
  • 举报
回复
问题找到了,
TBSR_GetReadData=function(szIP:PChar;IChannel:WORD;iDvrType:UINT;Transmode:UINT;GetStreamData: TBSR_GetStreamDataCallBack;bNewVersion : BOOL; bNewDecoder : BOOL):UINT;cdecl;

原来这个函数的最后两个参数应该是变量类型。
zhouhui927 2008-03-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ZuoBaoquan 的回复:]
试试将两个函数都改成stdcall
[/Quote]

动态链接库定义的调用方式是cdecl,试过改为stdcall,但是同样的错误。
ZuoBaoquan 2008-03-05
  • 打赏
  • 举报
回复
试试将两个函数都改成stdcall
僵哥 2008-03-04
  • 打赏
  • 举报
回复
BSR_API 原型是什么?
zhouhui927 2008-03-04
  • 打赏
  • 举报
回复
另外,也尝试过将回调函数的调用方式改为stacall,也出现同样的错误。
zhouhui927 2008-03-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]
贴出来出问题的函数声明
[/Quote]

在C++里的函数声明:
BSR_API UINT BSR_GetReadData(PCSTR szIp, WORD iChannel, BSR_DVR_TYPE iDvrType,UINT Transmode, BOOL(CALLBACK* GetStreamData)(BYTE * buf, UINT len),BOOL &bNewVersion, BOOL &bNewDecoder);

在Delphi里的函数声明:
TBSR_GetReadData=function(szIP:PChar;IChannel:WORD;iDvrType:UINT;Transmode:UINT;GetStreamData: TBSR_GetStreamDataCallBack;bNewVersion : BOOL; bNewDecoder : BOOL):UINT;cdecl;

BSR_GetReadData :TBSR_GetReadData;

回调函数声明:
TBSR_GetStreamDataCallBack = function(buf:PByte;len:UINT):BOOL;cdecl;

function CallBack(buf : PByte ; len:UINT) : BOOL;cdecl;
begin
result := true;
end;

在delphi中调用时:
GetReadData(pChar('192.168.0.10'),1,1,0, @CallBack, false, false)

其中试过将函数的最后两个参数换成UINT,传入0也出现同样的错误。


  • 打赏
  • 举报
回复
贴出来出问题的函数声明

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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