Windows核心编程 中部分代码 Delphi 实现

// ① Delphi 使用 Interlocked 系列函数
var
MyValue:Longint = ; // = Integer
begin
InterlockedIncrement(MyValue); // + 返回值通常不用
InterlockedDecrement(MyValue); // - 返回值通常不用
InterlockedExchangeAdd(MyValue,); // +
InterlockedExchangeAdd(PLongint(@MyValue),-); // - 函数 overload
InterlockedExchange(MyValue,); // =
iReturnValue := InterlockedCompareExchange(MyValue,,); // iReturnValue:Integer;
ShowMessage('MyValue 跟 3 比,如果相同替换成4,否则返回原值。返回=' + IntToStr(iReturnValue));
end; // ② 保存成 c:\MyFirstMapFile.dat
// SetFilePointer 表示设置当前读写文件的位置
// SetEndOfFile 表示在“当前”位置写上这个文件“结束”。
procedure TForm2.Button1Click(Sender: TObject);
var hFile,hMap:THandle;
begin
ShellExecute(,'open','c:\',nil,nil,SW_SHOWNORMAL);
Application.BringToFront;
ShowMessage('一边执行一边看效果');
hFile := CreateFile('c:\MyFirstMapFile.dat',
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_DELETE_ON_CLOSE, // 关闭句柄的时候删除
);
ShowMessage('此时,文件 0 大小');
hMap := CreateFileMapping(hFile,
nil,PAGE_READWRITE,
,
,
nil);
ShowMessage('此时,文件 100 b');
CloseHandle(hMap);
CloseHandle(hFile);
ShowMessage('最终,文件就是 100 b');
end; procedure TForm2.Button2Click(Sender: TObject);
var hFile,hMap:THandle;pFile:PByteArray;b:Byte;
begin
ShowMessage('需要存在 c:\MySecondMap.dat' + sLineBreak + '此例子中可以看到虽然内部变量变化了,但是原本的文件并不会变。');
hFile := CreateFile('c:\MySecondMap.dat',
GENERIC_READ or GENERIC_WRITE,
,
nil,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
);
hMap := CreateFileMapping(hFile,
nil,
PAGE_WRITECOPY,
,
,
nil);
pFile := MapViewOfFile(hMap,
FILE_MAP_COPY,
,
,
);
ShowMessage('以上给予Map WriteCopy 属性');
b := Byte(pFile[]);
if b = Ord('p') then
Sleep();
ShowMessage('由于没有发生commits,保持属性 Page_WriteCopy');
pFile[] := ;
ShowMessage('此时,由于出现第一次修改,所以复制一个新Page,并且属性为 Page_ReadWrite( not Page_WriteCopy)');
pFile[] := ;
ShowMessage('仅修改新复制的页');
UnmapViewOfFile(pFile);
ShowMessage('decommits physical storage'+sLineBreak+'新页中的变更丢失');
CloseHandle(hMap);
CloseHandle(hFile);
end; // ③
// 检查 的个数
function Count0s(fn:TFileName):Int64;
var
sinf:SYSTEM_INFO;
hFile,hMap:THandle;
dwFileSizeHigh:DWORD;
qwFileSize,qwFileOffset,qwNumOf0s:Int64;
dwBytesInBlock:DWORD;
//pbFile:PAnsiChar;
dwByte:DWORD;
pByte:PByteArray;
begin
//
// ?
GetSystemInfo(sinf);
hFile := CreateFile(PAnsiChar(fn),
GENERIC_READ,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
);
hMap := CreateFileMapping(hFile,nil,PAGE_READONLY,,,nil);
qwFileSize := GetFileSize(hFile,@dwFileSizeHigh);
qwFileSize := Int64(dwFileSizeHigh) shl Int64() + Int64(qwFileSize);
CloseHandle(hFile); // 不再需要,释放
qwFileOffset := ;
qwNumOf0s := ;
while qwFileSize > do
begin
dwBytesInBlock := sinf.dwAllocationGranularity;
if qwFileSize < sinf.dwAllocationGranularity then
dwBytesInBlock := qwFileSize; // 最后一次取光?
pByte{pbFile} := MapViewOfFile(hMap,FILE_MAP_READ,
qwFileOffset shr , // Starting byte
qwFileOffset and $FFFFFFFF, // in file
dwBytesInBlock);
for dwByte := to dwBytesInBlock - do
begin
if PByte[dwByte] = then // if Byte(pbFile[dwByte]) = then
Inc(qwNumOf0s);
end;
//pbFile[] := 'X';
UnmapViewOfFile(pByte{pbFile});
Inc(qwFileOffset,dwBytesInBlock);
Dec(qwFileSize,dwBytesInBlock);
// Form3.Caption := IntToStr(qwFileSize);
// Form3.Refresh;
end;
CloseHandle(hMap);
Result := qwNumOf0s;
end; procedure TForm3.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
ShowMessage(IntToStr(Count0s(OpenDialog1.FileName)));
end; // Win98 & Win2k 不同的机制
procedure TForm3.Button2Click(Sender: TObject);
var
hFile,hMap:THandle;
pByte1,pByte2:PAnsiChar;
begin
if not OpenDialog1.Execute then
Exit;
hFile := CreateFile(PAnsiChar(OpenDialog1.FileName),
GENERIC_READ or GENERIC_WRITE,
,
nil,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
);
hMap := CreateFileMapping(hFile,nil,PAGE_READWRITE,,,nil);
pByte1 := MapViewOfFile(hMap,FILE_MAP_Write,,,);
pByte2 := MapViewOfFile(hMap,FILE_MAP_Write,,,);
Inc(pByte1,);
if pByte1 = pByte2 then
ShowMessage('running under Win98')
else
ShowMessage('running under Win2k');
UnmapViewOfFile(pByte1);
UnmapViewOfFile(pByte2);
CloseHandle(hMap);
CloseHandle(hFile);
end; // ④ 共享内存的小例子
object Form4: TForm4
Left =
Top =
Caption = 'Form4'
ClientHeight =
ClientWidth =
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch =
TextHeight =
object Button1: TButton
Left =
Top =
Width =
Height =
Caption = ##
TabOrder =
OnClick = Button1Click
end
object Button2: TButton
Left =
Top =
Width =
Height =
Caption = ##
TabOrder =
OnClick = Button2Click
end
object Edit1: TEdit
Left =
Top =
Width =
Height =
TabOrder =
Text = ###################
end
object Button3: TButton
Left =
Top =
Width =
Height =
Caption = ##
TabOrder =
OnClick = Button3Click
end
object Edit2: TEdit
Left =
Top =
Width =
Height =
TabOrder =
Text = 'Edit1'
end
object Memo1: TMemo
Left =
Top =
Width =
Height =
Lines.Strings = (
########
############
##' MM_Name '#######
#############)
TabOrder =
end
end unit Unit4; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; const
File_Size = * ;
MM_Name = 'MySharedData'; type
TForm4 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Button3: TButton;
Edit2: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
hMap:THandle;
end; var
Form4: TForm4; implementation {$R *.dfm} procedure TForm4.Button1Click(Sender: TObject);
var x,p:PAnsiChar;
begin
hMap := CreateFileMapping(DWord(-),nil,PAGE_READWRITE,,File_Size,MM_Name);
if hMap <> then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
ShowMessage('Map 已经存在,不能创建');
CloseHandle(hMap);
end
else begin
p := MapViewOfFile(hMap,FILE_MAP_READ or FILE_MAP_WRITE,,,);
if p <> nil then
begin
x := PAnsiChar(Edit1.Text);
Move(x^,p^,StrLen(x));
UnmapViewOfFile(p);
end
else
ShowMessage('不能得到 map 中的内容');
end;
end;
end; procedure TForm4.Button2Click(Sender: TObject);
begin
CloseHandle(hMap);
end; procedure TForm4.Button3Click(Sender: TObject);
var hCopyMap:THandle;p:PAnsiChar;
begin
hCopyMap := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE,
false,MM_Name);
if hCopyMap <> then
begin
p := MapViewOfFile(hCopyMap,FILE_MAP_READ or FILE_MAP_WRITE,,,);
Edit2.Text := StrPas(p);
UnmapViewOfFile(p);
CloseHandle(hCopyMap);
end
else
ShowMessage('不能获取内容');
end; end. // ⑤ 最强悍的那个应用 CellData 当时没能实现
后来就忘记了这件事情,光啃书了。
有空的时候再尝试一下。
Windows核心编程 中部分代码 Delphi 实现的更多相关文章
- 《windows核心编程系列》十八谈谈windows钩子
windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...
- 《Windows核心编程》第一讲 对程序错误的处理
一个Windows函数通常都有一个有意义的返回值类型,它标志着这个函数的运行状态,即函数运行成功与否.windows常用的函数类型如下图: 从系统内部来讲,当一个Windows函数检测到一个错误时,它 ...
- windows核心编程 第8章201页旋转锁的代码在新版Visual Studio运行问题
// 全局变量,用于指示共享的资源是否在使用 BOOL g_fResourceInUse = FALSE; void Func1() { //等待访问资源 while(InterlockedExcha ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- windows核心编程---第二章 字符和字符串处理
使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是指UTF-16.也 ...
- 《Windows核心编程》第5版 学习进度备忘
学习资源:<Windows核心编程>第5版 知识基础支持: 本书与<Windows程序设计>第5版珍藏版结合很好,二者重叠内容不多,二者互补性强,而且相关方面的优秀书籍 跳过的 ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
- 【windows核心编程】 第六章 线程基础
Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ① 一个是线程的内核 ...
随机推荐
- maven项目中的pom.xml
需要配置的内容 1.配置头(自动生成) 2.maven项目的坐标(自动生成) <modelVersion>4.0.0</modelVersion> <groupId> ...
- IPFS的配置安装
目录 1. IPFS简介 2. IPFS本地环境安装 2.1 下载ipfs压缩包 2.2 安装 3. 项目配置 3.1 创建ipfs节点 3.2 修改节点默认存储空间 3.3 查看节点id 3.4 启 ...
- C高级第三次作业
C高级第三次作业(1) 6-1 输出月份英文名 1.设计思路 (1)算法: 第一步:定义整型变量n,字符指针s,输入一个数赋给n. 第二步:调用函数getmonth将值赋给s. 第三步:在函数getm ...
- Django框架之下载以及基本命令
Django的下载与基本命令 pip3 install Django #下载完成后保存在python解释器下的bin文件目录下 创建一个Django Project #命令行输入: django-ad ...
- pycharm中如何安装Scrapy库
先打开pycharm软件. 然后先安装pywin32和setuptools库. 安装成功后再尝试Twisted库,如果失败,就去晚上下载一个库:https://www.lfd.uci.edu/~goh ...
- Unity 3D还原Scene场景、市面多数游戏视角高度自定义、第三人称视角分离功能:平移、拖动、看向中心等
Unity视角的高度自定义 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- HDU 6015 Skip the Class 优先队列 map的使用
Skip the Class Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
- PTA——猜数字游戏
PTA 7-24 猜数字游戏 #include <stdio.h> int main() { int num, times; scanf("%d %d", &n ...
- 针对IE浏览器的CSS样式(兼容性)
1. IE hacks: "_" 是IE6 专有的hack; "\9" 对IE6-IE10都有效: "\0"对IE8-IE10都有效: & ...
- Create-React-App脚手架使用方法
Facebook 官方推出Create-React-App脚手架,基本可以零配置搭建基于webpack的React开发环境,内置了热更新等功能. 由于create-react-app命令预先安装和配置 ...