直接通过地址调用API

先声明一个指向调用函数的变量,如下 :
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这个函数指针(有类型指针)

你可能感兴趣的:(api)