阅读:1319回复:20
花猫进来,有问题请教。
VC编了个Dll,Delphi要调用这个dll。
VC里面Dll的函数如下: int RpcInit(void); int ZUserLogIn(char *strUser, char *strPassword, unsigned long *dwContext); 我在Delphi中声明: unit Unit2; interface type PointerToInt =^Longint; function RpcInit():Longint;stdcall; function ZUserLogIn(strUser:String; strPassword:String;dwContextID:PointerToInt):Longint;stdcall; implementation function RpcInit;external \'zspkapi.dll\' name \'RpcInit\'; function ZUserLogIn;external \'zspkapi.dll\' name \'ZUserLogIn\'; end. 然后在过程中调用此Dll中的函数: var pContextID:PointerToInt; procedure TForm1.Button1Click(Sender: TObject); begin New (pContextID); pContextID^:=100; nRet:=RpcInit(); nRet:=0; nRet:=ZUserLogIn(\'SJW29USER1\',\'666666\',pContextID); Dispose (pContextID); end; 两个函数都能返回正确结果,但出现写00000地址错误提示。 我去掉 nRet:=ZUserLogIn(\'SJW29USER1\',\'666666\',pContextID); 就没有事了。 我估计就是指针的问题,不知到怎么用错了? [编辑 - 6/5/03 by Jim_little] [编辑 - 6/5/03 by Jim_little] |
|
|
沙发#
发布于:2003-06-05 09:03
等花猫来吧。。。 :D
|
|
|
板凳#
发布于:2003-06-05 09:09
等花猫来吧。。。 :D 如果你知道,请替俺帮帮忙吧。 我就知道花猫搞delphi很熟。 |
|
|
地板#
发布于:2003-06-05 09:26
unit Unit2;
interface uses Windows, ……; type function RpcInit():Longint;stdcall; function ZUserLogIn(strUser:PChar; strPassword:PChar;dwContextID:PULONG):Longint;stdcall; implementation function RpcInit;external \'zspkapi.dll\' name \'RpcInit\'; function ZUserLogIn;external \'zspkapi.dll\' name \'ZUserLogIn\'; end. 刚才忘了把笑脸关了。。。 :D [编辑 - 6/5/03 by cn18799] |
|
|
地下室#
发布于:2003-06-05 09:34
还有你调用的时候好象也不用那么麻烦。
procedure TForm1.Button1Click(Sender: TObject); var ContextID:Cardinal; begin ContextID:=100; nRet:=RpcInit(); nRet:=0; nRet:=ZUserLogIn(\'SJW29USER1\',\'666666\',@ContextID); end; |
|
|
5楼#
发布于:2003-06-05 09:40
谢谢大狗,按照你的方法已经调试通过了,
但我原来的方法好象也没有什么毛病呀? 再请明示,不胜感激! |
|
|
6楼#
发布于:2003-06-05 09:51
大狗了不起呀!
|
|
|
7楼#
发布于:2003-06-05 09:51
主要是 String 和 PChar 的问题
|
|
|
8楼#
发布于:2003-06-05 09:56
主要是 String 和 PChar 的问题 好象不是这个问题吧? 我重新作了个Dll就一个函数: Log(unsigned long *pdwContextID); 然后用我刚才的方法还是出现同样的错误。 我还作了一个dll, 就一个函数: Log(char* puser,char*ppass); 然后在Delphi里面调用就没有问题。 |
|
|
9楼#
发布于:2003-06-05 10:00
你原来:
unsigned long *pdwContextID --> dwContextID:PointerToInt 无符号数 --> 符号数 但我觉得这不应该是主要问题啊。 |
|
|
10楼#
发布于:2003-06-05 10:08
你原来: 开始我也觉得是这个问题,几乎所有的类型都用过了(不知道PULONG) Integer,longword,double等,就是出现错误。 |
|
|
11楼#
发布于:2003-06-05 10:08
把你原来的改成这样试试:
procedure TForm1.Button1Click(Sender: TObject); var pContextID:PointerToInt; begin New (pContextID); pContextID^:=100; nRet:=RpcInit(); nRet:=0; nRet:=ZUserLogIn(\'SJW29USER1\',\'666666\',pContextID); Dispose (pContextID); end; |
|
|
12楼#
发布于:2003-06-05 10:13
没有问题,我再该为String 看看!
|
|
|
13楼#
发布于:2003-06-05 10:15
该为String 也没有问题,奇怪,都该为原来的样子了,怎么不出错了呢?
|
|
|
14楼#
发布于:2003-06-05 10:19
var 的位置不一样啊。
但还没想通为什么你原来去掉 nRet:=ZUserLogIn(\'SJW29USER1\',\'666666\',pContextID); 就没有事了。 |
|
|
15楼#
发布于:2003-06-05 10:24
下面这样就出错了,nRet:Longint;
没有定义在过程内。这样有什么区别吗? unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; nRet:Longint; implementation uses Unit2; {$R *.dfm} var pContextID:PointerToInt; procedure TForm1.Button1Click(Sender: TObject); begin New (pContextID); pContextID^:=100; nRet:=RpcInit(); nRet:=0; nRet:=ZUserLogIn(\'SJW29USER1\',\'666666\',pContextID); Dispose (pContextID); end; end. |
|
|
16楼#
发布于:2003-06-05 10:54
我参照你的程序调用
BOOL GetUserName(LPTSTR lpBuffer,LPDWORD nSize); --> function GetUserName(lpBuffer: PChar; var nSize: DWORD): BOOL; stdcall; var pSize:DWORD; 放在哪里都不出错。 |
|
|
17楼#
发布于:2003-06-05 11:07
看来不用我回答了
如果要和C相接,则一定要注意Pascal的字符串和C字符串的区别。 对于C写的DLL,在Delphi中不用声明成string,C里没string! 要用PChar |
|
|
18楼#
发布于:2003-06-05 11:52
看来不用我回答了 用String我都调试通过了。 |
|
|
19楼#
发布于:2003-06-05 12:05
用String我都调试通过了。 但那样安全吗?你有试过把那个string做些+的操作吗? string和PChar存的都是一串字符而已,当然一定情况下可能没事,但总归是不安全的。 不要破坏函数原型的一致性――Vancheer |
|
|
上一页
下一页