先声明一个指向调用函数的变量,如下 :
var
MyTextOut:function (DC: HDC; X, Y: Integer; Str: PChar; Count: Integer): BOOL; stdcall;
MyTextOutA:function (DC: HDC; X, Y: Integer; Str: PAnsiChar; Count: Integer): BOOL; stdcall;
MyTextOutW:function (DC: HDC; X, Y: Integer; Str: PWideChar; Count: Integer): BOOL; stdcall;
{
我是通过API地址专家查出下面API函数的载入地址的。这个地址是固定的,由操作系统载入的。是否地址每次都相同呢?
function TextOut(DC: HDC; X, Y: Integer; Str: PChar; Count: Integer): BOOL; stdcall;
地址:$77EFBC0C
function TextOutA(DC: HDC; X, Y: Integer; Str: PAnsiChar; Count: Integer): BOOL; stdcall;
地址:$77EF7EE5
function TextOutW(DC: HDC; X, Y: Integer; Str: PWideChar; Count: Integer): BOOL; stdcall;
}
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
lpMyTextOut:Pointer;//声明一个指针类型,用来指向调用的API函数地址。
str:string;
gd:hdc;
begin
lpMyTextOut:=Pointer(dword($77EFBC0C));//将地址赋予指针
MyTextOut:=lpMyTextOut;//告诉变量你指向的函数TextOutA,存在指针lpMyTextOut指向的那个地址。
str:='我再调用GDI32.DLL的TextOutA';
gd:=GetDC(self.Handle);
MyTextOut(gd,0,0,PAnsiChar(str),length(str));//通过函数变量调用API函数。
ReleaseDC(self.Handle,gd)
end;
//通过这个方法调用函数,不需要动态调用LoadLibrary来取得API,比如在外挂中调用EXE文件中的函数是否有效呢?
//lpMyTextOut是一个无类型指针,可以直接赋值给MyTextOut这个函数指针(有类型指针)