DELPHI调用DLL时的回调函数问题

DLL是用C++编写的要用DELPHI调用可是其中的回调函数一直没反应啊C/C++code#ifndef_FSC_MOTOSRV_H_#define_FSC_MOTOSR... DLL是用C++编写的 要用DELPHI调用 可是其中的回调函数一直没反应啊

C/C++ code#ifndef _FSC_MOTOSRV_H_
#define _FSC_MOTOSRV_H_

#ifdef WIN32
#ifdef MOTO_SRV_EXPORTS
#define MOTOSRV_API extern "C" __declspec(dllexport)
#else
#define MOTOSRV_API __declspec(dllimport)
#endif

#define _CALL __cdecl
#endif //WIN32

typedef int bool;

typedef void (WINAPI *MOTO_Callback)(char *msg, int msglen);

//注册接到对方数据时的回调函数
MOTOSRV_API void _CALL MOTO_SetCallBackFun(MOTO_Callback cb);

以上是DLL的头文件

C/C++ code
void __stdcall display(char *msg, int len)
{
int i;
for(i =0; i<len; ++i)
{
printf("0x%02x ",msg[i]);
}
printf("\n");
return;
}

int main(int argc, char **argv)
{

//////////////////////// 接收数据 ////////////////////////////
//设置回调函数
MOTO_SetCallBackFun(display);

//开始接收数据
MOTO_StartRecv(Port);

}
以上是C++调用DLL时候的回调函数部分,运行正常。

Delphi(Pascal) code
type
PCALLBACK = function(msg:Pchar;n:integer):boolean;stdcall;

procedure MOTO_SetCallBackFun(cbf: PCALLBACK);cdecl; external 'moto_srv.dll';

//function CallBack(msg:Pchar;n:integer):boolean;stdcall;

function CallBack(msg:Pchar;n:integer):boolean;stdcall;
begin
showmessage('11');
form1.memo1.text:='wert';
result:=true;
end;

function MOTO_SendData(str:Pchar; n:integer):boolean;cdecl;external'moto_srv.dll' ;
procedure MOTO_SetIDParam(m:integer; n:integer);cdecl;external'moto_srv.dll' ;
procedure MOTO_SetNetParam(str:string; n:integer);cdecl;external'moto_srv.dll' ;
function MOTO_StartRecv(n:integer):boolean;cdecl;external'moto_srv.dll' ;
procedure MOTO_StopRecv();cdecl;external'moto_srv.dll' ;

procedure TForm1.Button1Click(Sender: TObject);
var
i,k:integer;
aa:array of byte;
str:string;
begin str:='0101DD99004703000011072215293403D5BEB5F7000001000100000000C0EED4CBC7BF0000D2B6CFB2B3AC00000CD5BED5FB393939393939394603443180334603443180334603443180330FE8';
k:=trunc(length(str)/2);
setlength(aa,k);
for i:=0 to k-1 do
aa[i]:=byte(strtoint('$'+str[2*i+1]+str[2*i+2])) ;
sendaaa(aa,k);
end;

procedure TForm1.Sendaaa(aa:array of byte;n:integer);
var
callbackFun: PCALLBACK;
begin
callbackFun:= CallBack;
MOTO_SetNetParam('12.0.0.111',4004);
MOTO_SendData(@aa,n);
MOTO_SetCallBackFun(@callbackFun);
MOTO_StartRecv(4004);
end;

求高手帮帮忙啊,为什么我的回调函数里面一直没有反应呢?showmessage('11');没反应啊,C++的程序里面就算 void __stdcall display(char *msg, int len)
这里的数据类型不对,回调函数收到的数据不正确,但至少还会有反应的,请问我的程序哪出问题了?请高手帮帮忙,谢谢了!

哪位高手能帮帮我 留下邮箱 我把C++的DEMO和DLL发过去
展开
 我来答
安德森反黑客
2011-08-30
知道答主
回答量:8
采纳率:0%
帮助的人:1.3万
展开全部
DLL是用C++编写的 要用DELPHI调用 可是其中的回调函数一直没反应啊

C/C++ code#ifndef _FSC_MOTOSRV_H_
#define _FSC_MOTOSRV_H_

#ifdef WIN32
#ifdef MOTO_SRV_EXPORTS
#define MOTOSRV_API extern "C" __declspec(dllexport)
#else
#define MOTOSRV_API __declspec(dllimport)
#endif

#define _CALL __cdecl
#endif //WIN32

typedef int bool;

typedef void (WINAPI *MOTO_Callback)(char *msg, int msglen);

//注册接到对方数据时的回调函数
MOTOSRV_API void _CALL MOTO_SetCallBackFun(MOTO_Callback cb);

以上是DLL的头文件

C/C++ code
void __stdcall display(char *msg, int len)
{
int i;
for(i =0; i<len; ++i)
{
printf("0x%02x ",msg[i]);
}
printf("\n");
return;
}

int main(int argc, char **argv)
{

//////////////////////// 接收数据 ////////////////////////////
//设置回调函数
MOTO_SetCallBackFun(display);

//开始接收数据
MOTO_StartRecv(Port);

}
以上是C++调用DLL时候的回调函数部分,运行正常。

Delphi(Pascal) code
type
PCALLBACK = function(msg:Pchar;n:integer):boolean;stdcall;

procedure MOTO_SetCallBackFun(cbf: PCALLBACK);cdecl; external 'moto_srv.dll';

//function CallBack(msg:Pchar;n:integer):boolean;stdcall;

function CallBack(msg:Pchar;n:integer):boolean;stdcall;
begin
showmessage('11');
form1.memo1.text:='wert';
result:=true;
end;

function MOTO_SendData(str:Pchar; n:integer):boolean;cdecl;external'moto_srv.dll' ;
procedure MOTO_SetIDParam(m:integer; n:integer);cdecl;external'moto_srv.dll' ;
procedure MOTO_SetNetParam(str:string; n:integer);cdecl;external'moto_srv.dll' ;
function MOTO_StartRecv(n:integer):boolean;cdecl;external'moto_srv.dll' ;
procedure MOTO_StopRecv();cdecl;external'moto_srv.dll' ;

procedure TForm1.Button1Click(Sender: TObject);
var
i,k:integer;
aa:array of byte;
str:string;
begin str:='0101DD99004703000011072215293403D5BEB5F7000001000100000000C0EED4CBC7BF0000D2B6CFB2B3AC00000CD5BED5FB393939393939394603443180334603443180334603443180330FE8';
k:=trunc(length(str)/2);
setlength(aa,k);
for i:=0 to k-1 do
aa[i]:=byte(strtoint('$'+str[2*i+1]+str[2*i+2])) ;
sendaaa(aa,k);
end;

procedure TForm1.Sendaaa(aa:array of byte;n:integer);
var
callbackFun: PCALLBACK;
begin
callbackFun:= CallBack;
MOTO_SetNetParam('12.0.0.111',4004);
MOTO_SendData(@aa,n);
MOTO_SetCallBackFun(@callbackFun);
MOTO_StartRecv(4004);
end;

求高手帮帮忙啊,为什么我的回调函数里面一直没有反应呢?showmessage('11');没反应啊,C++的程序里面就算 void __stdcall display(char *msg, int len)
这里的数据类型不对,回调函数收到的数据不正确,但至少还会有反应的,请问我的程序哪出问题了?请高手帮帮忙,谢谢了!

哪位高手能帮帮我 留下邮箱 我把C++的DEMO和DLL发过去
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
己闻楣Sx
2011-08-30 · TA获得超过1935个赞
知道大有可为答主
回答量:1057
采纳率:93%
帮助的人:893万
展开全部
zxd4g@tom.com
更多追问追答
追问
已发送,请帮忙看一下,谢谢!
追答
DLL中的输出函数的调用风格不是cdecl,而是pascal风格(windowsAPI多采用这种),通过反汇编moto_srv.dll,发现几个函数的尾部都是ret n的方式返回,即由被调用者负责清理堆栈,而不是cdecl的由调用者通过add esp, n的方式清理堆栈。
以上是主要问题,改正方法是把函数原型定义的cdecl去掉,或者改写为pascal(缺省如此,直接去掉cdecl同此);次要问题(或许不是问题),在display中,先不要访问VCL等有关窗体的资源,用writeln输出到屏幕,或者保存到一个文件,看看是否成功。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wohaoshuai5
2011-08-30
知道答主
回答量:3
采纳率:0%
帮助的人:5031
展开全部
是 速度
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式