Board logo

Subject: Pascal Script for Delphi里面的 ___Pointer 类型怎么用? [Print This Page]

Author: please_air    Time: 2008-10-2 00:18     Subject: 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 的错误
}
Author: please_air    Time: 2008-10-2 16:56

老大些再哪儿~~~
Author: Passion    Time: 2008-10-7 12:17

是编译错误还是运行错误?错误信息是啥?
Author: please_air    Time: 2008-10-8 18:15

错误信息 就是 提示  Null Pointer 的异常
Author: please_air    Time: 2008-10-8 18:17

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
Author: please_air    Time: 2008-10-11 11:03

?
Author: please_air    Time: 2008-10-13 09:59

几天了, 老大们, 都没来过吗?
Author: Passion    Time: 2008-10-15 17:34

来过,但不知道。
Author: zjy    Time: 2008-10-16 12:09     Subject: PS脚本对指针的支持不太好

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

如果  win api 中 涉及到  recode 的指针怎么办 呢?

我没法 转换成 指针类型呀

[ 本帖最后由 please_air 于 2008-10-16 13:39 编辑 ]
Author: Passion    Time: 2008-10-16 14:13

这个好像是没办法的。

Windows中能导入的函数几乎没支持指针的,说明指针的使用有限制。
Author: zjy    Time: 2008-10-16 14:57     Subject: 如果传指针的话

可以声明为 const 或 var record 类型,调用的时候直接传结构变量,结构参数实际上传的就是指针。
Author: please_air    Time: 2008-10-16 21:37



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 编辑 ]
Author: zjy    Time: 2008-10-17 10:10

这个 Type mismatch 错误是 SizeOf 报出来的,如果不用 SizeOf 的话是可以正常编译和执行的。

SizeOf 的问题有些奇怪,PS引擎是做过处理的,但在脚本中好象不管传什么类型都报错,有空我再查查。
Author: please_air    Time: 2008-10-17 11:30



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 编辑 ]
Author: zjy    Time: 2008-10-18 09:54     Subject: 这个问题以前我也考虑过

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

_ToPointer()   ---> 那么参数 和返回值类型 怎么办法了~~ ___Pointer 类型 在 脚本里面又没法用



sizeof(( 结构变量 )  

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

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




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0