关于指针申明的问题--在线等待(100分)

Z

zneil

Unregistered / Unconfirmed
GUEST, unregistred user!
有一ocx,传入参数需要 long far 指针,并该参数的实际值为超过1800个字符长。
请问delphi里该如何定义该指针,如果使该指针指向1800个字符长的string?
我的定义及指向如下
type
arr=array[0..511] of Integer;
p=^arr;
var
myp:p;
lcode:ansistring;
begin
lcode:=edit1.text
//超过1800个字符,不定长
new(myp);
move(lcode,myp^[0],sizeof(lcode]));
ocx1.function(myp^[0]) //ocx函数传入
.....
dispose(myp);
.....
end;
//我的问题出在哪里了?我该如何解决此问题啊??
 
这一行有问题:
move(lcode,myp^[0],sizeof(lcode]));
SizeOf的用法有问题。

其实没必要这么复杂吧?
var
Arr: Array[1..512] of Integer
begin
Ocx1.function(@Arr)

这样不行吗?
 
不用用指针吧,用变参 var YourStr: widestring
就行了.
 
to gztomash
lcode是有值的 ,1800个字符,而arr呢?你的arr值如何赋?
to xeen
问题关键时如何让 myp 指向 lcode.
 
SizeOf(String) = 4!
 
你把那个ocx的typelib单元该函数声明的原型给大家看看.
 
谢谢 gztomash
但请注意我的问题。
“有一ocx,传入参数需要 long far 指针”
而实际程序中,是从数据库内得到1800个字符的串,然后让integer类型的指针指向这个串。
然后将此指针作为参数给ocx.
现在这个问题出现后,我的ocx一直运行报参数错误。唉。。。
着急得等待正解当中。。
 
{标准申明说明如下
BOOL ESetData(
long dwMNumber ,
long dwENumber ,
long dwEMNumber ,
long dwBNumber ,
long dwMPrivilege ,
long FAR* dwEData ,
long dwPassWord)
注:dwEdata 为指向buffer的long型指针。该值大小为512字节}
转成delphi的申明为:
function TFPKp.ESetData(dwMNumber: Integer
dwENumber: Integer

dwEMNumber: Integer
dwBNumber: Integer

dwMPrivilege: Integer
var dwEData: Integer

dwPassWord: Integer): WordBool;
 
...

var
Data: Array[1..128] of Integer
// 只需要512字节,好像这样就够了
begin
ESetData(1,1,1,1,Data[1],1);
 
呵呵,先暂且不管是128,还是512.
问你,data[1]值如何来?
 
我个人认为此种声明形式下的dwEData是用来返回运算结果的!
当然,也许这是个特例。
不过问题挺严重的,把字符放进整型数组?!
还是有办法实现的。

var
X: Array[1..128] of Integer;
P: Pointer;
Q: PChar;
begin
FillChar(X, SizeOf(X), 0)

P := @X;
Q := PChar(P);
StrPCopy(Q, 'somthing');

谁设计成这个样子的,帮我狠打他屁股!呵呵!
 
我说清楚吧。
这个函数是将指纹信息存入硬设备用的。此函数也有个相对应的get函数,是取指纹信息的。
而指纹信息是一个512字节的串。
我必须做的事情是,用get函数去备份指纹数据。在必要的时候,
用set函数去还原指纹信息到硬设备里.
在使用同一变量 myp^[0]时,先获取,然后还原,我成功。
而在将串存入数据库之后,再取出来,用move赋到myp里,则一直报参数失败。
你刚才回答的方法我试试,也只能试试了,这个问题困扰了我2天。我要疯啦。。-
 
方法不行,程序出错,地址出错了。。。:(-
 
move(lcode,myp^[0],sizeof(lcode]));
版主的这句是不是有问题?
是不是要使myp指向lcode?那这句好像是这样的:
move(lcode,myp,length(lcode));
或 myp:=p(lcode);

不过由于定义成 arr=array[0..511] of INTEGER;
好像访问myp也得不到lcode的值。如果将INTEGER改为CHAR才可以得到。

指针出错会不会是因为STRING由于是生存期自管理类型,已经释放掉的原因呢?
只不过是猜测而已。。。看不懂楼主定义的具体意思。


 
我哭啊。。。。。。。。
就这样说吧,依照以下结构说明
我有一串,512字节长。我该如何写申明?该如何赋值到函数里去呢?
{ocx原型申明说明如下
BOOL ESetData(long dwMNumber ,long dwENumber , long dwEMNumber ,
long dwBNumber ,
long dwMPrivilege ,
long FAR* dwEData ,
long dwPassWord)
注:dwEdata 为指向buffer的long型指针。该值大小为512字节}
转成delphi的申明为:
function TFPKp.ESetData(dwMNumber: Integer
dwENumber: Integer

dwEMNumber: Integer
dwBNumber: Integer

dwMPrivilege: Integer
var dwEData: Integer

dwPassWord: Integer): WordBool;
 
var
i:Integer;
lcode:ansistring;
begin
lcode:=edit1.text
//超过1800个字符,不定长
i:=Integer(PChar(lcode));
ocx1.function(i) //ocx函数传入
end;
 
回 aizb
控件依旧报参数错误。
用edit2.Text:=ansistring(myp^[0])
可以看到myp返回的值是正确。


别说控件有问题。我将myp定义成公共变量时候,用控件的get读到myp里然后将myp直接使用set函数,则成功。

 
谢谢gztomash,aizb,你们的方法使我得到很大提示。我问题解决。
谢谢其它几位。
 

Similar threads

S
回复
0
查看
956
SUNSTONE的Delphi笔记
S
S
回复
0
查看
779
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
645
import
I
顶部