随笔分类 - Api
WINDOWS API函数
摘要:procedure TForm1.Button1Click(Sender: TObject);begin Memo1.Clear; Memo1.Lines.Add('char---' + IntToStr(SizeOf(char))); Memo1.Lines.Add('ansichar---' + IntToStr(SizeOf(ansichar))); Memo1.Lines.Add('byte---' + IntToStr(SizeOf(byte))); Memo1.Lines.Add('word---' + IntToSt
阅读全文
摘要:对于守护中间件是非常有用的。中间件不可能绝对的稳定而不出问题,中间件有可能因比较严重的错误导致当机或者进程被人为地错误地关闭了中间件。有了这个自动守护进程的存在,这一切的问题都可以迎刃而解。program Monitor;// {$APPTYPE CONSOLE}uses Winapi.Windows, System.SysUtils, ProcLib in 'ProcLib.pas';var Mutex, h: HWND;const c_AppName = 'server.exe'; c_ClassName = 'Tf_MainForm';be
阅读全文
摘要:窗口、控件以及字体大小均随分辨率而变化,让界面适应各种不同的分辨率。var FWidth: Integer;begin inherited; if (Screen.width <> 1024) then begin FWidth := Self.width; Scaled := True; Font.Size := (Self.width DIV FWidth) * Font.Size; // 字体大小调整 ScaleBy(Screen.width, 1024); // 控件大小调整 Self.Height := longint(Height) * lon...
阅读全文
摘要:如果WINDOWS系统的短日期格式为“yyyy/m/d”,执行下面的代码会报错:2013-01-29 00:00:00不是合法的日期procedure TFrmQuerySale.FormShow(Sender: TObject);varsDate: string;begininherited;// 默认查当天的销售数据sDate := FormatDateTime('yyyy-mm-dd', Now);DateTimePicker1.DateTime := StrToDateTime(sDate + ' 00:00:00');DateTimePicker2.D
阅读全文
摘要:type TOutBufPassThrough = record // 用于USB接口打印机开钱箱 // 调用windows.extEscape可以直接用extEscape(handle, PASSTHROUGH, sizeOf(outBuf), @outBuf, 0, nil)向设备发送esc命令
阅读全文
摘要:客户端登录的时候,自动同中间件校对时间。procedure TdmCommonFun.setLocalDateTime(Value: TDateTime);var lSystemDateTime: TSystemTime;begin DateTimeToSystemTime(Value, lSystemDateTime); SetLocalTime(lSystemDateTime);end;
阅读全文
摘要:function TdmCommonFun.GetIdeSerialNumber: AnsiString; stdcall;const IDENTIFY_BUFFER_SIZE = 512;type TIDERegs = packed record bFeaturesReg: Byte; // Used for specifying SMART "commands". bSectorCountReg: Byte; // IDE sector count register bSectorNumberReg: Byte; // IDE sector number registe
阅读全文
摘要:procedure TForm1.Button1Click(Sender: TObject);var s, b: AnsiString; a: array[0..9] of Byte;begin s := 'test'; FillChar(a, SizeOf(a), ''); Move(s[1], a, SizeOf(a)); SetLength(b, SizeOf(a) + 1); Move(a, b[1], SizeOf(a)); Caption := b;end;
阅读全文
摘要:对于一些小文件,用普通的文件流就可以很好的解决,可是对于超大文件,比如2G或者更多,文件流就不行了,所以要使用API的内存映射的相关方法,即使是内存映射,也不能一次映射全部文件的大小,所以必须采取分块映射,每次处理一小部分。先来看几个函数CreateFile :打开文件GetFileSize : 获取文件尺寸CreateFileMapping :创建映射MapViewOfFile :映射文件看MapViewOfFile的帮助,他的最后两个参数都需要是页面粒度的整数倍,一般机器的页面粒度为64k(65536字节),而我们实际操作中,一般都不是这样规矩的,任意位置,任意长度都是可能的,所以就要做一
阅读全文
摘要:-procedure SplitFile(FileName : TFileName; FilesByteSize : Integer) ;// FileName == file to split into several smaller files// FilesByteSize == the size of files in bytesvarfs, ss: TFileStream;cnt : integer;SplitName: String;beginfs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;tr
阅读全文
摘要:// 单元功用: 线程池// 单元设计: 陈新光// 设计日期: 2012-09-03unit ThreadPool;interfaceuses system.Classes, system.SyncObjs, system.SysUtils, system.DateUtils, GlobalVar, Vcl.Forms, Winapi.Windows;type TWorkThread = class(TThread) private FThreadMethod: TThreadMethod; Fsync: Boolean; FEvent: THandle; protected procedu
阅读全文
摘要:单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。传统多线程方案中,一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出。这就是即时创建,即时销毁的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务执行时间很短,而且执行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态。t1: 线程创建时间t2: 线程执行时间,包括线程的同步等时间t3: 线程销毁时间线程本身的开销所占的比例为(t1+t3)/(t1+t2+t3)。如果线程执行的时间很短,这笔开销可能占到20%~50%左右。如果任务执行很频繁的话,这笔开销将是不可忽
阅读全文
摘要:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, StdCtrls, ComCtrls, Grids, DBGrids;type PNodeRec=^TNodeRec; TNodeRec=record id: string; name: string; pid: string; end; TForm1 = class(TForm) TreeView1: TTreeView...
阅读全文
摘要:关于延迟时间的一点智慧一般的做法:Sleep(2000); // 延迟2秒此种做法有俩个弊端:(1)如果实际需要的延迟时间不需要2秒,则明显有延迟时间浪费;(2)如果实际需要的延迟时间超过2秒,则很可能发生不可预料的错误。改进的做法: repeat Sleep(10); until FileExists('c:\temp\invoice.pdf')=True;优点:将一次大的延迟时间分割成小的,一旦条件成立就退出了延迟,使得延迟的时间同实际需要的几乎一样。也杜绝了前面第二种情况错误的发生。
阅读全文
摘要:program Monitor;// {$APPTYPE CONSOLE}uses Winapi.Windows, System.SysUtils, ProcLib in 'ProcLib.pas';var Mutex: HWND;const c_AppName = 'server.exe';begin Mutex := Winapi.Windows.CreateMutex(nil, False, 'Monitor'); if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then Ex
阅读全文
摘要:unit uDBJson;interface{$HINTS OFF}uses SysUtils, Classes, Variants, DB, DBClient, SuperObject;type TTableJSon = class private const cstFieldType = 'FieldType'; const cstFieldName = 'FieldName'; const cstFieldSize = 'FieldSize'; const cstJsonType = 'JsonType'; const cs
阅读全文
摘要:unit untMemoryPool;interface{$WARNINGS OFF}uses System.Classes, System.SysUtils, Winapi.Windows;type //Node for block memory pMemNode = ^TMemNode; TMemNode = record Free : Boolean; //Is free? FSize: Integer; //Block Size FAddr: Pointer; //Address pointer to memory allocated FNext: pMemNode; //Next b
阅读全文
摘要:function CnPYIndex(const CnString: string): string;{ 返回中文的拼音首字母}const ChinaCode: array[0..25, 0..1] of Integer = ((1601, 1636), (1637, 1832), (1833, 2077), (2078, 2273), (2274, 2301), (2302, 2432), (2433, 2593), (2594, 2786), (9999, 0000), (2787, 3105), (3106, 3211), (3212, 3471), (3472, 3634), (363
阅读全文
摘要:最小化到任务栏postmessage(Self.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);最大化或还原procedure Tf_MainForm.RzToolButton1Click(Sender: TObject);var abd: TAppBarData;begin inherited; if WindowState=wsnormal then begin WindowState := wsMaximized; // BorderStyleÎ为 bsNone abd.cbSize := sizeof(abd); SHAppBarMessage(ABM
阅读全文
摘要:procedure LogInfo(msg: string);// 功能: 服务端日志var p: PChar;begin try GetMem(p, (Length(msg) + 1) * sizeof(char)); Move(msg[1], p^, (Length(msg) + 1) * sizeof(char)); PostMessage(Application.MainForm.Handle, WM_LOG, integer(p), 0); except Exit; end;end;procedure Tf_MainForm.Log(var msg: TMessage);var p:
阅读全文