CnPack Forum


 
Subject: Pascal Script for Delphi里面的 ___Pointer 类型怎么用?
please_air
灌水科科长
Rank: 3Rank: 3



UID 23669
Digest Posts 0
Credits 108
Posts 41
点点分 108
Reading Access 10
Registered 2007-8-21
Status Offline
Post at 2008-10-2 00:18  Profile | Blog | P.M. 
Pascal Script for Delphi里面的 ___Pointer 类型怎么用?

我在 Pascal Script for Delphi 脚本里面调用 win api

但是 api 函数要求把  record 用  指针传入 ,  不知道怎么办~

procedure CopyMemory(pDest: LongInt; pSrc: ___Pointer; ByteLen: LongInt); external [email=]'RtlMoveMemory@kernel32[/email] stdcall';


var
  KInput : TKeybdInput;
  p  : ___Pointer
begin
  p := ___Pointer(KInput )  ;                                               
  CopyMemory( GInput[0].xi[0],  KInput,  sizeof(KInput) );
end.

{
上面两个地方都报  Null Pointer 的错误
}
Top
please_air
灌水科科长
Rank: 3Rank: 3



UID 23669
Digest Posts 0
Credits 108
Posts 41
点点分 108
Reading Access 10
Registered 2007-8-21
Status Offline
Post at 2008-10-2 16:56  Profile | Blog | P.M. 
老大些再哪儿~~~
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6804
Posts 3577
点点分 6804
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-10-7 12:17  Profile | Blog | P.M. 
是编译错误还是运行错误?错误信息是啥?
Top
please_air
灌水科科长
Rank: 3Rank: 3



UID 23669
Digest Posts 0
Credits 108
Posts 41
点点分 108
Reading Access 10
Registered 2007-8-21
Status Offline
Post at 2008-10-8 18:15  Profile | Blog | P.M. 
错误信息 就是 提示  Null Pointer 的异常
Top
please_air
灌水科科长
Rank: 3Rank: 3



UID 23669
Digest Posts 0
Credits 108
Posts 41
点点分 108
Reading Access 10
Registered 2007-8-21
Status Offline
Post at 2008-10-8 18:17  Profile | Blog | P.M. 
program Script1;

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

procedure CopyMemory(pDest: LongInt; pSrc: ___Pointer; ByteLen: LongInt); external 'RtlMoveMemory@kernel32 stdcall';

var p : ___Pointer;

begin
  p := 0;
end.



正在编译...
编译成功
Null Pointer Exception 于 0.6
Top
please_air
灌水科科长
Rank: 3Rank: 3



UID 23669
Digest Posts 0
Credits 108
Posts 41
点点分 108
Reading Access 10
Registered 2007-8-21
Status Offline
Post at 2008-10-11 11:03  Profile | Blog | P.M. 
?
Top
please_air
灌水科科长
Rank: 3Rank: 3



UID 23669
Digest Posts 0
Credits 108
Posts 41
点点分 108
Reading Access 10
Registered 2007-8-21
Status Offline
Post at 2008-10-13 09:59  Profile | Blog | P.M. 
几天了, 老大们, 都没来过吗?
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6804
Posts 3577
点点分 6804
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-10-15 17:34  Profile | Blog | P.M. 
来过,但不知道。
Top
zjy
管理员
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
Post at 2008-10-16 12:09  Profile | Site | Blog | P.M. 
PS脚本对指针的支持不太好

PS引擎一般情况下是不支持直接使用指针的,PS内部好象对指针类型的变量提供生存期管理,具体的机制我们也没研究过。
虽然PS提供了___Pointer类型,但不推荐使用。CnWizards的引擎重定义Pointer为Cardinal类型,并提供_GetXXX()和_SetXXX几个函数来操作。




Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Top
please_air
灌水科科长
Rank: 3Rank: 3



UID 23669
Digest Posts 0
Credits 108
Posts 41
点点分 108
Reading Access 10
Registered 2007-8-21
Status Offline
Post at 2008-10-16 13:37  Profile | Blog | P.M. 
如果  win api 中 涉及到  recode 的指针怎么办 呢?

我没法 转换成 指针类型呀

[ 本帖最后由 please_air 于 2008-10-16 13:39 编辑 ]
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6804
Posts 3577
点点分 6804
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-10-16 14:13  Profile | Blog | P.M. 
这个好像是没办法的。

Windows中能导入的函数几乎没支持指针的,说明指针的使用有限制。
Top
zjy
管理员
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
Post at 2008-10-16 14:57  Profile | Site | Blog | P.M. 
如果传指针的话

可以声明为 const 或 var record 类型,调用的时候直接传结构变量,结构参数实际上传的就是指针。




Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Top
please_air
灌水科科长
Rank: 3Rank: 3



UID 23669
Digest Posts 0
Credits 108
Posts 41
点点分 108
Reading Access 10
Registered 2007-8-21
Status Offline
Post at 2008-10-16 21:37  Profile | Blog | P.M. 


QUOTE:
可以声明为 const 或 var record 类型,调用的时候直接传结构变量,结构参数实际上传的就是指针。

老大说说 这个 过程怎么 定义呢

//delphi  里面
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);

如果我内存拷贝的是 两个 record 类型   , 那么我 Pointer 怎么替换??


---------------------------------------------------------------------------------------------
我试图用 两个 record 类型去 替换 , 比如

procedure CopyMemory(var pDest : R1; var pSrc: R2; ByteLen: LongInt); external 'RtlMoveMemory@kernel32 stdcall';

但是
var
rr1 : R1;
rr2 : R2;
begin
CopyMemory(rr1, rr2, sizeof(r2) );  //rr1, rr2
end.

报错:  Type mismatch

[ 本帖最后由 please_air 于 2008-10-16 21:48 编辑 ]
Top
zjy
管理员
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
Post at 2008-10-17 10:10  Profile | Site | Blog | P.M. 
这个 Type mismatch 错误是 SizeOf 报出来的,如果不用 SizeOf 的话是可以正常编译和执行的。

SizeOf 的问题有些奇怪,PS引擎是做过处理的,但在脚本中好象不管传什么类型都报错,有空我再查查。




Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Top
please_air
灌水科科长
Rank: 3Rank: 3



UID 23669
Digest Posts 0
Credits 108
Posts 41
点点分 108
Reading Access 10
Registered 2007-8-21
Status Offline
Post at 2008-10-17 11:30  Profile | Blog | P.M. 


QUOTE:
原帖由 zjy 于 2008-10-17 10:10 发表
这个 Type mismatch 错误是 SizeOf 报出来的,如果不用 SizeOf 的话是可以正常编译和执行的。

SizeOf 的问题有些奇怪,PS引擎是做过处理的,但在脚本中好象不管传什么类型都报错,有空我再查查。 ...

看了 , 老大的回复, 恍然大悟哦

我还一直以为是  record 上, 类型不对


-------------------------------------------------------------------------------
还有:

像这个api中的 R1, R2 类型, 能不能有个通用类型呢?  不然我每次变换类型, 都要重新 改动 api 原型



感叹一句:
  要是我能读懂脚本编译器源码  就好了!

[ 本帖最后由 please_air 于 2008-10-17 11:39 编辑 ]
Top
zjy
管理员
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
Post at 2008-10-18 09:54  Profile | Site | Blog | P.M. 
这个问题以前我也考虑过

是打算注册一个诸如 _ToPointer() 这样的内部函数,用来将记录、对象等复杂类型直接转成通用的指针类型,这样就可以满足你的需求了。不过PS引擎的代码比较复杂,好长时间没研究了,你要有兴趣慢慢啃吧




Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Top
please_air
灌水科科长
Rank: 3Rank: 3



UID 23669
Digest Posts 0
Credits 108
Posts 41
点点分 108
Reading Access 10
Registered 2007-8-21
Status Offline
Post at 2008-10-18 10:10  Profile | Blog | P.M. 
_ToPointer()   ---> 那么参数 和返回值类型 怎么办法了~~ ___Pointer 类型 在 脚本里面又没法用



sizeof(( 结构变量 )  

如果是 record变量就是对的  , 不能 sizeof( 类型 )

[ 本帖最后由 please_air 于 2008-10-18 10:11 编辑 ]
Top
 




All times are GMT++8, the time now is 2024-9-17 03:44

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.008422 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP