我在Delphi7中编写有以下代码:procedure TForm1.Button1Click(Sender: TObject);
var
  hMod:Thandle;
  MyText:function(DC: HDC; X, Y: Integer; Str: PChar; Count: Integer): BOOL; stdcall;
begin
  hMod:=LoadLibrary('C:\Windows\System32\GDI32.dll');
  try
  if hMod<=0 then
    MessageBox(0,'装载DLL失败!','提示',MB_OK or MB_ICONERROR)
  else
    begin
      @MyText:=GetProcAddress(hMod,'TextOut');
      if (@MyText<>nil) then
        MyText(Self.Canvas.Handle,600,300,'HJXLJ',5)
      else
        MessageBox(0,'取函数地址失败!','提示',MB_OK or MB_ICONERROR);
    end;
  finally
  FreeLibrary(hMod);
  end;
end;但在运行时总是显示"取函数地址失败!"。不知是何缘故,请大家给予指点。另外,我使用的操作系统为Windows XP Home Edition(Service Pack2)。

解决方案 »

  1.   

    这样核心的DLL, 是不需要你去动态引入的.
      

  2.   

    win32中没有TextOut,只有TextOutA和TextOutW。
    TextOut只存在于win16中。
      

  3.   

    对于lihuasoft(坐井观天)所说的,常规下确实无需动态引入。但在某些特殊情况下(例如挂接系统API函数)时就可能需要采用这种方法。
      

  4.   

    用Dependency walker查看GDI32.dll函数,正如DelphiGuy所说
    没有textout这个函数.
    有TextoutA,TextOutW
      

  5.   

    感谢DelphiGuy() 的解答,确实在Win32中不存在TextOut函数,将代码中的
      @MyText:=GetProcAddress(hMod,'TextOut');  更换为
      @MyText:=GetProcAddress(hMod,'TextOutA');
    程序即运行正常。
    再次感谢所有关注以及帮助本人解决这个疑惑的所有人士。谢谢!
      

  6.   

    真正在DLL中的函数是TextOutA,和TextOutW,这要看你的系统是多长字节的了,TextOut只是这两个函数编译出的一个名字,所以你要实现API钩子的话,一定要对TextOutA和TextOutW挂钩,祝你成功
      

  7.   

    真正在DLL中的函数是TextOutA,和TextOutW,这要看你的系统是多长字节的了,TextOut只是这两个函数编译出的一个名字,所以你要实现API钩子的话,一定要对TextOutA和TextOutW挂钩,祝你成功