回调函数和StdCall问题(50分)

  • 主题发起人 主题发起人 SandWater
  • 开始时间 开始时间
S

SandWater

Unregistered / Unconfirmed
GUEST, unregistred user!
有一段代码在VC下面没有问题,代码大致如下:<br>定义了一个Struct<br>&nbsp;typedef struct Deliverstr<br>&nbsp;{ &nbsp; &nbsp;<br>&nbsp; &nbsp;.......<br>&nbsp;} <br>定义了两个函数 <br>&nbsp; void PDeliver(DeliverStr deliver)<br>&nbsp; integer send(PDeliver pdeliver);<br>&nbsp;<br>&nbsp;最后就是执行函数send,这应该就是传说中的回调函数吧。[8D]<br>&nbsp;好了,我现在想把他转化为delphi。<br>&nbsp;定义struct就好说了<br>&nbsp; type<br>&nbsp; &nbsp; DeliverStr = packed record<br> ......... &nbsp; &nbsp;<br>&nbsp; &nbsp; end; <br><br>那两个函数我是这样定义的<br>&nbsp; &nbsp; type TDeliver = procedure(var deliver: DeliverStr);<br>&nbsp; &nbsp; function send(deliver: TDeliver): integer;<br><br>好了,问题是这样的,在VC中能够得到正确数据的现在全乱套了,得到的都是乱码,我怀疑是不是VC和delphi的调用方式不同,故我想到给TDeliver加上Stdcall,但是当我将 &nbsp; &nbsp;<br>&nbsp; &nbsp; type TDeliver = procedure(var deliver: DeliverStr);加上这个stdcall时,情形反而更糟,程序一声不响就关掉了。<br>&nbsp; &nbsp; why?<br>
 
procedure 函数名(flag1:BOOL) ;stdcall;external 'USER32.dll';
 
?????<br>问题应该不是出在stdcall上,还是代码有点问题
 
type TDeliver = procedure(deliver: ^DeliverStr);<br><br>最好在VC中加stdcall 这样就要在delphi中加stdcall,原因就是stdcall表是由dll管理,不由delphi调用来管理.
 
type TDeliver = procedure(deliver: ^DeliverStr);<br>根本就是错误的,编译都没办法通过<br><br>
 
算了,换个问题吧,上面的问题我已经自己解决了:-0<br><br>现在我有一个Pchar,在内存中的值是 '#0','H','E','L','L','O','#0','#0','#0'。这是用delphi编译器看到的,与其它pchar不同之处就是它的首地址就指向了一个结束符,所以当我使用showmessage(p)时就显示空白了,有什么简单而有效的方法将HELLO取出来呢?
 
showmessage(PChar(Integer(p)+1))
 
多人接受答案了。
 
后退
顶部