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. 线程的组成 ① 一个是线程的内核 ...
随机推荐
- vue mapbox 地图 demo
执行以下命令: npm install --save mapbox-gl// cnpm install --save mapbox-gl <template> <div style= ...
- js-null 、undefined
注意:null 转为数值时为0,而 undefined 转为数值时为 NaN. Number(undefined) // NaN Number(null) // 0 null 表示"没有对象 ...
- NAVICAT for 32位/64位 及破解工具PatchNavicat
Navicat提供多达 7 种语言供客户选择,被公认为全球最受欢迎的数据库前端用户介面工具. 它可以用来对本机或远程的 MySQL.SQL Server.SQLite.Oracle 及 Postgre ...
- tmux不自动加载配置文件.tmux.conf
/********************************************************************** * tmux不自动加载配置文件.tmux.conf * ...
- 【特征提取】MultiBlock-LBP特征
MB-LBP特征,注意区分是Multi-block LBP还是MultiScale Block LBP,区别是是否使用了多尺度方法.其中Multiscale Block LBP,来源于论文,中科院的人 ...
- selenium和PhantomJS的使用
利用selenium来进行爬取数据 import time from selenium import webdriver # 创建phantomjs浏览器对象 driver = webdriver.P ...
- 线段树专题2-(加强版线段树-可持续化线段树)主席树 orz! ------用于解决区间第k大的问题----xdoj-1216
poj-2104(区间第K大问题) #include <iostream> #include <algorithm> #include <cstdio> #incl ...
- Windows下安装pymssql
准备用Python接入Sql Server数据库,因此准备用pymssql模块. 安装有点纠结. 64位win10系统,python3.6 步骤: 首先需要配置一下freetds: 在这里下载:htt ...
- js判断是否是闰年
JavaScript判断值是否是闰年: 判断是否闰年公式:(year%4==0 && year%100 !=0) ||(year%400 ==0) var year = prompt( ...
- Java基础五(方法)
今日内容介绍1.方法基础知识2.方法高级内容3.方法案例 ###01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. ###02方法的定义格 ...