delphi 模仿任务管理器

合集下载

Delphi中控制Word,xml,dll等操作

Delphi中控制Word,xml,dll等操作

Delphi中控制Word,xml,dll等操作DLL的建立与调用[转]动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。

由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可以实现一些一般程序所不能实现的功能,如实现windows的HOOK、ISAPI等。

同时,DLL还为不同语言间代码共享提供了一条方便的途径。

因而DLL在编程时应用较为广泛,本文将介绍如何在Delphi 中建立和使用DLL。

一.DLL 库内存共享机制从使用效果看,DLL和unit 很像,它们都可以被别的工程模块所调用,但二者在内部的实现机制上确存在着差别。

如果一个程序模块中用uses语句引用了某个unit,编译程序在编译该模块时,便会连同unit一起编译,并把编译后的可执行代码链接到本程序模块中,这就是一个程序模块能够调用所引用unit中过程和函数的原因。

当同一个unit被多个工程所引用时,则每个工程中都含有该unit的可执行代码,当含有该unit的多个工程同时执行时,unit的可执行代码会随不同工程而多次被调入内存,造成内存资源的浪费。

DLL则不同,它即使被某个工程调用,编译后仍是独立的。

也就是说编译后,一个DLL库形成一个单独的可执行文件,而不与任何其它的可执行文件连接在一起,因而DLL库并不从属于某个特定的工程,当多个工程调用同一个DLL库时只有第一个工程把DLL库调入内存,其余工程并不重复调入同一个DLL库到内存,而是到同一个共享内存区读取。

并且,DLL的执行代码是在程序运行期间动态调入的,而不是如unit在程序运行时就与整个工程一起调入内存。

这样便可消除unit带来的相同代码多处占用内存的弊病。

二 Delphi中DLL库的建立在Delphi环境中,编写一个DLL同编写一个一般的应用程序并没有太大的区别。

事实上作为DLL主体的DLL函数的编写,除了在内存、资源的管理上有所不同外,并不需要其它特别的手段。

Delphi简易文件管理器

Delphi简易文件管理器

课程考核设计文档(论文)目录1需求分析 (1)1.1Delphi简介 (1)1.2Delphi文件管理器 (2)2概要设计 (2)2.1设计要求 (2)2.2设计根据 (2)2.3 设计优缺点 (2)3相关函数 (3)3.1 RenameFile函数 (3)3.2 DeleteFile函数 (3)3.3 FileExists函数 (3)3.4 FileGetAttr函数 (4)3.5 DirectoryExists函数 (4)3.6 CreateDir函数 (4)3.7 RemoveDir函数 (4)3.8 文件查找相关函数 (4)4设计步骤 (5)4.1 设计流程图 (5)4.2 设计步骤 (6)5运行结果 (15)附录Ⅰ (18)参考文献 (27)1 需求分析1.1Delphi简介Delphi是Borland公司推出的可视化编程环境,它提供了一种方便、快捷的Windows 应用程序开发工具。

它使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了可重复利用的完整的面向对象程序语言(Object-Oriented Language)、当今世界上最快的编辑器、最为领先的数据库技术。

Delphi是优秀的可视化开发工具,不仅简单、易于掌握而且功能强大,使用Delphi开发应用软件,会大大地提高编程效率。

Delphi是Pascal语言有天壤之别。

一个Delphi程序首先是应用程序框架,而这一框架正是应用程序的“骨架”。

在“骨架”上即使没有附着任何东西,仍可以严格的按照设计运行。

用户的工作只是在“骨架”中添入自己的程序。

默认的应用程序是一个空白的窗体“Form”,可以直接运行,结果得到一个空白的窗口,这个窗口具有Windows窗口的全部性质:可以被放大、缩小、移动最大化、最小化等,但没有编写程序代码。

因此,可以说应用程序框架通过提供所有应用程序共有的东西,为用户应用程序的开发打下良好的基础。

delphi关于窗口句柄,进程等操作

delphi关于窗口句柄,进程等操作

delphi关于窗口句柄,进程等操作转帖/ck85124/blog/item/d44ad17e9c1a163e0cd 7da9e.htmluses TLHelp32,PsAPI;(1)显示进程列表:procedure TForm1.Button1Click(Sender: TObject);varProcessName: string;ProcessID: integer;ListLoop: Boolean;FsnapShotHandle: Thandle;FProcessEntry32: TProcessEntry32;beginListBox1.Clear;Fsnapshothandle := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);FProcessEntry32.dwsize := SizeOF(FProcessEntry32);Listloop := Process32First(FSnapshotHandle, FProcessEntry32);while Listloop do beginProcessName := FprocessEntry32.szExeFile;ProcessID := FProcessEntry32.th32ProcessID;// 我写到列表框中了,你可以根据需要自己改listbox1.Items.Add(ProcessNAme+':'+IntToStr(ProcessID));ListLoop := Process32Next(FSnapshotHandle, FprocessEntry32);end;end;(2)杀死某进程:procedure TForm1.Button2Click(Sender: TObject);varlppe: TProcessEntry32;found : boolean;Hand : THandle;P:DWORD;ph: THandle;ExitCode: DWORD;sExeFile,sSelect:string;killed:boolean;begintemp:= ListBox1.Items.strings[ListBox1.itemindex];temp:=copy(temp,pos(':',temp)+1,length(temp));p :=DWORD(StrToInt(temp));if P<>0 thenbeginph:=OpenProcess(PROCESS_TERMINATE,False,P);GetExitCodeProcess(ph, ExitCode);killed := TerminateProcess(ph,ExitCode);if not killed thenmessagebox(self.handle,pchar(sExeFile+'无法杀死!'),'提示',MB_OK or MB_ICONWARNING)elseListBox1.Items.Delete(ListBox1.ItemIndex);end;end;(3)取得某进程EXE路径:procedure TForm1.Button3Click(Sender: TObject);varh:THandle; fileName:string;iLen:integer;hMod:HMODULE;cbNeeded,p:DWORD;begintemp:= ListBox1.Items.strings[ListBox1.itemindex];temp:=copy(temp,pos(':',temp)+1,length(temp));p :=DWORD(StrToInt(temp));h := OpenProcess(PROCESS_ALL_ACCESS, false, p); //p 为进程IDif h > 0 thenbeginif EnumProcessModules( h, @hMod, sizeof(hMod), cbNeeded) thenbeginSetLength(fileName, MAX_PATH);iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PATH);if iLen <> 0 thenbeginSetLength(fileName, StrLen(PCHAR(fileName)));Memo1.Lines.Add(fileName);end;end;CloseHandle(h);end;end;(4)取得窗口列表:procedure TForm1.Button4Click(Sender: TObject);varhCurrentWindow: HWnd;szText: array[0..254] of char;beginListbox1.Clear;//EnumWindows(@EnumWindowsProc, 0); 写了个回调EnumWindowsProc没效果hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);while hCurrentWindow <> 0 dobeginif GetWindowText(hCurrentWindow, @szText, 255) > 0 then listbox1.items.Add(StrPas(@szT ext));hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);end;end;(5)杀死窗口进程:procedure TForm1.Button5Click(Sender: TObject);varH:THandle;P:DWORD;s:string;killed:boolean;begins := ListBox1.Items[ListBox1.ItemIndex];H:=FindWindow(nil,pchar(s));if H<>0 thenbeginGetWindowThreadProcessId(H,@P);if P<>0 thenkilled:=TerminateProcess(OpenProcess(PROCESS_TERMINAT E,False,P),$FFFFFFFF);if not killed thenmessagebox(self.handle,pchar(s+'无法杀死!'),'提示',MB_OK or MB_ICONWARNING)elseListBox1.Items.Delete(ListBox1.ItemIndex);end;end;(6)取得窗口进程路径:procedure TForm1.Button6Click(Sender: TObject);varH:THandle;P,cbNeeded:DWORD;s,fileName:string;iLen:integer;hMod:HMODULE;begins := ListBox1.Items[ListBox1.ItemIndex];H:=FindWindow(nil,pchar(s));if H<>0 thenbeginGetWindowThreadProcessId(H,@P);if P<>0 thenbeginh := OpenProcess(PROCESS_ALL_ACCESS, false, p); //p 为进程IDif h > 0 thenbeginif EnumProcessModules( h, @hMod, sizeof(hMod), cbNeeded) thenbeginSetLength(fileName, MAX_PATH);iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PATH);if iLen <> 0 thenbeginSetLength(fileName, StrLen(PCHAR(fileName)));end;end;CloseHandle(h);end;end;end;Memo1.Lines.Add(fileName);end;(7)文件属性:function CovFileDate(Fd:_FileTime):TDateTime;{ 转换文件的时间格式 }varTct:_SystemTime;Temp:_FileTime;beginFileTimeToLocalFileTime(Fd,Temp);FileTimeToSystemTime(Temp,T ct);CovFileDate:=SystemTimeT oDateTime(Tct);end;procedure TForm1.Button7Click(Sender: TObject);varSR: TSearchRec;V1, V2, V3, V4: integer ;constdtFmt:string = 'YYYY-MM-DD HH:NN:SS';begin// ============== 方法一==================== //if FindFirst(edit1.Text, faAnyFile, SR) = 0 thenbeginMemo1.Lines.Add('文件属性:' + intToStr(SR.Attr) ); //文件属性Memo1.Lines.Add('文件大小:' + intToStr(SR.Size) ); //文件大小Memo1.Lines.Add('创建时间:' + FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftCreationTime )) ); //创建时间Memo1.Lines.Add('最后修改时间:' + FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftLastWriteTim e)) ); //最后修改时间Memo1.Lines.Add('最后访问时间:' + FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftLastAccessTi me)) ); //最后访问时间if SR.Attr and faHidden <> 0 thenFileSetAttr(edit1.Text, SR.Attr-faHidden);FindClose(SR);end;end;procedure TForm1.Button8Click(Sender: TObject);// ============== 方法二==================== //varAttrs: Word;f: file of Byte; // 文件大小必须要定义为" file of byte" ,这样才能取出 bytessize: Longint;//文件属性begin//此方法是打开文件读取字节计算,测试exe的文件必须是未运行状态否则会报io 103错误Attrs:=FileGetAttr(edit1.text);Memo1.Lines.Add('文件属性:' + intToStr(Attrs));//文件大小tryAssignFile(f, edit1.text);Reset(f);size := FileSize(f);Memo1.Lines.Add('文件大小:' + intToStr(size));finallyCloseFile(f);end;end;(8)判断程序是否在运行:procedure TForm1.Button9Click(Sender: TObject);varPrevInstHandle:Thandle;AppTitle:pchar;beginAppTitle := pchar(edit2.Text);PrevInstHandle := FindWindow(nil, AppTitle);if PrevInstHandle <> 0 then beginif IsIconic(PrevInstHandle) thenShowWindow(PrevInstHandle, SW_RESTORE)elseBringWindowT oTop(PrevInstHandle);SetForegroundWindow(PrevInstHandle);end;end;{CreateToolhelp32Snapshot函数为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD])建立一个快照[snapshot]。

Delphi的内存管理器

Delphi的内存管理器

第7章Delphi的内存管理器最小化内核中并不包含内存管理器,这表明使用最小化内核开发应用程序,与使用汇编一样“原始”:需要使用标准的Win32 API来分配、使用和管理内存块。

但是这通常会存在效率问题,也可能会导致内存漏洞。

如果代码中使用到需要动态内存的数据类型,那么这些数据类型的内部例程将访问Delphi的内存管理器。

这些数据类型中就包括了AnsiString。

这意味着绝大多数的Delphi程序都需要内存管理器。

除了缺省的内存管理器外,Delphi还实现了ShareMem.pas和相应的内存管理模块borlndmm.dll,以同步DLL与HOST程序中的内存管理器。

与缺省的内存管理器一样,共享内存管理器(borlndmm.dll)并不是最有效率的。

因此某些时候,选择第三方的内存管理器可能会得到更好的性能。

开发人员随时可以写一个内存管理器来嘲笑一下那个叫borlndmm.dll的东西。

但在开始动手之前,请确认你已理解本章所述的全部细节,否则你可能不得不面对一次次的进程崩溃,并无可奈何地在uses关键字的后面加入ShareMem。

知己知彼,才能无往不利。

否则,笑到最后的还会是Borland。

7.1 Delphi的内存管理器实现框架Delphi在GetMem.inc中实现了自己的内存管理器。

对于应用程序模块来说,除了变量、常量和系统内存的数据结构之外,其他任何时候的内存分配行为,只可能是如下三种情况之一:通过操作系统API进行的进程内内存分配。

使用Delphi内存管理例程进行的堆分配。

Delphi源代码分析第7章 Delphi的内存管理器·170·通过汇编指令或者局部变量定义进行的栈分配①。

通过操作系统API进行的内存分配主要有虚地址内存分配和堆分配。

前者是指使用API:VirtualAlloc()进行的分配,后者是指用API:HeapAlloc()进行的分配。

Delphi内存管理例程中的所谓“堆分配”,与操作系统中的“堆”概念并不一致。

2024版Delphi程序设计[1]

2024版Delphi程序设计[1]

数据库性能。
21
05
Delphi网络编程
Hale Waihona Puke 2024/1/2922
网络通信原理简介
客户端/服务器模型
网络通信通常采用客户端/服务器模型,其中 客户端发送请求,服务器响应请求并返回数据。
2024/1/29
套接字编程
网络通信基于套接字(socket)进行,套接字是不同 计算机之间进行通信的端点。
传输协议
常见的传输协议包括TCP和UDP。TCP提供可 靠的、面向连接的通信服务,而UDP提供无 连接的、不可靠的通信服务。
23
TCP/IP协议在Delphi中实现
2024/1/29
使用WinSock控件
Delphi中可以使用WinSock控件实现TCP/IP协议,通过设置控件 属性并调用相关方法即可建立客户端或服务器应用程序。
熟悉窗体的事件处理机制,如加载、关闭、大小改变 等事件。
2024/1/29
13
常用控件介绍
基本控件
学习Delphi中常用的基本控件,如按钮、标签、 文本框等。
高级控件
了解高级控件的使用,如列表框、树形视图、 表格等。
2024/1/29
控件属性与事件
掌握控件的常用属性和事件,如控件的名称、大小、颜色、单击事件等。
编译器异常
编译时检测到的错误,如语法错误或类型不匹配。通过编译器提 示信息进行修复。
自定义异常
用户自定义的异常类型,用于特定业务逻辑的错误处理。通过创 建自定义异常类实现。
33
自定义异常处理机制
创建自定义异常类
继承自Exception类或其子类,添加自定义 属性和方法。
抛出自定义异常
在适当的位置使用raise语句抛出异常,并传 递异常实例。

delphi权限控制(delphiTActionList方案)

delphi权限控制(delphiTActionList方案)

delphi权限控制(delphiTActionList方案)delphi 权限控制(delphi TActionList方案)作者:admin 来源:日期:2011/8/11 9:35:22 人气:2043 标签:delphi 权限控制(delphi TActionList方案)在软件开发中,为软件加入权限控制功能,使不同的用户有不同的使用权限,是非常重要的一项功能,由其在开发数据库方面的应用,这项功能更为重要。

但是,要为一个应用加入全面的权限控制功能,又怎样实现呢?大家知道,现在的应用,一般均以菜单访问功能的形式出现,按照常规的做法,只要让注册进入应用的不同用户,可以访问不同的功能菜单,从而实现功能权限的控制,但是,有这样一个问题,此种方法便无能为力,现在的应用软件,为了提高软件的易操作性,同一功能可能有多种不同的访问方式,如工具条,右键菜单等;同样,同一个功能,也可能在软件的不同地方被调用,而不仅仅被限制为用程序的主菜单来调用,这样,才能保证应用的易用性。

写到这,问题已经非常清楚,对于要限制的软件功能,仅通过一次代码设计,无论在整个应用的任何地方或通过何种形式调用此功能,都能被功能权限所限制。

笔者利用Delphi平台作应用开发时,通过Delphi7提供的VCL 控件解决了这一问题。

在了解如何实现功能权限控制之前,得先看一下Delphi7提供的新控件TActionList,通过TActionList,应用程序可以统一管理其TAction,这里的Action,可以理解为应用程序的功能。

在应用的设计期间,可以通过TActionList编辑器将功能(Action)加入TActionList,将Action加入TActionList后,就可能通过Object Inspector设置Action的属性或为其建立事件句柄。

在这里,我们可以用Action的OnExecute事件句柄实现具体的功能,如下代码来显示一个操作窗体:procedure TfrmMain.SetUserExecute(Sender: TObject);beginfrmUser.showModal;end;当要限定这一功能时,可能利用TAction的Enabled,将其设为Fa lse,此功能对于用户将被屏蔽掉,如果要此功能对用户不可见,则可以设定Visible为False。

delphi多线程编程

delphi多线程编程

delphi多线程编程delphi多线程编程━━━━━━━━━━━━━━━━━━━━━━━━━━本章描述Windows 95与Windows NT的基于线程的多任务设计。

15.1 线程我们知道,Windows 95支持两种形式的多任务。

第一种类型是基于进程的机制,这也是Windows从一开始就支持的多处理类型。

进程本质上是指正在执行着的程序,在基于进程的多任务环境下,两个至多个进程可以并发地执行。

第二种类型是基于线程(thread)的机制,基于线程的多任务对于多数Windows用户和程序员而言是一个崭新的概念,因为Windows 95以前的Windows版本不能支持线程的概念(Windows NT除外)。

线程是指进程中的一个执行流。

多个线程可以并发地运行于同一个进程中。

在Windows 95/98/NT中,每一个进程拥有至少一个线程,允许同时执行两个或多个线程。

并由我们的程序控制它们。

基于线程的多任务允许同一程序的不同部分(线程)并发地执行。

这样,程序员就能够写出非常高效的程序,因为程序员能够定义执行线程并管理程序的执行方式,能够完全地控制程序片段的执行。

例如,可以在一个程序中指定一个线程执行文件排序工作,指定另外一个线程负责收集来自某个远程资源的信息,指定又一线程完成用户输入的工作。

因为处于多线程多任务环境,每一线程都能够并发地执行,这样就能充分地利用CPU时间。

通常,多线程处理使程序运行速度减慢,除非我们有多线程CPU,以及可以在处理器中分离线程的操作系统。

基于线程的多任务使得同步功能特征显得更为重要。

既然多个线程(及进程)可以并发执行,那么必须适当地协调线程间的执行顺序以使其能同步访问共享资源与内存,从而使程序编写起来显得更加复杂。

Windows 95增加了一个完整的子系统以支持同步机制,其中的一些关键特征将在本章后进一步地讨论。

15.2 线程类所有进程至少都拥有一个执行线程,为了讨论方便,我们称该执行线程为主线程。

DELPHI与WINDOWS管道操作

DELPHI与WINDOWS管道操作

什么是管道?参考《WIN32汇编编程》是这样描述的Windows引入了多进程和多线程机制。

同时也提供了多个进程之间的通信手段,包括剪贴板、DDE、OLE、管道等,和其他通信手段相比,管道有它自己的限制和特点,管道实际上是一段共享内存区,进程把共享消息放在那里。

并通过一些API提供信息交换。

管道是两个头的东西,每个头各连接一个进程或者同一个进程的不同代码,按照管道的类别分有两种管道,匿名的和命名的;按照管道的传输方向分也可以分成两种,单向的双向的。

根据管道的特点,命名管道通常用在网络环境下不同计算机上运行的进程之间的通信(当然也可以用在同一台机的不同进程中)它可以是单向或双向的;而匿名管道只能用在同一台计算机中,它只能是单向的。

匿名管道其实是通过用给了一个指定名字的有名管道来实现的。

使用管道的好处在于:读写它使用的是对文件操作的api,结果操作管道就和操作文件一样。

即使你在不同的计算机之间用命名管道来通信,你也不必了解和自己去实现网络间通信的具体细节。

使用匿名管道的步骤如下:使用CreatePipe建立两个管道,得到管道句柄,一个用来输入,一个用来输出准备执行控制台子进程,首先使用GetStartupInfo得到StartupInfo使用第一个管道句柄代替StartupInfo中的hStdInput,第二个代替hStdOutput、hStdError,即标准输入、输出、错误句柄使用CreateProcess执行子进程,这样建立的子进程输入和输出就被定向到管道中父进程通过ReadFile读第二个管道来获得子进程的输出,通过WriteFile写第一个管道来将输入写到子进程父进程可以通过PeekNamedPipe来查询子进程有没有输出子进程结束后,要通过CloseHandle来关闭两个管道。

下面是具体的说明和定义:1.建立匿名管道使用CreatePipe原形如下:BOOL CreatePipe(PHANDLE hReadPipe,//address of variable for read handlePHANDLE hWritePipe,//address of variable for write handleLPSECURITY_ATTRIBUTES lpPipeAttributes,//pointer to security attributesDWORD nSize//number of bytes reserved for pipe);当管道建立后,结构中指向的hReadPipe和hWritePipe可用来读写管道,当然由于匿名管道是单向的,你只能使用其中的一个句柄,参数中的SECURITY_ATTRIBUTES的结构必须填写,定义如下:typedef struct_SECURITY_ATTRIBUTES{DWORD nLength://定义以字节为单位的此结构的长度LPVOID lpSecurityDes criptor;//指向控制这个对象共享的安全描述符,如果为NULL这个对象将被分配一个缺省的安全描述BOOL bInheritHandle;//当一个新过程被创建时,定义其返回是否是继承的.供系统API函数使用. }SECURITY_ATTRIBUTES;2.填写创建子进程用的STARTUPINFO结构,一般我们可以先用GetStartupInfo来填写一个缺省的结构,然后改动我们用得到的地方,它们是:hStdInput--用其中一个管道的hWritePipe代替hStdOutput、hStdError--用另一个管道的hReadPipe代替dwFlags--设置为STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW表示输入输出句柄及wShowWindow字段有效wShowWindow--设置为SW_HIDE,这样子进程执行时不显示窗口。

delphi 隐藏任务栏图标

delphi 隐藏任务栏图标

delphi 隐藏任务栏图标首先,请看看这些术语。

系统托盘是一个在任务条右角的小方框,在托盘了应用程序可以显示小图标。

任务条是可以在屏幕上伸展的工具栏。

它就是程序图标所在的位置。

想隐藏程序的任务条图标,你可以应用ShowWindow函数并传给它Application.Handle窗口句柄。

ShowWindow(Application.Handle, SW_HIDE);若想让任务条图标再出现,只需将SW_HIDE改为SW_SHOW。

ShowWindow(Application.Handle, SW_SHOW);注: 你可以设置主窗口的Visible属性为false来隐藏它。

注: 通过ShowWindow来隐藏窗口的任务条图标是不持久的。

某些动作会使任务条图标重现。

你可以将隐藏的应用程序窗口设为Tool Window来移走程序的任务条图标而避免它再次出现。

Tool windows永远不会有任务条图标。

使应用程序窗口成为一个Tool Window有一个副作用:当用户按下Alt-TAB时它将不在程序列表中出现。

你可以调用API函数GetWindowLong和SetWindowLong来使应用程序窗口成为一个Tool Window。

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE);dwExStyle |= WS_EX_TOOLWINDOW;SetWindowLong(Application->Handle, GWL_EXSTYLE, dwExStyle);try{Application->Initialize();Application->CreateForm(__classid(TForm1), &Form1);Application->Run();}catch (Exception &exception){Application->ShowException(&exception);}return 0;}/////////////////////////////////ShowWindow(Application->Handle,SW_HIDE)delphi 隐藏任务栏图标2007-02-28 16:16在编程的过程中,有时想让程序的任务栏图标隐藏起来,我们通常的方法是添加代码Application.ShowMainForm:=false;或使用self.hide;来实现,这样虽然能让任务栏图标不出现,但是把主窗体也给藏起来了,有什么办法可以让只任务栏图标不出现呢?今天在上网偶然发现了一个方法,可以解决这个问题。

delphi trttitype创建类实例 -回复

delphi trttitype创建类实例 -回复

delphi trttitype创建类实例-回复Delphi中的TObject是一个基础类,TObject是所有其他类的祖先。

在Delphi中,要创建一个类的实例,需要使用特殊的TrttiType类型。

TrttiType是Delphi反射机制(RTTI)的一部分。

反射机制是一种能够在运行时获取或操作程序的类型信息的能力。

通过使用TrttiType,我们可以在运行时动态地创建类的实例并访问类的属性、方法等。

首先,我们需要创建一个新的Delphi控制台应用程序,并在程序中添加TrttiType单元作为使用反射机制的前提条件。

在Delphi激活的窗口中,选择"文件"->"新建"->"控制台应用程序",然后添加TrttiType单元。

接下来,我们需要定义一个类,我们将使用TrttiType创建该类的实例。

定义一个新的类,名为"TCustomClass",并将其定义在program结束之前的部分。

例如:typeTCustomClass = classprivateFID: Integer;FName: string;publicconstructor Create(ID: Integer; Name: string);property ID: Integer read FID write FID;property Name: string read FName write FName;end;constructor TCustomClass.Create(ID: Integer; Name: string); beginFID := ID;FName := Name;end;在上述代码中,我们定义了一个私有字段FID和FName,以及一个公共属性ID和Name。

我们还创建了一个构造函数Create,用于设置类的ID 和Name属性。

delphi 模仿任务管理器

delphi 模仿任务管理器

以前,我在delphi的一个网站写过一个帖子,但那个网站的读者群水平太低,基本没有人阅读,因为没有人阅读,所以那个帖子没有个帖子就是讨论如何计算CPU的各种占有率,下面将那个帖子转帖在这里,帖子很长,耐心读:,用SoftIce跟踪TaskMgr 居然看出点门道来,将这些见解和大家共享,文章可能很长,也可能要花很长的时间,反正爱看就看就别看。

提供了相应的.PDB 和 .DBG文件,使跟踪变的比较容易。

本文所有提到的技术都属于微软,我只不过是读懂了然后用Delphi 己没有什么技术,不得用于商业用途,否则老盖找你打官司,可别来找我。

使用未公开的函数NtQuerySystemInformation 点滴(自己动手写任务管理器)己写一个任务管理器,从显示到功能和Windows TaskMgr完全一样,包括从注册表中读取Windows TaskMgr的所有启动参数(170并增加一些TaskMgr没有的功能)gzgzlxg 2005年4月12日近一个月研究Windows 2000和Windows 2003的任务管理器的体会,研究还没有最后结束,但文章必须先写,否则许多东西不忘了。

该文章将分若干篇来写,这是第一段。

ystemInformation 是所谓Undocuments 函数,主要用来获取系统各类信息。

Windows 2000的任务管理器TaskMgr 主要就取各类信息,如CPU使用率,内核使用率,句柄总数,线程总数,进程总数...等等在任务管理器中的几乎所有信息都是来自该函数别的函数完成类似的工作,如PDH,ToolHelp,或读取注册表等方法,各种方法中,应该以使用NtQuerySystemInformation 最好,TaskMgr 为什么使用该函数的原因。

)在MSDN知识库中是这样描写该函数的:SystemInformation is available for use in Windows 2000 and Windows XP. It may be altered or unava subsequent versions. Applications should use the alternate functions listed in this topic.]但幸运的是,至少在Windows 2003 的任务管理器中仍然是使用该函数来获取系统各类信息的。

delphi编写挪用有窗体有返回值的dll的实现方x页

delphi编写挪用有窗体有返回值的dll的实现方x页

delphi编写挪用有窗体有返回值的dll的实现方式本人利用的delphi是版,用delphi编写dll工程很简单,在新建。

中就有创建Dll的选项。

在编写DLL工程时,需要注意的包括,工程单元有专门大不同,一个关键字是program ,一个关键字是library。

dll工程单元中还包括exports 子句,那些需要提供给其他主叫程序挪用的进程,都需要包括在exports中(只是列出函数的名字,不需要参数表)。

关于主叫方(挪用dll的应用程序或其他dll),那么需要在挪用之前进行外部声明,即external保留字指示的声明。

另外需要了解object pascal中有关挪用协议的内容,在object pascal中关于进程或函数有以下五种挪用协议:指示字参数传递顺序参数清除者参数是不是利用寄放器register 自左向右被调例程是pascal 自左向右被调例程否cdecl 自右向左挪用者否stdcall 自右向左被挪用例程否safecall 自右向左被挪用例程否那个地址的指示字确实是在声明函数或进程时附加在例程题目以后的保留字,默以为register,即是唯一利用CPU寄放器的参数传递方式,也是传递速度最快的方式;pascal: 挪用协议仅用于向后兼容,即向旧的版本兼容;cdecl: 多用于C和C++语言编写的例程,也用于需要由挪用者清除参数的例程;stdcall: 和safecall要紧用于挪用Windows API 函数;其中safecall还用于双重接口。

此刻以一个实例来讲明一个用delphi编写的程序如何挪用包括form窗体dll的程序。

Dll工程:library Project2;{ Important note about DLL memory management: ShareMem must be thefirst unit in your library's USES clause AND your project's (selectProject-View Source) USES clause if your DLL exports any procedures orfunctions that pass strings as parameters or function results. Thisapplies to all strings passed to and from your DLL--even those thatare nested in records and classes. ShareMem is the interface unit tothe shared memory manager, which must be deployed alongwith your DLL. To avoid using , pass string informationusing PChar or ShortString parameters. }usesSysUtils,Classes,Unit1 in '' {Form1};{$R *.RES}exportsExecute name 'Execute';{进程来自于Unit1}beginend.——————————————————————————————————————unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Db, ADODB;typeTForm1 = class(TForm)ADOcon: TADOConnection;Memo1: TMemo;private{ Private declarations }public{ Public declarations }end;function Execute(ApplicHandle: TApplication; MainHandle: THandle; AdoObj: TADOConnection; AdoConnectionString: PChar): boolean; stdcall; export;varForm1: TForm1;implementation{$R *.DFM}function Execute(ApplicHandle: TApplication; MainHandle: THandle; AdoObj: TADOConnection; AdoConnectionString: PChar): boolean; stdcall; export;varoldhandle: THandle;beginOldHandle := ; ;:= ;(Tform1, Form1);:= ;'成功挪用');:=nil;:= OldHandle;end;end.挪用dll程序的程序:program call_dll;usesForms,Ubtn in '' {Form1};{$R *.RES}begin;(TForm1, Form1);;end.——————————————————————————————————unit Ubtn;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Db, ADODB;typeTForm1 = class(TForm)adocon: TADOConnection;Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;function Execute(ApplicHandle: TApplication; MainHandle: THandle; AdoObj: TADOConnection; AdoConnectionString: PChar): boolean; stdcall; external '';varForm1: TForm1;implementation{$R *.DFM}procedure (Sender: TObject);beginexecute(application,,adocon,Pchar);end;end.PB的主程序挪用DELPHI的DLL,DLL在函数执行完后回传一个字符串给PB主程序,DLL里用的是PCHAR类型。

用Delphi制作数控程序管理软件

用Delphi制作数控程序管理软件

数控程序管理软件的开发试制工厂霍龙军【摘要】本文分析了当前数控程序管理上普遍存在的问题,提出了我们对这些问题的解决方案,并讲述了我们用Delphi工具对其实施的过程。

【关键词】数控程序加工信息数据库检索一、前言数控程序是数控机床加工零件的指令代码,它是由诸多的字母和数字组成,目前,在大约80%的数控加工部门中,数控程序的管理比较混乱,这给实际加工过程带来了许多不便。

为了改变这种现状,本人结合自己的实际工作,开发出一个数控程序管理软件,下面就分步介绍该软件的实现过程,它解决问题的方法以及最后效果的验证。

二、软件要解决的问题目前大部分数控设备程序存储空间很小,现在的运作方式是由编程人员将自己编好的程序先存储在软盘上,然后再通过计算机送入机床,这样使程序分布的非常零散,而且软盘存储数据也不可靠。

另外不同的零件和数控系统所对应的程序是不一样的,某个零件的加工程序编好使用过以后,若下次再用,我们很难根据那些代码得知该程序的相关加工信息,这对提高数控机床的使用效率来说是很不利的。

还有就是NC程序的检索以及查看相关加工信息很困难,仅通过那些程序代码很难确定该程序是加工的哪个零件的哪一部分、精加工还是粗加工、所选用刀具的类型、工件坐标原点位置、刀具补偿信息、程序的编制日期、编程人员是谁等等。

而这些正是我们加工零件所必须知道的,否则,再次加工同一零件时,若重新编程序,不但耗时费力,而且更重要的是,对于一个新编的程序在加工前要进行试运行,看是否会与夹具或机床相碰,然后进行首件加工,加工完再检测尺寸是否合格,若有问题,就要修正程序,直到满足要求,这样以来,对那些一定周期重复加工的零件来说,不但降低工作效率,而且很容易出现质量问题。

因此,我们可以将所有经过验证的NC程序集中存储在一台计算机上,用一个管理软件对存储在计算机上大量的程序进行有效管理,实现数控程序信息的录入、编辑,检索和程序的提取。

所以我们先要建立起数控程序数据库,再用相关的面向对象开发工具制作出一个数据库应用程序,用该应用程序连接数控程序数据库,使用者通过应用程序界面实现用户对数控程序的检索和提取等功能。

005.Delphi插件之QPlugins,IQNotify通知

005.Delphi插件之QPlugins,IQNotify通知

005.Delphi插件之QPlugins,IQNotify通知演⽰的界⾯如下,拖动滚动条,百分⽐圆和进度条也是会跟着动的主程序的代码如下unit Frm_Main;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Ctrls,qstring,QPlugins,qplugins_base,qplugins_loader_lib,qplugins_params,qplugins_vcl_formsvc,qplugins_vcl_messages,qplugins_formsvc,Vcl.StdCtrls;typeTForm_Main = class(TForm)TrackBar1: TTrackBar;Label1: TLabel;Button1: TButton;Button2: TButton;Button3: TButton;procedure TrackBar1Change(Sender: TObject);procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure Button3Click(Sender: TObject);private{Private declarations}FChangeNotifyId: Integer;public{Public declarations}end;varForm_Main: TForm_Main;FInterfaceList: TInterfaceList; // 保存窗体插件实例指针implementationusesFrm_Show;{$R *.dfm}// 按钮_新建接收窗⼝procedure TForm_Main.Button1Click(Sender: TObject);begin// 显⽰窗⼝TForm_Show.Create(Application);end;// 按钮_新建DLL插件窗⼝procedure TForm_Main.Button2Click(Sender: TObject);var// 窗体服务的接⼝AFormService: IQFormService;begin// 加载DLL_MutiInstance的DLL插件窗⼝if Supports(PluginsManager.ByPath('/Services/Docks/Forms/DLL_MutiInstance'), IQFormService, AFormService) then begin// 把这个服务窗⼝添加到接⼝列表中FInterfaceList.Add(AFormService);// ShowMessage(ServiceSource(AFormService as IQService));// 显⽰AFormService.Show;end;end;// 按钮_显⽰参数procedure TForm_Main.Button3Click(Sender: TObject);varAParams: TQParams;begin// 创建参数列表AParams := TQParams.Create;// 向参数列表插⼊⼀波参数AParams.Add('Id', 100);AParams.Add('Name', '⾼原');AParams.Add('IsFemale', false);AParams.Add('Scale', 75.6);AParams.Add('Desc', '这是测试'#13#10'⾼原有很多种');AParams.Add('Array', NewParams([100, 'QDAC', 3.45]));// 输出ShowMessage((AParams as IQParams).AsString.Value);end;procedure TForm_Main.FormClose(Sender: TObject; var Action: TCloseAction);begin// 释放FInterfaceList.Free;end;// 创建procedure TForm_Main.FormCreate(Sender: TObject);varAPath: string;beginReportMemoryLeaksOnShutdown := True;// 取⾃⼰路径APath := ExtractFilePath(Application.ExeName);// 加载同⽬录的DLLPluginsManager.Loaders.Add(TQDLLLoader.Create(APath, '.dll'));// 启动服务PluginsManager.Start;// 找到名字为'Tracker.Changed'的通知FChangeNotifyId := (PluginsManager as IQNotifyManager).IdByName('Tracker.Changed');// 创建接⼝列表FInterfaceList := TInterfaceList.Create;end;// 进度条被拖动事件procedure TForm_Main.TrackBar1Change(Sender: TObject);begin// 触发调⽤DLL中的插件窗⼝// IQNotifyManager.Send 投递⼀个通知并等待它被处理完成(PluginsManager as IQNotifyManager).Send(FChangeNotifyId, NewParams([TrackBar1.Position]));end;unit Frm_Show;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.StdCtrls,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.Samples.Gauges,QPlugins,qplugins_base,qplugins_params;type// class需要继承IQNotifyTForm_Show = class(TForm, IQNotify)Gauge1: TGauge;CheckBox1: TCheckBox;procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure CheckBox1Click(Sender: TObject);private{Private declarations}FNotifyId: Integer;// 在通知发⽣时,通知响应函数接⼝。

Delphi第三方控件大测评,大比拼

Delphi第三方控件大测评,大比拼

Delphi第三方控件大测评,大比拼专栏:Delphi技术文章编号:858 文章类别:原创作者:Awater 加贴时间:00-4-18 22:14:55Delphi第三方控件大测评,大比拼关键词:Delphi控件杂项Delphi第三方控件大测评,大比拼------------------------------AWater古人云∶“工欲善其事,必先利其器。

”这句话,我想凡是用Delphi的朋友,应该都有很深切的体会吧。

的确,如果Delphi没有了控件的支持,那么人气度一定会大大的降低,不会有现在这样多的Fan了,俺也就改行用BCB或VC了,呵呵。

但是,现在控件满天飞,不要说DSP(Delphi Super Page)了,光一个深度历险上面的控件就已经洋洋洒洒上万数了,而且每天还在更新,多恐怖啊∶) 然而,选择多了以后,烦恼也就随之而来了(呵呵,如果MM也能有那么多让我挑就好了),因为无法一个个的都去试过,所以有许多的优秀控件还不是为人所知,因此我就写下了这篇文章,希望能为大家当个向导,起到一个抛砖引玉的作用吧。

好了,现在转入正题。

首先来大体上为控件分一下类,以方便我们后面的讨论。

但因为控件的种类太多,所以就粗略的分为如下几个类别∶---界面风格类---Shell外观类---Editor类---Grid类---DB类---Report类---图形类---综合类约定的前提是∶All FreeWare,All source.至于那些要花钱购买的商业控件,我将在后面另外进行讨论。

对于文中我们所讨论的每一个控件,都会给出一个品质得分,商业控件和免费控件一视同仁,不以价格论高低,而以质量分高下:大体的评分标准如下:一级棒的超cool控件:★★★★★也很不错的控件:★★★★虽一般但有特色的控件:★★★三颗星以下的控件就不在本文的讨论范围之内了。

(☆表示★的效力减半)还需要注意的就是,则篇文章旨在向大家推荐一些优秀的第三方控件,文中提及的所有控件都可以在/doc/3d13784003.html,网站上下载。

利用Delphi全面控制Windows任务栏

利用Delphi全面控制Windows任务栏

利用Delphi全面控制Windows任务栏使用Windows95/NT/98操作系统的用户知道:Windows正常启动后,在电脑屏幕下方出现一块任务栏。

从系统功能角度而言,整个任务栏包括几个不同的子区域,从左至右依次是:开始按钮、应用程序切换区(Application Switch Bar)、任务栏通知区(Notification Area)以及任务栏时钟。

与其它Windows应用程序相同,任务栏程序()由几个不同的窗体组成,这些窗体是具有各自的窗口类名、显示方式等信息。

因此,只要得到有关窗口信息,即可通过编程全面控制Windows任务栏的不同区域。

编程思想任务栏窗体的窗口信息为:任务栏的窗口类名是:ShellTrayWnd。

开始按钮的窗口类名是:Button。

应用程序切换区的窗口类名是:ReBarWindow32。

任务栏通知区的窗口类名是:TrayNotifyWnd。

任务栏时钟的窗口类名是:TrayClockWClass。

调用FindWindow函数得到任务栏的窗口句柄。

调用FindWindowEx函数得到任务栏各子区域的窗口句柄。

根据窗口句柄,调用ShowWindow函数控制任务栏各区域显示或隐藏(show/hide);调用En ableWindow函数控制任务栏各区域有效或无效(enabled/disabled)。

编程方法在 IDE中新建工程Project1, Project1中包含Form1, 窗体如下图所示(2)定义窗口句柄数组:Wnd:array[0..4]过程代码得到Tray Bar 的窗口句柄;[0]:=FindWindow(′ShellTrayWnd′,ni 得到开始按钮的窗口句柄;[1]:=FindWindow(′ShellTrayWnd′,ni[1]:=FindWindowEx(Wnd[1]得到应用程序切换区的窗口句柄;[2]:=F indWindow(′ShellTrayWnd′,ni[2]]:=FindWindowEx(Wnd[2],HWND(0),′ReBarWindow32′,nil);得到任务栏通知区的窗口句柄;[3]:=FindWindow(′ShellTrayWnd′,ni [3]:=FindWindowEx(Wnd [3],HWND(0),′TrayNotifyWnd′,nil);得到任务栏时钟的窗口句柄;[4]:=FindWindow(′ShellTrayWnd′,n i [4]:=FindWindowEx(Wnd [4],HWND(0),′TrayNotifyWnd′,nil);[4]:=FindWindowEx(Wnd[4],HWND(0),′TrayCLockWClass′,nil ;过程代码EnableWindow(Wnd[0]EnableWindow(Wnd[1]EnableWindow(Wnd[2]EnableWindow(Wnd[3]EnableWindow(Wnd[4][0]EnableWindow(Wnd[1]EnableWindow(Wnd[2]EnableWindow(Wnd[3]EnableWindow(Wnd[4],过程代码ShowWindow(Wnd[0]ShowWindow(Wnd[1]ShowWindow(Wnd[2]ShowWindow(Wnd[3]ShowWindow(Wnd[4]ShowWindow(Wnd[0]ShowWindow(Wnd[1]ShowWindow(Wnd[2]ShowWindow(Wnd[3]ShowWindow(Wnd[4](6)FormClose事件代码//将Windows任务栏恢复到正常状态;(Sender:TObject; var Action:[i]wWindow(Wnd[i]按F9运行程序。

initializeprocthreadattributelist delphi -回复

initializeprocthreadattributelist delphi -回复

initializeprocthreadattributelist delphi -回复如何在Delphi中初始化并使用ProcessThreadsAttributeList。

Delphi是一种面向对象的编程语言,用于迅速开发Windows平台上的应用程序。

它提供了丰富的库和工具,使得开发人员能够轻松地创建功能强大且可靠的应用程序。

在某些情况下,我们可能需要了解并使用进程线程属性列表(Process Threads Attribute List)来管理线程。

本文将介绍如何在Delphi中初始化并使用ProcessThreadsAttributeList。

进程线程属性列表(Process Threads Attribute List)是一种结构,用于在Windows系统中管理线程的一些属性和选项。

它允许我们为每个线程分配指定的属性,以控制其行为和资源使用情况。

在Delphi中,我们可以使用ProcessThreadsAttributeList来实现这一目标。

首先,我们需要创建一个ProcessThreadsAttributeList对象。

在Delphi 中,我们可以使用CreateProcessThreadsAttributeList函数来创建这个对象。

这个函数返回一个布尔值,指示操作是否成功。

function CreateProcessThreadsAttributeList(var lpAttributeList: TProcThreadAttributeList; dwAttributeCount: DWORD;dwFlags: DWORD = 0): BOOL; stdcall; external kernel32 name'InitializeProcThreadAttributeList';在调用这个函数之前,我们需要定义一个存储属性列表的TProcThreadAttributeList类型变量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

以前,我在delphi的一个网站写过一个帖子,但那个网站的读者群水平太低,基本没有人阅读,因为没有人阅读,所以那个帖子没有个帖子就是讨论如何计算CPU的各种占有率,下面将那个帖子转帖在这里,帖子很长,耐心读:,用SoftIce跟踪TaskMgr 居然看出点门道来,将这些见解和大家共享,文章可能很长,也可能要花很长的时间,反正爱看就看就别看。

提供了相应的.PDB 和 .DBG文件,使跟踪变的比较容易。

本文所有提到的技术都属于微软,我只不过是读懂了然后用Delphi 己没有什么技术,不得用于商业用途,否则老盖找你打官司,可别来找我。

使用未公开的函数NtQuerySystemInformation 点滴(自己动手写任务管理器)己写一个任务管理器,从显示到功能和Windows TaskMgr完全一样,包括从注册表中读取Windows TaskMgr的所有启动参数(170并增加一些TaskMgr没有的功能)gzgzlxg 2005年4月12日近一个月研究Windows 2000和Windows 2003的任务管理器的体会,研究还没有最后结束,但文章必须先写,否则许多东西不忘了。

该文章将分若干篇来写,这是第一段。

ystemInformation 是所谓Undocuments 函数,主要用来获取系统各类信息。

Windows 2000的任务管理器TaskMgr 主要就取各类信息,如CPU使用率,内核使用率,句柄总数,线程总数,进程总数...等等在任务管理器中的几乎所有信息都是来自该函数别的函数完成类似的工作,如PDH,ToolHelp,或读取注册表等方法,各种方法中,应该以使用NtQuerySystemInformation 最好,TaskMgr 为什么使用该函数的原因。

)在MSDN知识库中是这样描写该函数的:SystemInformation is available for use in Windows 2000 and Windows XP. It may be altered or unava subsequent versions. Applications should use the alternate functions listed in this topic.]但幸运的是,至少在Windows 2003 的任务管理器中仍然是使用该函数来获取系统各类信息的。

下面将具体讲述该函数在Delphi中的使用1. 函数NtQuerySystemInformationrySystemInformation函数隶属Ntdll.dll,函数的调用非常复杂,有许多入口参数,MSDN知识库中基本都是一带而过,没有具体的说是自己具体使用的感受,和网站上一些少的可怜的资料,而这些可怜的资料也都是别人自己的体会,所以难免有错误,因此在具体使有任何问题,概不负责。

1.1函数的调用格式:function NtQuerySystemInformation(SystemInformationClass: TSystemInformationClass;{ SystemInformationClassof the values enumerated in SYSTEM_INFORMATION_CLASS, indicating the kind of system informationretrieved.}pSystemInformation: PVOID;{ SystemInformation] Points to a buffer where the requested information is/ to be returned. The size and structure of th mation varies depending on the value of the SystemInformationClass parameter:}uSystemInformationLength: ULONG;{ SystemInformationLength[in] Size of the buffer pointed to by the SystemInformation parameter, in bytes.}puReturnLength: PULONG{ ReturnLengthptional] Optional pointer to a location where the function writes the actual size of the information reque size is less than or equal to the SystemInformationLength parameter, the function copies the information Information buffer; otherwise, it returns an NTSTATUS error code and returns in ReturnLength the sizer required to receive the requested information. }): NTSTATUS; stdcall;{Return Valuesan NTSTATUS success or error code. The forms and significance of NTSTATUS error codes are listed s.h header file available in the Windows Device Driver Kit (DDK), and are described in the DDK do under Kernel-Mode Driver Architecture / Design Guide / Driver Programming Techniques / Logging ErrorNtQuerySystemInformation call to obtain information about the Cache 's settings and NtSetSystemInformation ing information. The working-set information for a process serves as guidelines for NT 's Memory Manage many pages of/ physical memory should be assigned to the application. Because they are guidelines, c result such that the Memory Manager grows a working-set to a size greater than the maximum, or sh ss than the minimum. However, the settings are factors that will affect the overall allocation, and hence siveness, of an application. In the case of CacheSet the application is the file system Cache.}1.2 参数说明:NtQuerySystemInformation的调用参数非常多,我这里只列出在TaskMgr中调用的部分。

1.2.1 TSystemInformationClassTSystemInformationClass有许多类,这里列出的是能够找到的,可能还有一些。

PSystemInformationClass = ^TSystemInformationClass;_SYSTEM_INFORMATION_CLASS = (SystemBasicInformation,SystemProcessorInformation,SystemPerformanceInformation,SystemTimeOfDayInformation,SystemPathInformation,SystemProcessInformation,SystemCallCountInformation,SystemConfigurationInformation,SystemProcessorPerformanceInformation,SystemGlobalFlag,SystemCallTimeInformation,SystemModuleInformation,SystemLockInformation,SystemStackTraceInformation,SystemPagedPoolInformation,SystemNonPagedPoolInformation,SystemHandleInformation,SystemObjectInformation,SystemPageFileInformation,SystemVdmInstemulInformation,SystemVdmBopInformation,SystemFileCacheInformation,SystemPoolTagInformation,SystemInterruptInformation,SystemDpcBehaviorInformation,SystemFullMemoryInformation,SystemLoadGdiDriverInformation, SystemUnloadGdiDriverInformation,SystemTimeAdjustmentInformation, SystemSummaryMemoryInformation, SystemNextEventIdInformation,SystemEventIdsInformation,SystemCrashDumpInformation,SystemExceptionInformation, SystemCrashDumpStateInformation,SystemKernelDebuggerInformation,SystemContextSwitchInformation,SystemRegistryQuotaInformation, SystemExtendServiceTableInformation, SystemPrioritySeperation,SystemPlugPlayBusInformation,SystemDockInformation,SystemPowerInformation,SystemProcessorSpeedInformation, SystemCurrentTimeZoneInformation, SystemLookasideInformation,SystemSetTimeSlipEvent,SystemCreateSession, // set mode onlySystemDeleteSession, // set mode onlySystemInvalidInfoClass1, // invalid info classSystemRangeStartInformation, // 0x0004 (fails if size != 4)SystemVerifierInformation,SystemAddVerifier,SystemSessionProcessesInformation, // checked build onlyMaxSystemInfoClass);TSystemInformationClass = _SYSTEM_INFORMATION_CLASS;elphi的枚举类型列出了SYSTEM_INFORMAION_CLASS,这些命名除了少数在MSDN上有简单的说明外,其余的都是根据使用的途径得到的,所以在网上,你可以见到不同的叫法,我这里列出的命名是我个人认为比较合适的或者说我比较喜欢的。

相关文档
最新文档