Cardinal(pChar(ClassName)) 的工作原理问题
function EnumFunc(Handle : HWnd; var PI64 : Int64Rec): Bool; stdcall;
var
_ClassName : array [0..255] of Char;
PID : Cardinal;
begin
Result := True;
PID := 0;
GetWindowThreadProcessId(Handle, @PID);
if PID = PI64.Lo then
begin
GetClassName(Handle, @_ClassName[0], 255);
if StrComp(_ClassName, pChar(PI64.Hi)) = 0 then
begin
PI64.Hi := Handle;
Result := False;
end;
end;
end;
function HwndByClassName(ClassName : String; PID : Integer = 0) : HWND;
var
PI64 : Int64Rec;
begin
if PID = 0 then
PI64.Lo := GetCurrentProcessID
else
PI64.Lo := PID;
PI64.Hi := Integer(pChar(ClassName));
EnumWindows(@EnumFunc, Integer(@PI64));
if PI64.Hi = Cardinal(pChar(ClassName)) then
Result := 0
else
Result := PI64.Hi;
end;
首先确定上面的代码是正确,且可以正常运行;其中红色标注部分另我十分迷惑,请求大家帮忙看看。
自己写了段相比较的代码
function HwndByClassName1(ClassName : String; PID : Integer = 0) : HWND;
var
PI64, PI642 : Int64Rec;
begin
if PID = 0 then
PI64.Lo := GetCurrentProcessID
else
PI64.Lo := PID;
PI64.Hi := Cardinal(pChar(ClassName));
PI642.Hi := Integer(pChar(ClassName));
EnumWindows(@EnumFunc, Integer(@PI64));
PI642.Hi := Cardinal(pChar(ClassName));
if PI642.Hi = Cardinal(pChar(ClassName)) then //PI64.Hi与PI642.Hi不相同;
Result := 0
else
Result := PI64.Hi;
end;
请问Cardinal(pChar(ClassName))的工作原理是什么;
相关推荐
delphi程序只运行一次
delphi编写的让程序只运行一次的代码。希望喜欢
CheckMem.pas
关键字: 内存泄漏 checkMem.pas 摘要: 这是一篇介绍如何使用CheckMem.pas单元检查delphi应用程序内存泄漏的文章 作者:999roseto347(fdaf at 163 dot com) 版本:V1.0 创建日期:2004-06-11 目录: 一、使用步骤 二、报告解读 三、测试例子 四、内存泄漏测试及修复的技巧 附:CheckMem.pas单元 一、使用步骤: A)、将CheckMem.pas单元加入到工程中 B)、修改工程文件,将'CheckMem.pas'放到uses下的第一句 program Project1; uses CheckMem in 'CheckMem.pas', Forms, Unit1 in 'Unit1.pas' {Form1} ;//其他单元文件 {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. C)、正常的编译、运行应用程序 D)、退出应用程序后,将在应用程序目录下生成报告(如果有漏洞的话,如果没有则不生成)。 二、报告解读: 报告的内容: ===== Project1.exe,2004-6-11 15:36:55 ===== 可用地址空间 : 1024 KB(1048576 Byte) 未提交部分 : 1008 KB(1032192 Byte) 已提交部分 : 16 KB(16384 Byte) 空闲部分 : 13 KB(14020 Byte) 已分配部分 : 1 KB(2024 Byte) 全部小空闲内存块 : 0 KB(232 Byte) 全部大空闲内存块 : 11 KB(11864 Byte) 其它未用内存块 : 1 KB(1924 Byte) 内存管理器消耗 : 0 KB(340 Byte) 地址空间载入 : 0% 当前出现 3 处内存漏洞 : 0) 0000000000F33798 - 19($0013)字节 - 不是对象 1) 0000000000F337A8 - 18($0012)字节 - 不是对象 2) 0000000000F337B8 - 18($0012)字节 - 不是对象 解读如下: 当前出现 3 处内存漏洞 :(有三个内存块分配了,但未释放。注意这里不是指对象变量或指针变量的地址,是对象的内存区域或指针指向的内存地址) 序号 未释放内存的地址 内存大小 是否是对象?如果是列出对象的Name及class并指出对象实现的单元文件名 0) 0000000000F33798 - 19($0013)字节 - 不是对象 三、测试例子: 测试用的代码: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } aa:TstringList; bb:tbutton; end; var Form1: TForm1; def:pointer; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin aa:=TstringList.Create; bb:=Tbutton.Create(nil); aa.Add('abcdefdafasdfasdfasdfasdf'); application.MessageBox(pchar(aa.Strings[0]),'asdf',MB_OK); // aa.Free; end; procedure TForm1.Button2Click(Sender: TObject); var p:Pointer; begin GetMem(def,10); p:=def; fillchar(p,10,$65); application.MessageBox (def,'aaa',MB_OK); // freemem(def,10); end; end. 我们先点击button1,然后退出。出现的报告如下: 当前出现 10 处内存漏洞 : 0) 0000000000F3109C - 67($0043)字节 - 不是对象 1) 0000000000F316A4 - 39($0027)字节 - 不是对象 2) 0000000000F33798 - 55($0037)字节 - (未命名): TStringList (48 字节) - In Classes.pas 3) 0000000000F337CC - 518($0206)字节 - : TButton (512 字节) - In StdCtrls.pas 4) 0000000000F339D0 - 42($002A)字节 - MS Sans Serif : TFont (36 字节) - In Graphics.pas 5) 0000000000F339F8 - 38($0026)字节 - (未命名): TSizeConstraints (32 字节) - In Controls.pas 6) 0000000000F33A1C - 30($001E)字节 - (未命名): TBrush (24 字节) - In Graphics.pas 7) 0000000000F33A38 - 38($0026)字节 - 不是对象 8) 0000000000F33A5C - 38($0026)字节 - 不是对象 9) 0000000000F33A80 - 42($002A)字节 - 不是对象 把bb:=Tbutton.Create(nil);注释掉://bb:=Tbutton.Create(nil);再重新编译,然后运行,再点button1。出现的报告如下: 当前出现 3 处内存漏洞 : 0) 0000000000F33798 - 55($0037)字节 - (未命名): TStringList (48 字节) - In Classes.pas 1) 0000000000F337CC - 38($0026)字节 - 不是对象 2) 0000000000F337F0 - 42($002A)字节 - 不是对象 说明了:一个对象未释放,将引起多处内存泄漏(因为一个对象可能包含多个子对象) OK,我们再来测试button2(注意,这次我们不点击button1,只点击button2 一次),产生的报告如下: 当前出现 1 处内存漏洞 : 0) 0000000000F33798 - 19($0013)字节 - 不是对象 再来一次,这次点击button2 三次: 当前出现 3 处内存漏洞 : 0) 0000000000F33798 - 19($0013)字节 - 不是对象 1) 0000000000F337A8 - 18($0012)字节 - 不是对象 2) 0000000000F337B8 - 18($0012)字节 - 不是对象 这说明:对于每一个未释放的内存,CheckMem都将记录下来!再注意上面的未释放内存的地址是紧挨着的,因此如果看到这样的报告,可以猜想为一变量,多次分配,但未释放! 四、内存泄漏测试及修复的技巧:(翻译自MemProof帮助的部分内容,翻译得不好,请大家来信指导) The following are a couple of tips that can be usefull when fixing leaks in an application : 下面的这些技巧对于修复应用程序的内存泄漏非常有用: * First just launch the app and then close it. If even this action generates leaks, fix those leaks first. Only after the main leaks are fixed, you should go into specific functionality areas of the application. *首先,运行应用程序然后马上退出。如果这样操作也产生内存泄漏,先修复这些漏洞。只有先修复这些主要的泄漏,你才能进行特定功能的测试。 * In your Delphi/C++Builder project options, remove as much forms as possible from the Auto-Create option. Create your forms dynamically. *在你的delphi/C++Builder工程选项中,尽可能地不要使用自动创建窗体,你需要时再动态创建。 * 注意在循环中创建或分配的内存的代码。如果它们未释放,可能引起大量的内存泄漏。 * Go for the biggest classes first - if you see a TMyFom <class> leaking, try to fix this one first instead of going after a tiny TFont class. Since a Form will usually contain a lot of other classes, with one shot you will have fixed a lot of contained leaks. *先修复大的类,比如你看到TMyFom 类有泄漏,先解决它的问题,然后再解决像TFont 这样的小类。一个form类经常包含多个子类。修复一个form的未释放问题,你将解决大量该form包含的子对象未释的问题。 * Go for the easy fixes first. Some leaks fixes are very easy and obvious - if you fix the easy ones first, you will keep them out of your way. *首先修复容易修复的漏洞。一些泄漏是非常容易被发现的,如果你先修复他们,你就不用老想着他们了。 附:CheckMem.pas单元 unit CheckMem; file://Add it to the first line of project uses interface procedure SnapCurrMemStatToFile(Filename: string); implementation uses Windows, SysUtils, TypInfo; const MaxCount = High(Word); var OldMemMgr: TMemoryManager; ObjList: array[0..MaxCount] of Pointer; FreeInList: Integer = 0; GetMemCount: Integer = 0; FreeMemCount: Integer = 0; ReallocMemCount: Integer = 0; procedure AddToList(P: Pointer); begin if FreeInList > High(ObjList) then begin MessageBox(0, '内存管理监视器指针列表溢出,请增大列表项数!', '内存管理监视器', mb_ok); Exit; end; ObjList[FreeInList] := P; Inc(FreeInList); end; procedure RemoveFromList(P: Pointer); var I: Integer; begin for I := 0 to FreeInList - 1 do if ObjList[I] = P then begin Dec(FreeInList); Move(ObjList[I + 1], ObjList[I], (FreeInList - I) * SizeOf(Pointer)); Exit; end; end; procedure SnapCurrMemStatToFile(Filename: string); const FIELD_WIDTH = 20; var OutFile: TextFile; I, CurrFree, BlockSize: Integer; HeapStatus: THeapStatus; Item: TObject; ptd: PTypeData; ppi: PPropInfo; procedure Output(Text: string; Value: integer); begin Writeln(OutFile, Text: FIELD_WIDTH, Value div 1024, ' KB(', Value, ' Byte)'); end; begin AssignFile(OutFile, Filename); try if FileExists(Filename) then begin Append(OutFile); Writeln(OutFile); end else Rewrite(OutFile); CurrFree := FreeInList; HeapStatus := GetHeapStatus; { 局部堆状态 } with HeapStatus do begin Writeln(OutFile, '===== ', ExtractFileName(ParamStr(0)), ',', DateTimeToStr(Now), ' ====='); Writeln(OutFile); Output('可用地址空间 : ', TotalAddrSpace); Output('未提交部分 : ', TotalUncommitted); Output('已提交部分 : ', TotalCommitted); Output('空闲部分 : ', TotalFree); Output('已分配部分 : ', TotalAllocated); Output('全部小空闲内存块 : ', FreeSmall); Output('全部大空闲内存块 : ', FreeBig); Output('其它未用内存块 : ', Unused); Output('内存管理器消耗 : ', Overhead); Writeln(OutFile, '地址空间载入 : ': FIELD_WIDTH, TotalAllocated div (TotalAddrSpace div 100), '%'); end; Writeln(OutFile); Writeln(OutFile, Format('当前出现 %d 处内存漏洞 :', [GetMemCount - FreeMemCount])); for I := 0 to CurrFree - 1 do begin Write(OutFile, I: 4, ') ', IntToHex(Cardinal(ObjList[I]), 16), ' - '); BlockSize := PDWORD(DWORD(ObjList[I]) - 4)^; Write(OutFile, BlockSize: 4, '($' + IntToHex(BlockSize, 4) + ')字节', ' - '); try Item := TObject(ObjList[I]); if PTypeInfo(Item.ClassInfo).Kind <> tkClass then { type info technique } write(OutFile, '不是对象') else begin ptd := GetTypeData(PTypeInfo(Item.ClassInfo)); ppi := GetPropInfo(PTypeInfo(Item.ClassInfo), 'Name'); { 如果是TComponent } if ppi <> nil then begin write(OutFile, GetStrProp(Item, ppi)); write(OutFile, ' : '); end else write(OutFile, '(未命名): '); Write(OutFile, Item.ClassName, ' (', ptd.ClassType.InstanceSize, ' 字节) - In ', ptd.UnitName, '.pas'); end except on Exception do write(OutFile, '不是对象'); end; writeln(OutFile); end; finally CloseFile(OutFile); end; end; function NewGetMem(Size: Integer): Pointer; begin Inc(GetMemCount); Result := OldMemMgr.GetMem(Size); AddToList(Result); end; function NewFreeMem(P: Pointer): Integer; begin Inc(FreeMemCount); Result := OldMemMgr.FreeMem(P); RemoveFromList(P); end; function NewReallocMem(P: Pointer; Size: Integer): Pointer; begin Inc(ReallocMemCount); Result := OldMemMgr.ReallocMem(P, Size); RemoveFromList(P); AddToList(Result); end; const NewMemMgr: TMemoryManager = ( GetMem: NewGetMem; FreeMem: NewFreeMem; ReallocMem: NewReallocMem); initialization GetMemoryManager(OldMemMgr); SetMemoryManager(NewMemMgr); finalization SetMemoryManager(OldMemMgr); if (GetMemCount - FreeMemCount) <> 0 then SnapCurrMemStatToFile(ExtractFileDir(ParamStr(0)) + '\CheckMemory.Log');
Springboot大学生校园创业系统(代码+数据库+LW)
摘 要 目前高校创业服务存在“信息分散、资源难寻、管理低效”三大痛点,大学生难以在同一平台完成课程学习、项目孵化与融资对接。针对上述问题,本文提出并实现了“基于SpringBoot的大学生校园创业系统”:前端以Vue构建,实现课程和项目可视化、收藏、论坛等轻量级交互,解决学生“找课难、找项目难”的资源获取问题;后端基于SpringBoot+MySQL,进行统一封装用户、课程、项目、融资、评论五类业务,配合事务与索引优化,解决大学生创业过程中 “信息分散、资源难寻、管理低效” 等痛点,为高校创新创业教育和项目孵化提供实践支撑,推动校园创业生态的规范化与可持续发展。 关键词:大学生创业;SpringBoot;项目孵化;融资对接
基于粒子群算法的永磁同步电机多参数辨识研究(Simulink仿真实现)
内容概要:本文围绕基于粒子群算法(PSO)的永磁同步电机(PMSM)多参数辨识展开研究,旨在通过Simulink仿真平台实现对电机关键电气与机械参数的精确辨识。研究首先建立永磁同步电机的数学模型,结合实际运行中的电压、电流、转速等可观测信号,构建适用于粒子群优化算法的目标函数,利用PSO算法强大的全局搜索能力,对电机的定子电阻、电感、反电动势常数、转动惯量、摩擦系数等多参数进行联合辨识。通过Simulink搭建完整的系统仿真模型,模拟电机在不同工况下的运行状态,采集仿真数据用于参数辨识,最终将辨识出的参数代回模型进行验证,以评估辨识精度与算法的有效性。该方法为永磁同步电机的高性能控制提供了精确的参数基础,避免了传统手工测量或经验估算带来的误差。 适合人群:具备一定电机控制理论基础、熟悉MATLAB/Simulink环境的电气工程、自动化及相关专业的研究生、科研人员及工程技术人员。 使用场景及目标:① 实现永磁同步电机关键参数的非侵入式、高精度辨识;② 掌握智能优化算法(特别是粒子群算法)在电机系统辨识中的具体应用方法;③ 学习如何构建基于仿真的电机参数辨识实验平台,为后续的控制器设计(如FOC矢量控制)提供可靠参数支持。 阅读建议:在学习过程中,应重点关注Simulink模型的搭建逻辑、目标函数的设计原理以及PSO算法的参数设置对辨识结果的影响。建议读者动手复现文中仿真模型,通过调整算法参数和运行条件,深入理解辨识过程的收敛性和鲁棒性。
vue+springboot基于 Java Web 的流浪动物收养系统设计与开发_a93n86d6毕业设计源码数据库.zip
vue+springboot基于 Java Web 的流浪动物收养系统设计与开发_a93n86d6毕业设计源码数据库.zip


语言基础/算法/系统设计
