DLL是用C++编写的 要用DELPHI调用 可是其中的回调函数一直没反应啊#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的头文件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时候的回调函数部分,运行正常。type
PCALLBACK = procedure(ss:string;n:integer);stdcall;procedure CallBack(ss:string;n:integer);stdcall;procedure MOTO_SetCallBackFun(cbf: PCALLBACK);cdecl; external 'moto_srv.dll';implementationprocedure CallBack(ss:string;n:integer);stdcall;begin
showmessage('11');
end;procedure TForm1.Sendaaa();
var
callbackFun: PCALLBACK;
begin
callbackFun:= CallBack;
MOTO_SetCallBackFun(callbackFun);
MOTO_StartRecv(4004);end;以上是DELPHI 调用DLL的回调函数部分的代码,可是回调函数完全没反应啊,请问什么地方有问题啊?谢谢!
#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的头文件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时候的回调函数部分,运行正常。type
PCALLBACK = procedure(ss:string;n:integer);stdcall;procedure CallBack(ss:string;n:integer);stdcall;procedure MOTO_SetCallBackFun(cbf: PCALLBACK);cdecl; external 'moto_srv.dll';implementationprocedure CallBack(ss:string;n:integer);stdcall;begin
showmessage('11');
end;procedure TForm1.Sendaaa();
var
callbackFun: PCALLBACK;
begin
callbackFun:= CallBack;
MOTO_SetCallBackFun(callbackFun);
MOTO_StartRecv(4004);end;以上是DELPHI 调用DLL的回调函数部分的代码,可是回调函数完全没反应啊,请问什么地方有问题啊?谢谢!
PCALLBACK = procedure(ss:pchar;n:integer);stdcall;procedure CallBack(ss:pchar;n:integer);stdcall;
MOTO_SetCallBackFun(@callbackFun);
C++调用的代码在上面呢,没有问题,DELPHI的该怎么做啊?
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;
//var
//i:integer;
//sss:string;
///re2:array of byte;
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)
这里的数据类型不对,回调函数收到的数据不正确,但至少还会有反应的,请问我的程序哪出问题了?请高手帮帮忙,谢谢了!
procedure MOTO_SetNetParam(str:string; n:integer);cdecl;external'moto_srv.dll' ;需要修改一下procedure MOTO_SetNetParam(str:PAnsiChar; n:integer);cdecl;external'moto_srv.dll' ;
DEMO是后来我跟他要的,他修改了没告诉我,我傻了吧唧的搞了好几天,终于在上厕所时候来了灵感,把DEMO里的DLL复制到我的程序里,立刻能用了!!!!!!
我真SB。。