有关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()是起什么功能的 ?
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程序向另一个可执行程序发消息(使用GetForegroundWindow; 找出当前操作系统中活动的第一个窗口)