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. 线程的组成 ① 一个是线程的内核 ...
随机推荐
- 在使用MyCat和MySqL时的错误总结
在mysql中,无法连接虚拟机中的mysql. 原因:防火墙没有关闭 解决方案:service iptables stop 在mycat中,无法打开数据库的表, 原因:mycat在配置文件中设置的是自 ...
- Ubuntu Core 网络配置
/********************************************************************************* * Ubuntu Core 网络配 ...
- shell 脚本中将输出内容赋值给一个变量时的换行问题
for ((i=0; i<4; i++) do ....... done 如果使用 echo $a 输出变量,则变量中的 换行都会被忽略掉,所有内容输出到一行 而使用 echo "$a ...
- Python 金融数据分析库及相关框架
BackTest框架库: PyAlgoTrade ZipLine 金融数据分析库: pandas
- HTML+CSS之background
第一个专题--background属性 今天写一下background属性,具体如下: 1.background-color:默认值:transparent,这是我们在做网页时,经常使用的属性,较为简 ...
- 安装排错 max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
https://blog.csdn.net/cookzrk/article/details/80179006 转载:https://my.oschina.net/u/2510243/blog/8105 ...
- servlet创建项目过程中,servlet内容重写的两种搭建,tomcat的配置,class的存放位置,web.xml的搭建等注意事项与易错点
运行一个servlet项目:需要做这些前提工作: 1.配置tomcat,在server选项卡的设置也就基本的设置,HTTP port与JMX port等端口号:基本都是默认的.这里需要注意的是,有的教 ...
- SVN提交强制输入日志信息
在团队开发时,因一些团队成员提交代码时没有写提交说明的习惯,为了规范版本管理,增强大家的团队意识,上网找到了强制录入提交日志的方法.方法如下: 一.编写bat文件,命名为pre-commit.bat, ...
- http笔记汇总
网上笔记参考: https://juejin.im/post/5b34e6ba51882574d20bbdd4#heading-8 http://dy.163.com/v2/article/detai ...
- MySQL中视图
视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用 ...