没有高手?怎么一问到指针方面的问题就没人回答了???(0分)

  • 主题发起人 RollingStone
  • 开始时间
R

RollingStone

Unregistered / Unconfirmed
GUEST, unregistred user!
在用Delphi编写DLL中,我定义了一个过程:
procedure FLogin(PqryBasic: ^TQuery
const UserName, Password, Log: WideString)
StdCall;

但是编译器说,它不认识指针符号——^, 为什么?
该引用什么单元?
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
Type
PQuery=^TQuery;
procedure FLogin(PqryBasic: PQuery
const UserName, Password, Log: WideString)
StdCall;

再说了PqryBasic: TQuery这样就够了。Delphi里所有对象都是建立在堆上的通过指针来操作的。PqryBasic本身就是指针了。
再说你没有分数大家哪有回答的积极性
 
O

oldwry

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上的意见很正确
 
C

chshanghai

Unregistered / Unconfirmed
GUEST, unregistred user!
再穷, 不会一分也没有吧.
再说, 你没有分可以去挣分呀.
怎么振分不要我告诉你吧.
在这里不要只想得到, 而不付出.
 
R

RollingStone

Unregistered / Unconfirmed
GUEST, unregistred user!
To: wr960204
感谢兄弟的帮助。这个问题我给了分数,之前就提出来了,是100分,结果给分也发现没人
理睬,所以只好用激将法了:)

你说的第一个方法,我正在测试中,如果测试通过,我会立即通知您,并给您分。
关于您说的第二个方法,在实际应用中,是不行的,我尝试过,虽然编译器能测试通过,
但是主程序一调用DLL,就会发生指针转换之类的错误。
 
L

lich

Unregistered / Unconfirmed
GUEST, unregistred user!
参数里面是不认这个东西的
 
R

RollingStone

Unregistered / Unconfirmed
GUEST, unregistred user!
这个问题我之前已经发帖子了,给了100分,结果每人理睬,所以只好用激将法,希望兄
弟理解。
我今天下午就调试这个东西,如果调试通过,会给分的:)
 
R

RollingStone

Unregistered / Unconfirmed
GUEST, unregistred user!
以上两个方法都不行,实际应用中,发生的错误提示是一样的:
InValid Pointer Operation

这是为什么啊?
有哪位高人能阐述其中的原因吗?
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
我这边好好的呀。
 

张无忌

Unregistered / Unconfirmed
GUEST, unregistred user!
您的分数等于0,所以指针也是NIL,当然无效压![:D]
 
L

lich

Unregistered / Unconfirmed
GUEST, unregistred user!
可以这样写呀:
procedure FLogin(var qryBasic: TQuery
const UserName, Password, Log: WideString)
StdCall;

一般情况下,用不着使用指针的
 
R

RollingStone

Unregistered / Unconfirmed
GUEST, unregistred user!
To:张无忌
我已经说了,当我解决这个问题,我会立即通知的,并给出100分
君子一言,驷马难追,不要怀疑,只管解答
 
R

RollingStone

Unregistered / Unconfirmed
GUEST, unregistred user!
To:wr960204
以下是我的源码,请检查,与您的是否不同:
/////////////////////////////////////////////////////////////////////////
以下是主程序的相关代码:
。。。。。。
Type
PQuery= ^TQuery;

implementation

uses main, WS, JXC, ReportJXC, ReportWS;

{$R *.DFM}

procedure FLogin(PqryBasic: PQuery
const UserName, Password, Log: WideString)
StdCall
external 'Basic.dll';
。。。。。。
procedure TLogin.Login(const UserName, Password, Log: WideString);
begin
FLogin(@qryBasic, UserName, Password, Log)
//qryBasic是主程序中的TQuery的实例
end;
。。。。。。
/////////////////////////////////////////////////////////////////////////
以下是主程序调用的Basic.dll的相关代码:
//下面是Basic.dll的项目文件Basic.dpr的相关代码
library Basic;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
ShareMem,
SysUtils,
Classes,
Main in 'Main.pas';

{$R *.res}

exports

FLogin Index 1,
。。。。。。

begin
end.

//下面是Basic.dll的项目文件Basic.dpr调用的单元文件Main.pas的相关代码:
unit Main;

interface

uses
ShareMem, SysUtils, DBTables;

Type
PQuery= ^TQuery;

procedure FLogin(PqryBasic: PQuery
const UserName, Password, Log: WideString)
StdCall;
。。。。。。
implementation

{对登陆客户进行身份验证,若合法,则添加他的名字到列表框中,设置FLoggedIn登
陆标志为True。}
procedure FLogin(PqryBasic: PQuery
const UserName, Password, Log: WideString);
var
i: Integer;
begin
if Log='Login' then
with PqryBasic^ do begin
Close;
Sql.Clear;
sql.Append('If Exists (Select UserName from UserDefine where UserName='+ ''''+ UserName+ ''''+ ' and Password='+ ''''+ Password+ ''''+ ')');
Sql.Append('Select 1 as MyLog');
Sql.Append('else Select 0 as MyLog');
。。。。。。
///////////////////////////////////////////////////////////////////////////

下面是程序调试时候的错误提示:
InValid Pointer Operatioin
错误过程描述:
当我用客户端登陆系统,进行帐号与密码(UserName &amp
Password)的验证,调用
Basic.dll中的FLogin()函数,发生错误。

本人共有210分,对于第一个解决问题的高人,本人将全部奉上。
 
C

chnplzh

Unregistered / Unconfirmed
GUEST, unregistred user!
你使用变参测试一下,将procedure FLogin(PqryBasic: PQuery
const UserName, Password, Log: WideString);修改为procedure FLogin(var PqryBasic: TQuery
const UserName, Password, Log: WideString);

 
S

SS2000

Unregistered / Unconfirmed
GUEST, unregistred user!
在主程序中也需要第一个放上
uses ShareMem,
 
R

RollingStone

Unregistered / Unconfirmed
GUEST, unregistred user!
To: SS2000
在主程序中也需要第一个放上
uses ShareMem
会发生编译错误,我用的是Delphi6
 

来如风

Unregistered / Unconfirmed
GUEST, unregistred user!
没有错误的

我想你的错误可能不是参数的问题,
if Log='Login' then
with PqryBasic^ do begin
Close;
Sql.Clear;
sql.Append('If Exists (Select UserName from UserDefine where UserName='+ ''''+ UserName+ ''''+ ' and Password='+ ''''+ Password+ ''''+ ')');
Sql.Append('Select 1 as MyLog');
Sql.Append('else Select 0 as MyLog');

把这些东西都注释掉,只用简单的select * from a这样的形式来测试一看有没有结果就知道了
 
R

RollingStone

Unregistered / Unconfirmed
GUEST, unregistred user!
To:chnplzh,
这个方法我已经尝试过了,还是不行
Delphi的帮助文档太少了,
 
C

chnplzh

Unregistered / Unconfirmed
GUEST, unregistred user!
TO RollingStone:
变参其实就是传送地址,跟指针一样,怎么会出错呢?怪载!
要不你先不使用DLL库,将该过程的代码直接放在主程序,然后让主程序来调用看看会
不会出错。
我一直不敢使用DELPHI来编写DLL文件。
 
S

SS2000

Unregistered / Unconfirmed
GUEST, unregistred user!
>>会发生编译错误,我用的是Delphi6
不会吧,你怎么写的?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
636
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部