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发过去 展开
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发过去 展开
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发过去
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发过去
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
zxd4g@tom.com
更多追问追答
追问
已发送,请帮忙看一下,谢谢!
追答
DLL中的输出函数的调用风格不是cdecl,而是pascal风格(windowsAPI多采用这种),通过反汇编moto_srv.dll,发现几个函数的尾部都是ret n的方式返回,即由被调用者负责清理堆栈,而不是cdecl的由调用者通过add esp, n的方式清理堆栈。
以上是主要问题,改正方法是把函数原型定义的cdecl去掉,或者改写为pascal(缺省如此,直接去掉cdecl同此);次要问题(或许不是问题),在display中,先不要访问VCL等有关窗体的资源,用writeln输出到屏幕,或者保存到一个文件,看看是否成功。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询