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
可以声明为 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
原帖由 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 |