一个标准C编写的DLL的调用,却出错了,不知道为什么 ( 积分: 100 )

  • 主题发起人 主题发起人 lfpsoft
  • 开始时间 开始时间
L

lfpsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
函数原型为:<br>int&nbsp;__stdcall&nbsp;Cmpp2Start(LPCTSTR&nbsp;pchSmgIp,&nbsp;int&nbsp;nMtPort,&nbsp;int&nbsp;nMoPort,LPCTSTR&nbsp;pchUserName,&nbsp;LPCTSTR&nbsp;pchUserPwd,&nbsp;unsigned&nbsp;char&nbsp;uchVersion,void&nbsp;(__stdcall&nbsp;*OnSmgMsg)(CMPP_SMGTOSP*&nbsp;&nbsp;css),&nbsp;int&nbsp;nConnType,&nbsp;void&nbsp;(__stdcall&nbsp;*OnLogFile)(LPCTSTR&nbsp;str))<br>CMPP_SMGTOSP&nbsp;是个结构。<br>我的定义是这样的:<br>&nbsp;&nbsp;TOnSmgMsg&nbsp;=&nbsp;procedure(css:TCMPP_SMGTOSP)&nbsp;of&nbsp;object;<br>&nbsp;&nbsp;TOnLogFile&nbsp;=&nbsp;procedure(str:PAnsiChar)&nbsp;of&nbsp;object;<br>&nbsp;&nbsp;TCmpp2Start&nbsp;=&nbsp;function&nbsp;(pchSmgIp:PChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nMtPort:Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nMoPort:Integer;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pchUserName:PChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pchUserPwd:PChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uchVersion:Byte;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnSmgMsg:TOnSmgMsg;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nConnType:Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnLogFile:TOnLogFile):Integer;stdcall;<br>procedure&nbsp;OnSmgMsg(css:TCMPP_SMGTOSP);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br><br>end;<br>procedure&nbsp;OnLogFile(str:PChar);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;//<br>end;<br><br>但调用的时候却出错了,报E2010&nbsp;Incompatible&nbsp;types:&nbsp;'TOnSmgMsg'&nbsp;and&nbsp;'Pointer'
 
我的调用是:<br>Cmpp2Start(PChar('192.168.0.1'),7890,7890,PChar('aa'),Pchar('bb'),Byte(20),@OnSmgMsg,0,@OnLogFile);
 
TOnSmgMsg&nbsp;=&nbsp;procedure(css:TCMPP_SMGTOSP);stdcall;//&nbsp;of&nbsp;object;<br>&nbsp;&nbsp;TOnLogFile&nbsp;=&nbsp;procedure(str:PAnsiChar);stdcall;//&nbsp;of&nbsp;object;
 
TOnSmgMsg&nbsp;=&nbsp;procedure(css:TCMPP_SMGTOSP);stdcall;//&nbsp;of&nbsp;object;<br>&nbsp;&nbsp;TOnLogFile&nbsp;=&nbsp;procedure(str:PAnsiChar);stdcall;//&nbsp;of&nbsp;object;<br>为正解,只要调用惯例为stdcall;
 
TOnSmgMsg&nbsp;=&nbsp;procedure(css:TCMPP_SMGTOSP);stdcall;//&nbsp;of&nbsp;object;<br>&nbsp;&nbsp;TOnLogFile&nbsp;=&nbsp;procedure(str:PAnsiChar);stdcall;//&nbsp;of&nbsp;object;<br>这个已改回了。但调用的时候还是弹出CPU调试窗口。应该是有些类型定义错了。<br>unsigned&nbsp;char&nbsp;uchVersion&nbsp;是应该定义为Byte吗?
 
unsigned&nbsp;char&nbsp;uchVersion&nbsp;是Byte<br>TCMPP_SMGTOSP是指针么?如果不是,那么应该:<br>1、TOnSmgMsg&nbsp;=&nbsp;procedure(const&nbsp;css:TCMPP_SMGTOSP);stdcall;<br>或<br>2、TOnSmgMsg&nbsp;=&nbsp;procedure(css:PCMPP_SMGTOSP);stdcall;
 
TCMPP_SMGTOSP&nbsp;是个结构来的
 
type<br>&nbsp;&nbsp;PCMPP_SMGTOSP&nbsp;=&nbsp;^TCMPP_SMGTOSP;<br>TOnSmgMsg&nbsp;=&nbsp;procedure(css:&nbsp;PCMPP_SMGTOSP);stdcall;
 
其实这个函数是CMPP2.0协议的封装。<br>调用的是CMPPAPI.dll,在网络上都有C#调用的例子,却没有DELPHI的例子。我想应该可以用DELPHI调用的吧,但为什么去出错了。改成1、TOnSmgMsg&nbsp;=&nbsp;procedure(const&nbsp;css:TCMPP_SMGTOSP);stdcall;<br>或<br>2、TOnSmgMsg&nbsp;=&nbsp;procedure(css:PCMPP_SMGTOSP);stdcall;<br>还是不行啊
 
qq:22627167&nbsp;于少飞
 
多人接受答案了。
 
后退
顶部