也许是异想天开,大伙看看,如何用integer传递一个函数地址? (200分)

  • 主题发起人 主题发起人 迷糊
  • 开始时间 开始时间

迷糊

Unregistered / Unconfirmed
GUEST, unregistred user!
可以把一个普通变量的地址强制转换成integer传递,大家看下面的代码:
procedure TForm1.Button1Click(Sender: TObject);
var
pint,ps:^integer;
c:integer;
begin
new(pint);
pint^:=100;
c:=integer(pint);
integer(ps):=c;
showmessage(inttostr(ps^));
dispose(pint)
end;
但是现在我想把一个函数指针强制转换为integer传递却不行?代码如下
type
myfunc=function(a,b:integer):integer;
function add(a,b:integer):integer;stdcall;
begin
result:=a+b;
end;

function TForm1.docalc(a, b, func: integer): integer;
var
pfunc:^myfunc;
begin
integer(pfunc):=func;
result:=pfunc^(a,b)
//这一步报内存访问错误
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
showmessage(inttostr(docalc(5,10,integer(@add))));
end;

我的目的是在一个com组件中回调外部的一个方法,我想把外部方法的地址转换成integer传入(注:我不想用com的自定义类型传递),也许是异想天开吧,不知有没有可行性
 
我没细心看,但外部的一个方法,是进程外的吗?
COM中,进程和进程之间,同一进程的不同线程之间传递接口,是要Marshal才能正确调用的。
 
type
myfunc=function(a,b:integer):integer
stdcall;
function add(a,b:integer):integer;stdcall;
begin
result:=a+b;
end;

function TForm1.docalc(a, b, func: integer): integer;
var
f: myfunc;
begin
@f := Pointer(func);
Result := f(a, b);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
showmessage(inttostr(docalc(5,10,integer(@add))));
end;

这里这样就可以了,不过在COM中怕是不行,GOOD LUCK!
 
to weiwei81123:
谢谢,你的正确,分先记在帐上,一会在放。

我还想问一下,这样传递那么指针的有效性能有没有办法验证?
这是一个进程内的com,我觉得可以,试试先!
 
刚试了一下,我用进程内的com调用是可以的。现在唯一感到有点不满意的就是传入的这个地址是否有效不知怎么判断?感觉没有好的办法。这个贴子晚上结,看看各位大侠有无高见
 
不好意思,晚了两天才放分
 
后退
顶部