James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1319回复:20

花猫进来,有问题请教。

楼主#
更多 发布于:2003-06-05 08:47
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]
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
cn18799
驱动老牛
驱动老牛
  • 注册日期2001-11-17
  • 最后登录2010-04-16
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望36点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-05 09:03
等花猫来吧。。。 :D
[img]http://www.danasoft.com/vipersig.jpg[/img] [img]http://www.driverdevelop.com/forum/upload/cn18799/2002-09-28_logo.gif[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-05 09:09
等花猫来吧。。。 :D

如果你知道,请替俺帮帮忙吧。
我就知道花猫搞delphi很熟。
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
cn18799
驱动老牛
驱动老牛
  • 注册日期2001-11-17
  • 最后登录2010-04-16
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望36点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于: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]
[img]http://www.danasoft.com/vipersig.jpg[/img] [img]http://www.driverdevelop.com/forum/upload/cn18799/2002-09-28_logo.gif[/img]
cn18799
驱动老牛
驱动老牛
  • 注册日期2001-11-17
  • 最后登录2010-04-16
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望36点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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;


[img]http://www.danasoft.com/vipersig.jpg[/img] [img]http://www.driverdevelop.com/forum/upload/cn18799/2002-09-28_logo.gif[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-05 09:40
谢谢大狗,按照你的方法已经调试通过了,
但我原来的方法好象也没有什么毛病呀?
再请明示,不胜感激!
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-05 09:51
大狗了不起呀!
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
cn18799
驱动老牛
驱动老牛
  • 注册日期2001-11-17
  • 最后登录2010-04-16
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望36点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-05 09:51
主要是 String 和 PChar 的问题
[img]http://www.danasoft.com/vipersig.jpg[/img] [img]http://www.driverdevelop.com/forum/upload/cn18799/2002-09-28_logo.gif[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-05 09:56
主要是 String 和 PChar 的问题

好象不是这个问题吧?
我重新作了个Dll就一个函数:
Log(unsigned long *pdwContextID);

然后用我刚才的方法还是出现同样的错误。


我还作了一个dll,
就一个函数:
Log(char* puser,char*ppass);
然后在Delphi里面调用就没有问题。

车到山前必有路。 虽然有些土,却是我最有感触的一句话。
cn18799
驱动老牛
驱动老牛
  • 注册日期2001-11-17
  • 最后登录2010-04-16
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望36点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-05 10:00
你原来:
unsigned long *pdwContextID --> dwContextID:PointerToInt
无符号数  --> 符号数

但我觉得这不应该是主要问题啊。
[img]http://www.danasoft.com/vipersig.jpg[/img] [img]http://www.driverdevelop.com/forum/upload/cn18799/2002-09-28_logo.gif[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-05 10:08
你原来:
unsigned long *pdwContextID --> dwContextID:PointerToInt
无符号数  --> 符号数

但我觉得这不应该是主要问题啊。

开始我也觉得是这个问题,几乎所有的类型都用过了(不知道PULONG)
Integer,longword,double等,就是出现错误。
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
cn18799
驱动老牛
驱动老牛
  • 注册日期2001-11-17
  • 最后登录2010-04-16
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望36点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
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;


[img]http://www.danasoft.com/vipersig.jpg[/img] [img]http://www.driverdevelop.com/forum/upload/cn18799/2002-09-28_logo.gif[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-06-05 10:13
没有问题,我再该为String 看看!
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-06-05 10:15
该为String 也没有问题,奇怪,都该为原来的样子了,怎么不出错了呢?
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
cn18799
驱动老牛
驱动老牛
  • 注册日期2001-11-17
  • 最后登录2010-04-16
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望36点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-06-05 10:19
var 的位置不一样啊。

但还没想通为什么你原来去掉
nRet:=ZUserLogIn(\'SJW29USER1\',\'666666\',pContextID);
就没有事了。

[img]http://www.danasoft.com/vipersig.jpg[/img] [img]http://www.driverdevelop.com/forum/upload/cn18799/2002-09-28_logo.gif[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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.
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
cn18799
驱动老牛
驱动老牛
  • 注册日期2001-11-17
  • 最后登录2010-04-16
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望36点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-06-05 10:54
我参照你的程序调用

BOOL GetUserName(LPTSTR lpBuffer,LPDWORD nSize);
-->
function GetUserName(lpBuffer: PChar; var nSize: DWORD): BOOL; stdcall;
 
var pSize:DWORD; 放在哪里都不出错。
[img]http://www.danasoft.com/vipersig.jpg[/img] [img]http://www.driverdevelop.com/forum/upload/cn18799/2002-09-28_logo.gif[/img]
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-06-05 11:07
看来不用我回答了
如果要和C相接,则一定要注意Pascal的字符串和C字符串的区别。
对于C写的DLL,在Delphi中不用声明成string,C里没string!
要用PChar
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-06-05 11:52
看来不用我回答了
如果要和C相接,则一定要注意Pascal的字符串和C字符串的区别。
对于C写的DLL,在Delphi中不用声明成string,C里没string!
要用PChar

用String我都调试通过了。
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-06-05 12:05
用String我都调试通过了。

但那样安全吗?你有试过把那个string做些+的操作吗?
string和PChar存的都是一串字符而已,当然一定情况下可能没事,但总归是不安全的。

不要破坏函数原型的一致性――Vancheer
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
上一页
游客

返回顶部