有关delphi中THandle的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有关delphi中THandle的问题相关的知识,希望对你有一定的参考价值。

源代码

procedure TfrmMain.SendCompass(Value : Double);
var
ds:TCopyDataStruct;
hd:THandle; ************************* 1
S: string;
begin
S := FloatToStr(Value);
ds.cbData:=length(S)+1;
GetMem(ds.lpData,ds.cbData);
StrCopy(ds.lpData,PChar(S));
hd:=FindWindow(nil,'Compass'); *********************************2
if hd<>0 then*********************************3
SendMessage(hd,WM_COPYDATA,frmMain.Handle,Cardinal(@ds));
FreeMem(ds.lpData);

该程序中1处 THandle 是什么类型 3处 为什么可以对他进行是否为0的条件判断?
如果是判定FindWindow(nil,'Compass')>0 又是什么意思?

findwindow()是起什么功能的 ?

handle它就是个长整型,可以跟integer比较一下,
FindWindow(nil,'Compass')>0 说明能找到这个窗口的句柄,找不到则返回空/0,

FindWindow只是查找窗口,但是找到的窗口并不一定是当前窗口。

一个窗口有2个部分组成,1个是窗口的类名,一个是窗口的窗口名称。通常情况下,我们自己做的窗口类名和窗口名称都是知道的,因为是自己给它们加上去的。但对于模板窗口,我们一般是不知道它的类名的,但它的窗口名称是可以知道的,就是显示在标题栏中的标题,就是它的窗口名称。
当有2个窗口在桌面上时,一个窗口有个编辑框,而另一个没有编辑框。当我们想要用那个有编辑框的窗口时,必须先得到那个窗口的句柄,FindWindow就是帮助我们取得这个窗口句柄。
我们可以任意指定FindWindow中两个参数的其中一个,或同时2个都指定来找到那个带有编辑框的窗口,然后FindWindow就会返回这个窗口的句柄(hwnd)。
窗口类名好比人的小名,窗口标题名称好比是人的大名。
我们一般知道一个人的大名,但不太清楚他的小名如对话框的类名#32776。FindWindow给了我们两个参数,以便我们在不知道一个人小名的情况下,可以通过大名来找到该人。
参考技术A 个人认为THandle可以理解为DWord,也就是非负数的整数类型。

FindWindow(nil,'Compass')>0;//查找无类型,标题(Caption)为Compass的窗口,大于零说明该窗口存在,如果等于说明该窗口不存在
参考技术B THandle = Cardinal;
四字节无符号整型。
FindWindow返回值为0的意义,你去查对应的api函数说明。

delphi获取dll的函数列表

找了几个,终于找到一个好用的

function GetDLLFileExports(

  szFileName: PChar;
  mStrings: TStrings
): Boolean;
var
  hFile: THANDLE;
  hFileMapping: THANDLE;
  lpFileBase: Pointer;
  pImg_DOS_Header: PImageDosHeader;
  pImg_NT_Header: PImageNtHeaders;
  pImg_Export_Dir: PImageExportDirectory;
  ppdwNames: ^PDWORD;
  szFunc: PChar;
  i: Integer;
begin
  Result := False;
  if not Assigned(mStrings) then Exit;
  hFile := CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if(hFile = INVALID_HANDLE_VALUE) then Exit;
  hFileMapping := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil);
  if hFileMapping = 0 then
  begin
    CloseHandle(hFile);
    Exit;
  end;

  lpFileBase := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
  if lpFileBase = nil then
  begin
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
    Exit;
  end;

  pImg_DOS_Header := PImageDosHeader(lpFileBase);
  pImg_NT_Header := PImageNtHeaders(
    Integer(pImg_DOS_Header) + Integer(pImg_DOS_Header._lfanew));

  if IsBadReadPtr(pImg_NT_Header, SizeOf(IMAGE_NT_HEADERS)) or
    (pImg_NT_Header.Signature <> IMAGE_NT_SIGNATURE) then
  begin
    UnmapViewOfFile(lpFileBase);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
    Exit;
  end;

  pImg_Export_Dir := PImageExportDirectory(
    pImg_NT_Header.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].
      VirtualAddress);
  if not Assigned(pImg_Export_Dir) then
  begin
    UnmapViewOfFile(lpFileBase);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
    Exit;
  end;
  // 63 63 72 75 6E 2E 63 6F 6D
  pImg_Export_Dir := PImageExportDirectory(
    ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header, DWORD(pImg_Export_Dir),
    PImageSectionHeader(Pointer(nil)^)));

  ppdwNames := Pointer(pImg_Export_Dir.AddressOfNames);

  ppdwNames := Pointer(ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header,
    DWORD(ppdwNames), PImageSectionHeader(Pointer(nil)^)));
  if not Assigned(ppdwNames) then
  begin
    UnmapViewOfFile(lpFileBase);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
    Exit;
  end;

  for i := 0 to pImg_Export_Dir.NumberOfNames - 1 do
  begin
    szFunc := PChar(ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header,
      DWORD(ppdwNames^), PImageSectionHeader(Pointer(nil)^)));
    mStrings.Add(szFunc);
    Inc(ppdwNames);
  end;
  UnmapViewOfFile(lpFileBase);
  CloseHandle(hFileMapping);
  CloseHandle(hFile);
  Result := True;

end;

 

//调用示例

procedure TF_Main.btnTestClick(Sender: TObject);
begin
  GetDLLFileExports(‘F:\光盘刻录\Reclib\librtmp.dll‘, Memo1.Lines);
end;

 

http://blog.csdn.net/youthon/article/details/7666727

以上是关于有关delphi中THandle的问题的主要内容,如果未能解决你的问题,请参考以下文章

delphi获取dll的函数列表

delphi 2010 编译乱码问题

delphi 换版本乱码 问题

如何正确检索电池序列号?

delphi程序向另一个可执行程序发消息(使用GetForegroundWindow; 找出当前操作系统中活动的第一个窗口)

delphi 编程