如何调用VC建立的DLL::200分 (200分)

  • 主题发起人 主题发起人 ulysses
  • 开始时间 开始时间
U

ulysses

Unregistered / Unconfirmed
GUEST, unregistred user!
各位同志<br>我正在做一个通过网关收发短消息项目,网关的接口是一个著名公司提供的,<br>是一个VC做的DLL“SMEIDLL“。我对DELPHI不是非常的熟悉,特别是要调<br>VC的DLL,不知道DELPHI的数据类型和VC的如何对应起来。函数的原形是<br><br>//初始化接口函数<br>BOOL WINAPI IFInitInterface(DWORD dwCodeProtocol, <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD dwDriverProtocol, <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LPCTSTR pDriverParam);<br>//我的调用.<br>function IFInitInterface(cp,dp:Cardinal;driverparam:PChar):Integer;stdcal;External'smeidll.dll'<br><br>//这样的调用可以成功.返回值为1.但是不知道为什么执行后程序会挂起30秒.然后才能返回.<br>//我不明白的是WINAPI的这种类型的FUNCTION,在DELPHI里要如何定义函数参数.(stdcall,pascal....)<br>//函数的返回类型是BOOL.我用INTEGER也不报错.但我总觉得怪怪的?????<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>//登录函数<br>BOOL WINAPI Login_R(LPCTSTR SystemID, &nbsp;LPCTSTR Password);<br>//我用和上面的方法一样调用就不来.弄得我都要疯了。<br>&nbsp;<br>那位同志知道方法或做过类似的东西,请帮忙告诉我真相. THANK A LOT.<br>&nbsp; &nbsp; &nbsp; &nbsp;
 
在API中的boolean, 是一個四Byte的數值, 所以把BOOL宣告為integer也沒有問題<br>宣告可以已為:<br>function IFInitInterface(cp,dp:Cardinal;driverparam:PChar): BOOL;stdcall;External'smeidll.dll'<br>那麼在Delphi中就可直接把函式的傳回值當作是boolean來使用<br>Login_R的宣告為<br>function Login_R(SystemID, Password: PChar): BOOL; stdcall; External'smeidll.dll';<br>就沒有問題了<br>如果執行上有什麼問題, 應是在運用此Dll或函時, 或許還要有什麼特殊的注意事項<br>或許你可以提供在VC調用的範例及在Delphi中所寫的程式, 這樣有助於分析出問題所在<br>
 
TO:LORDERIC<br>感谢您的回复.我现在还是解决不了.VC CODE 如下<br>申明---------------------------------------------------<br>BOOL WINAPI IFInitInterface(DWORD dwCodeProtocol,//编码协议<br> &nbsp; &nbsp; &nbsp;DWORD dwDriverProtocol,//通讯协议<br> &nbsp; &nbsp; &nbsp;LPCTSTR pDriverParam//通讯参数<br> &nbsp; &nbsp; &nbsp;);<br>调用----------------------------------------------------------<br>int iRet;<br>iRet=IFInitInterface( 5,1,"211.138.200.45 7890 5000");<br>if(iRet!=0)<br>&nbsp; &nbsp;MessageBox("初始化套接字成功!",MB_OK,0);<br>else<br>&nbsp; &nbsp;MessageBox("初始化套接字失败!",MB_OK,0);<br><br>申明-----------------------------------------------------------------<br>BOOL WINAPI Login_R(LPCTSTR SystemID,//用户标识 char [MAX_SMEI_SYSTEMID]<br> &nbsp; &nbsp; &nbsp; &nbsp; LPCTSTR Password//密码 char[MAX_SMEI_PASSWORD]<br> &nbsp; &nbsp; &nbsp; &nbsp; );<br>调用------------------------------------------------------------------<br>// TODO: Add your control notification handler code here<br>//登录短讯中心:接口名、接口密码<br>int iRet;<br>iRet=Login_R("910813","051113");<br>if(iRet!=0)<br>&nbsp; MessageBox("登录成功!",MB_OK,0);<br>else<br>&nbsp; MessageBox("登录失败!",MB_OK,0);<br><br>我的DELPHI申明和调用<br>TIFInitInterface = function(cp,dp:LongWord;sp:PChar):bool;stdcall;external'sm.dll'<br>TLogin_R = function(ID,Pwd:String):Bool;stdcall;'sm.dll'<br><br>blnReturn:=IFInitInterface(5,1,'200.138.200.45 7890 5000');<br>//成功返回TRUE.但是调用以后程序挂起40秒左右.我试了其他的<br>&nbsp; CALLING CONVENTION<br>&nbsp; register 报错.系统蓝屏.DOWN机<br>&nbsp; CDELC &nbsp; &nbsp;同上<br>&nbsp; SAFECALL 同上<br>&nbsp; PASCAL &nbsp; 同上<br>-----------------------------------------<br>blnReturn:=Login_R('984813','051213');<br>//总是报错.我感觉是参数传递的问题.实参传给DLL后没有正确的解释.<br>VC的DEMO使用非常的正常.<br>请再帮我看看.非常感谢.<br>
 
1. register,即是 唯一使用 CPU寄存器的参数传递方式,也是传递速度最快的方式;<br>  pascal: 调用协议仅用于向后兼容,即向旧的版本兼容;<br>  cdecl: 多用于 C和 C++语言编写的例程,也用于需要由调用者清除参数的例程;<br>  stdcall: 和safecall主要用于调用Windows API 函数;其中safecall还用于双重接口。<br>2.Delphi中这样:TLogin_R = function(ID,Pwd:Pchar):Bool;stdcall;'sm.dll'<br>3.调用:blnReturn:=IFInitInterface(5,1,pchar('200.138.200.45 7890 5000'));<br>&nbsp; &nbsp; &nbsp; &nbsp;blnReturn:=Login_R(pchar('984813'),pchar('051213'));<br>
 
TO:weekboy<br>&nbsp; 感谢您的回复。但是PCHAR这个方法我试过了,还是不来。唉。DLL真的<br>这么难用吗?您有没有见过一种叫 FARPROC的申明。我在DELPHI帮助里找不<br>到。一个朋友告诉我的。不知道怎么调。
 
我沒有學過VC, 所以無法為你做測試<br>不過, 我有在MSDN找尋有關LPCTSTR的說明, 其中有提到LPCTSTR可能為Unicode或MultiByte string<br>那要看VC編譯時的編譯選項來決定, 說不定這個Dll被編譯成使用Unicode, 所以你可以將<br>參數中的PChar改為PWideChar試試看, 如果不行, 我也愛莫能助了!
 
WINAPI 对应 stdcall<br>BOOL 对应 longbool<br><br>LPCTSTR 在unicode对应unicode的LPWSTR,在ansi对应ansi德 LPCSTR<br>所以你用PChar应该也是可以的,但是我怕dll开发者误用,如果dll是unicode的,那么必须使用<br>PWideChar
 
感谢各位。我已经解决了。非常好笑。原因是这个DLL是调用WINSOCK的。<br>由于是第一次使用DELPHI。我最早是用DYNAMIC LOADING的方式。在INITINTERFACE<br>后就关闭了HANDLE。LOGIN_R的时候再打开就关闭了SOCKET.所以总是登不上去。<br>还有哪个华字头的大公司可能是太大了,所以文档写的有问题.一个参数居然给错了。<br>也是一个原因.总之感谢各位的帮助,让我学到不少东西.用DELPHI做东西也更有信心了。
 
后退
顶部