假设你的消息这样定义:
Const
WM_YOURMSG=WM_USER+100;
你的过程定义可以这样:
procedure YourProc(var MSG:TMsg);message WM_YOURMSG;
这样,当你的窗口收到该消息时,将调用这个过程。
例如:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
Const
WM_MINE=WM_USER+100;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure Mine(var msg:TMSG);message WM_MINE;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Mine(var msg: TMSG);
begin
Showmessage('OK');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Sendmessage(handle,WM_MINE,0,0);
end;
end.
这个单元定义了一个消息,当按下按钮时,向自己窗口发送这个消息(当然,不一定发送到自己的窗口,处理消息的过程也可以在其他地方),然后弹出个对话框。这当然是多此一举,不过,只是为了说明使用方法。
至于想处理MOUSECLICK时的MOUSE位置和状态,你可以不处理ONCLICK事件,而在ONMOUSEDOWN事件里处理。这个事件提供的参数分别告诉了你
Sender:那一个按钮接收这个鼠标事件:
Shift:当前鼠标的按钮状态是什么样,其他键盘状态是什么样,我们一般用
if Shift=[ssleft]来判断是否鼠标左键点击,有关方括号里的值,你可以查询DELPHI的在线帮助,关键字:TShiftState
Button:表明那一个鼠标键被按下,
X,Y:鼠标在接收这个鼠标事件时的位置,如果你需要的是屏幕的位置可以这样做:
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
CurrentPos:TPoint;
begin
if shift=[ssRight] then begin
CurrentPos:=TButton(Sender).clientToScreen(point(x,y));
{或者,GetcursorPos(CurrentPos)}
Showmessage(format('X:%d,Y:%d',[CurrentPos.x,CurrentPos.y]));
end;
//这个过程将使你鼠标在按钮上点下时弹出对话框,标明当前的位置。
end;
;
这样CurrentPos的X,Y就是当前屏幕的坐标。
posted @
2009-02-02 23:06 小叶子 阅读(4780) |
评论 (0) |
编辑 收藏
这个函数是GetHostByName()异步版本
这个函数不会引起阻塞,由于使用时要用到消息,所以有点麻烦,不过会者不难
声明如下:
HANDLE PASCAL FAR WSAAsyncGetHostByName ( HWND hWnd,
unsigned int wMsg, const char FAR * name, char FAR * buf,
int buflen );
hWnd 当异步请求完成时,应该接收消息的窗口句柄.
wMsg 当异步请求完成时,将要接收的消息.
name 指向主机名的指针.
buf 接收hostent数据的数据区指针.注意该数据区必须大于hostent结构的大小.这是因为不仅Windows Sockets实现要用该数据区域容纳hostent结构,hostent结构的成员引用的所有数据也要在该区域内.建议用户提供一个MAXGETHOSTSTRUCT字节大小的缓冲区.
buflen 上述数据区的大小.
我们用这个函数实现上节中同一功能:得到网站IP
全部代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
//下面自己定义一个消息,因为这个函数必须用到
const
wm_getip=wm_user+100;//自己定义一个消息,
type
Tgetip=record//消息的结构
msg:word;
wparam:word;
lparam:word;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
procedure mymsg(var msg:Tgetip);Message wm_getip;//这就是消息函数
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
winsock;
{$R *.dfm}
var
WData:tWSAData;
HEnt:HostEnt;
IPad:string;
h:thandle;
procedure tform1.mymsg(var msg:tgetip);
begin
with HEnt do
IPad:=Format('%d.%d.%d.%d',[Byte(h_addr^[0]),Byte(h_addr^[1]),Byte(h_addr^[2]),Byte(h_addr^[3])]);
edit2.Text:=HEnt.h_name;
edit3.Text:=ipad;//得到ip
WSACleanup;//注销
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WSAStartup(2,WData);//初始
h:=WSAAsyncGetHostByName(self.Handle,wm_getip,pchar(edit1.Text),pchar(@hent),MAXGETHOSTSTRUCT)
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
wsacancelasyncrequest(h);//可用于终止,不会引起阻塞
end;
end.
posted @
2009-02-02 22:06 小叶子 阅读(943) |
评论 (0) |
编辑 收藏
gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。
所以用前定义hostent结构,并是一个指针
var
HEnt:PHostEnt;
PHostEnt在delphi定义如下
type
PHostEnt = ^THostEnt;
{$EXTERNALSYM hostent}
hostent = record
h_name: PChar;//主机名
h_aliases: ^PChar;//别名
h_addrtype: Smallint;
h_length: Smallint;
case Byte of
0: (h_addr_list: ^PChar);
1: (h_addr: ^PChar)//IP地址
end;
THostEnt = hostent;
下面写个例子
得到网站的IP
放三个edit在窗口上和一个button
uses
winsock;
procedure TForm1.Button1Click(Sender: TObject);
var
WData:TWSAData;
HEnt:PHostEnt;
ClName,IPad:string;
begin
WSAStartup(2,WData);//初始
//Gethostname(pchar(ClName),255);得到本机IP
HEnt:=GetHostByName(PChar(edit1.Text));//本机改成clname
with HEnt^ do
IPad:=Format('%d.%d.%d.%d',[Byte(h_addr^[0]),Byte(h_addr^[1]),Byte(h_addr^[2]),Byte(h_addr^[3])]);
edit2.Text:=hent^.h_name;//主机名
edit3.Text:=ipad;//得到ip
WSACleanup;//注销
end;
运行结果:(用:www.baidu.com测试)
edit1: www.baidu.com
edit2: www.a.shifen.com
edit3: 123.235.44.66
posted @
2009-02-02 18:34 小叶子 阅读(2505) |
评论 (1) |
编辑 收藏
WSA是windows socket API简称
1 在delphi用这些API时,应先先明
WSAStartup();//初始
WSACleanup;//注销
后面介绍一些简单函数的使用
我也是学了再写,说错的地方指明,这既是自己的笔记
也是大家的参考
2、socket函数
用于生成socket(soket Descriptor)
[声明]
SOCKET socket(int af,int type,int protocol);
[参数]
af - 地址家族(通常使用:AF_INET)
type - socket的种类
SOCK_STREAM : 用于TCP协议
SOCK_DGRAM : 用于UDP协议
protocol - 所使用的协议
[返回值]
当函数成功调用时返回一个新的SOCKET(Socket Descriptor)
失败时返回INVALID_SOCKET.
3、inet_addr函数
把好象"xxx.xxx.xxx.xxx"的10进制的IP地址转换为32位整数表示方法
[声明]
unsigned long inet_addr ( const char FAR *cp );
[参数]
cp - 指向用"xxx.xxx.xxx.xxx"的10进制来表示的IP地址字符串的指针
[返回值]
当函数成功调用时返回用32位整数表示的IP地址(按网络字节排列顺序)
失败时返回INADDR_NONE.
4、gethostbyname函数
可以从主机名获取主机资料.
[声明]
struct hostent FAR * gethostbyname ( const char FAR *name );
[参数]
name - 指向主机名字符串的指针
[返回值]
当函数成功调用时返回主机信息
失败时返回NULL(空值)
5、Bind函数
指定本地IP地址所使用的端口号时候使用
[声明]
int bind ( SOCKET s , const struct sockaddr FAR *addr , int namelen );
[参数]
s - 指向用Socket函数生成的Socket Descriptor
addr - 指向Socket地址的指针
namelen - 该地址的长度.
[返回值]
当函数成功调用时返回0
调用失败时返回 SOCKET_ERROR
6、connect函数
用于与服务器建立连接,发出连接请求,必须在参数中指定服务器的IP地址和端口号
[声明]
int connect (SOCKET s , const struct sockaddr FAR *name , int namelen );
[参数]
s - 指向用Socket函数生成的Socket Descriptor
name - 指向服务器地址的指针
namelen - 该地址的长度.
[返回值]
当函数成功调用时返回0
调用失败时返回 SOCKET_ERROR
7、select函数
可以用于调查一个或多个SOCKET的状态.
[声明]
int select ( int nfds , fd_set FAR *readfds , fd_set FAR *writefds , fd_set FAR *exceptfds , const struct timeval FAR *timeout );
[参数]
nfds - 在WINDOWS SOCKET API 中该参数可以忽略,通常赋予NILL值
readfds - 由于接受的SOCKET设备的指针
writefds - 用于发送数据的SOCKET设备的指针
exceptfds - 检查错误的状态
timeout - 超时设定
[返回值]
返回大于0的值时,表示与条件相符的SOCKET数
返回0表示超时
失败时返回SOCKET_ERROR
8、recv函数
利用Socket进行接受数据.
[声明]
int recv ( SOCKET s , char FAR *buf , int len , int flags );
[参数]
s - 指向用Socket函数生成的Socket Descriptor
buf - 接受数据的缓冲区(数组)的指针
len - 缓冲区的大小
flag - 调用方式(MSG_PEEK 或 MSG_OOB)
[返回值]
成功时返回收到的字节数.
如果连接被中断则返回0
失败时返回 SOCKET_ERROR
9、sendto函数
利用Socket进行发送数据.
[声明]
int sendto ( SOCKET s , const char FAR *buf , int len , int flags , const struct sockaddr FAR *to , int token );
[参数]
s - 指向用Socket函数生成的Socket Descriptor
buf - 接受数据的缓冲区(数组)的指针
len - 缓冲区的大小
flag - 调用方式(MSG_DONTROUTE , MSG_OOB)
to - 指向发送方SOCKET地址的指针
token - 发送方SOCKET地址的大小
[返回值]
成功时返回已经发送的字节数.
失败时返回SOCKET_ERROR
posted @
2009-02-02 18:25 小叶子 阅读(466) |
评论 (0) |
编辑 收藏
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
OpenDialog1: TOpenDialog;
Edit1: TEdit;
procedure BitBtn1Click(Sender: TObject);
Procedure Click(Sender:TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
butt:tbitbtn;
p:string;
Procedure tform1.Click(Sender:TObject);
begin
winexec(pchar(p),1);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if edit1.Text='' then
begin
showmessage('请写一个路径');
exit;
end;
p:=edit1.Text;
butt:=tbitbtn.Create(self);
butt.Width:=70;
butt.Left:=60;
butt.Height:=50;
butt.Top:=70;
butt.Parent:=form1;
butt.onClick:=Click;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
stream:tstream;
begin
stream:=tfilestream.Create('12.bb',fmcreate);
try
stream.WriteComponent(butt);
finally
stream.Free;
end;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
var
stream:tstream;
begin
stream:=tfilestream.Create('12.bb',fmopenread);
try
butt:=tbitbtn(stream.ReadComponent(nil));
butt.Parent:=form1;
butt.OnClick:=Click; //赋予butt的OnClick事件
p:=edit1.Text;
finally
stream.Free;
end;
end;
begin
registerclass(tbitbtn);
end.
posted @
2009-02-01 23:17 小叶子 阅读(558) |
评论 (0) |
编辑 收藏
人多,问题多,帮人家解决问题就是提高自己
delphi群:
本群已满: 79598397
500人超群: 29803842
汇编反汇编群:
54876861
本人经济原因,开个淘宝了,请大家帮点击一下,加点流量,对您可能有帮助
点击查看1
个人网站,纯HTML
淋巴消炎贴官网
posted @
2009-02-01 13:45 小叶子 阅读(257) |
评论 (0) |
编辑 收藏
新建工程放三个TTimer
三个TTimer中 1和3是:
Interval = 400
2是:Interval = 150
implementation
{$R *.dfm}
var
p:trect;
procedure TForm1.Timer1Timer(Sender: TObject);
var
d:tpoint;
begin
getcursorpos(d);
if p.Top<2 then
begin
if not(((d.X>p.Left) and (d.X<p.Right) and (d.Y>p.Top) and (d.y<p.Bottom)))then
begin
movewindow(self.Handle,p.Left,0-(p.Bottom-p.Top)+2,p.Right-p.Left,p.Bottom-p.Top+2,true);
form1.
timer1.Enabled:=false;
timer3.Enabled:=true;
end;
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
GetWindowRect(self.Handle,p);
end;
procedure TForm1.Timer3Timer(Sender: TObject);
var
d:tpoint;
begin
getcursorpos(d);
if ((d.X>p.Left) and (d.X<p.Right) and (d.Y>p.Top) and (d.y<p.Bottom)) then
begin
movewindow(self.Handle,p.left,-2,p.Right-p.Left,p.Bottom-p.Top,true);
SetActiveWindow(self.Handle);
timer1.Enabled:=true;
timer3.Enabled:=false;
end;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if p.Top<-2 then
movewindow(self.Handle,p.left,-2,p.Right-p.Left,p.Bottom-p.Top,true);
end;
end.
窗体文件内容:
object Form1: TForm1
Left = 801
Top = 87
Width = 193
Height = 505
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnMouseMove = FormMouseMove
PixelsPerInch = 96
TextHeight = 13
object Timer1: TTimer
Interval = 400
OnTimer = Timer1Timer
Left = 24
Top = 48
end
object Timer2: TTimer
Interval = 150
OnTimer = Timer2Timer
Left = 80
Top = 56
end
object Timer3: TTimer
Interval = 400
OnTimer = Timer3Timer
Left = 32
Top = 120
end
end
posted @
2009-02-01 01:03 小叶子 阅读(254) |
评论 (0) |
编辑 收藏
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
ed:tedit;
procedure TForm1.FormCreate(Sender: TObject);
begin
button1.Caption:='创建';
button2.Caption:='保存';
button3.Caption:='载入';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//创建一个edit
ed:=tedit.Create(self);
ed.Height:=20;
ed.Width:=150;
ed.Top:=50;
ed.Left:=70;
ed.Parent:=form1;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
stream:tstream;
begin
//保存在一个文件内
stream:=tfilestream.Create('123.bb',fmcreate);
try
stream.WriteComponent(ed);
finally
stream.Free;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
stream:tstream;
begin
//从文件内导入
stream:=tfilestream.Create('123.bb',fmopenread);
try
ed:=tedit(stream.ReadComponent(nil));
ed.Parent:=form1;
finally
stream.Free;
end;
end;
begin
registerclass(tedit);
end.
posted @
2009-02-01 00:57 小叶子 阅读(813) |
评论 (0) |
编辑 收藏
ATOM 原子(原子表中的一个字符串的参考)
BOOL 布尔变量
BOOLEAN 布尔变量
BYTE 字节(8位)
CCHAR Windows字符
CHAR Windows字符
COLORREF 红、绿、蓝(RGB)彩色值(32位)
Const 变量,该变量的值在执行期间保持为常量
CRITICAL_SECTION 临界段对象
CTRYID 国名标识符
DLGPROC 指向一个对话框过程的指针
DWORD 双字(32位)
ENHMFENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举增强的元文件记录
ENUMRESLANGPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举资源语言。
ENUMRESNAMEPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举资源名称。
ENUMRESTYPEPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举资源类型。
FARPROC 指向一个回调函数的指针
FLOAT 浮点变量
FMORDER 32位字体映射值的数组
FONTENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举字体
GOBJENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举图形设备接口(GDI)对象
HACCEL 加速键表句柄
HANDLE 对象的句柄
HBITMAP 位图句柄
HBRUSH 画刷句柄
HCONV 动态数据交换(DDE)会话句柄
HCONVLIST DDE会话句柄
HCURSOR 光标句柄
HDC 设备描述表(DC)句柄
HDDEDATA DDE数据句柄
HDLG 对话框句柄
HDWP 延期窗口位置结构句柄
HENHMETAFILE 增强原文件句柄
HFILE 文件句柄
HFONT 字体句柄
HGDIOBJ GDI对象句柄
HGLOBAL 全局内存块句柄
HHOOK 钩子句柄
HICON 图标句柄
HINSTANCE 实例句柄
HKEY 登记关键字句柄
HLOCAL 局部内存块句柄
HMEMU 菜单句柄
HMETAFILE 元文件句柄
HMIDIIN 乐器的数字化接口(MIDI)输入文件句柄
HMIDIOUT MIDI输出文件句柄
HMMIO 文件句柄
HOOKPROC 指向一个应用程序定义的钩子函数的指针
HPALETTE 调色板句柄
HPEN 画笔句柄
HRGN 域句柄
HRSRC 资源句柄
HSZ DDE字符串句柄
HWAVEIN 波形输入文件句柄
HWAVEOUT 波形输出文件句柄
HWINSTA 工作站句柄
HWND 窗口句柄
INT 符号整数
LANGID 语言标识符
LCID 所在国(Locale)标识符
LCTYPE 所在国类型
LINEDDAPROC 指向一个回调函数的指针,该回调函数处理行坐标
LONG 32位符号整数
LP 指向一个以"NULL"结束的Unicode(TM)字符串的指针
LPARAM 32位消息参数
LPBOOL 指向一个布尔变量的指针
LPBYTE 指向一个字节的指针
LPCCH 指向一个Windows字符常量的指针
LPCCHOOKPROC 指向一个应用程序定义的钩子函数的指针
LPCFHOOLPROC 指向一个应用程序定义的钩子函数的指针
LPCH 指向一个Windows字符的指针
LPCOLORREF 指向一个COLORREF值的指针
LPCRITICAL_SECTION 指向一个临界段对象的指针
LPCSTR 指向一个以"NULL"结束的WINDOWS字符串常量的指针
LPCTSTR 指向一个以"NULL"结束的Unicode或Windows字符串常量的指针
LPCWCH 指向一个以"NULL"指向一个以"NULL"结束的Unicode字符常量的指针
LPCWSTR 指向一个以"NULL"指向一个以"NULL"结束的Unicode字符串常量的指针
LPDWORD 指向一个无符号双字(32位)的指针
LPFRHOOLPROC 指向一个应用程序定义的钩子函数的指针
LPHANDLE 指向一个句柄的指针
LOHANDLER_FUNCTION 指向一个处理程序函数的指针
LPHWAVEIN 指向一个波形输入文件句柄的指针
LPHWAVEOUT 指向一个波形输出文件句柄的指针
LPINT 指向一个符号整数的指针
LPLONG 指向一个符号长整数(32位)的指针
LPOFNHOOKPROC 指向一个应用程序定义的钩子函数的指针
LPPRINTHOOKPROC 指向一个应用程序定义的钩子函数的指针
LPSETUPHOOKPROC 指向一个应用程序定义的钩子函数的指针
LPTSTR 指向一个以NULL结束的Unicode或Windows字符串的指针
LRESULT 消息处理的符号结果
LPVOID 指向任何类型的指针
LPWSTR 指向一个以"NULL"结束的Unicode字符串的指针
LUID 局部唯一的标识符
MCIDEVICEID 媒体控制接口(MCI)设备标识符
MFENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举元文件记录
MMRESULT 多媒体消息的处理结果
NPSTR 指向一个以"NULL"结束的Windows字符串的指针
NWPSTR 指向一个以"NULL"结束的Unicode字符串的指针
PBOOL 指向一个布尔变量的指针
PBYTE 指向一个字节的指针
PCCH 指向一个Windows字符常量的指针
PCH 指向一个Windows字符的指针
PCHAR 指向一个Windows字符的指针
PCRITICAL_SECTION 指向一个临界段对象的指针
PCSTR 指向一个以"NULL"结束的Windows字符串常量的指针
PCWCH 指向一个Unicode字符常量的指针
PCWSTR 指向一个以"NULL"结束的Unicode字符串常量的指针
PDWORD 指向一个无符号双字的指针
PFLOAT 指向一个浮点变量的指针
PFNCALLBACK 指向一个回调函数的指针
PHANDLE 指向一个句柄的指针
PHANDLER_ROUTINE 指向一个处理程序的指针
PHKEY 指向一个登记关键字的指针
PINT 指向一个符号整数的指针
PLONG 指向一个符号长整数的指针
PLUID 指向一个局部唯一的表示符(LUID)的指针
PROPENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举窗口特征
PSHORT 指向一个符号短整数的指针
PSID 指向一个加密标识符(SID)的指针
PSTR 指向一个以"NULL"结束的Windows字符串的指针
PSZ 指向一个以"NULL"结束的Windows字符串的指针
PTCH 指向一个Windows或Unicode字符的指针
PTCHAR 指向一个Windows或Unicode字符的指针
PTSTR 指向一个以"NULL"结束的Windows或Unicode字符串的指针
PUCHAR 指向一个无符号Windows字符的指针
PUINT 指向一个无符号整数的指针
PULONG 指向一个无符号长整数的指针
PUSHORT 指向一个无符号短整数的指针
PVOID 指向任何类型的指针
PWCH 指向一个Unicode字符的指针
PWCHAR 指向一个Unicode字符的指针
PWORD 指向一个无符号字的指针
PWSTR 指向一个以"NULL"结束的Unicode字符串的指针
REGSAM 登记关键字的加密掩码
SC_HANDLE 服务句柄
SERVICE_STATUS_HANDLE 服务状态值句柄
SHORT 短整数
SPHANDLE 指向一个句柄的指针
TCHAR Unicode或Windows字符
TIMERPROC 指向一个应用程序定义的定时器回调函数的指针
UCHAR 无符号Windows字符
UINT 无符号整数
ULONG 无符号长整数
USHORT 无符号短整数
VOID 任何类型
WCHAR Unicode字符
WNDENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举窗口
WNDPROC 指向一个应用程序定义的窗口过程的指针
WORD 无符号字(16位)
WPARAM 32位消息参数
YIELDPROC 指向一个输出回调函数的指针
posted @
2009-01-24 01:07 小叶子 阅读(338) |
评论 (0) |
编辑 收藏
在(3)中我们会一块块的读取
那么,如果说我们在每块内加点东西,那么程序就不能运行,再减去你加的那些,程序又能以运行
由此你可以想到对自己的程序(加密),这里不是真正加密
我做的程序是在向文件写入时写入两次,这种方法你的程序会加大一倍,如果你有时间,那就用char类型加密,(别有数组4096)加密部分代码,其它不变就可以
代码如下
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Edit1: TEdit;
Edit2: TEdit;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var SouFile,DescFile:TFileStream;
Buf:Array [1..4096] of Char;
iLen:integer;
begin
if (edit1.Text='') or (edit2.Text='') then
begin
application.messagebox('请填写正确路径','提示',mb_ok);
exit;
end;
SouFile:=TfileStream.Create(edit1.Text,fmOpenRead or fmShareDenyWrite);
DescFile:=TFileStream.Create(edit2.Text,fmCreate);
SouFile.Position:=0;
While SouFile.Position <=SouFile.Size do
begin
If (SouFile.Size-SouFile.Position)>4096 Then
Begin
SouFile.ReadBuffer(Buf,sizeof(buf));
DescFile.WriteBuffer(Buf,sizeof(buf));
DescFile.WriteBuffer(Buf,sizeof(buf));
end
else
begin
iLen:=SouFile.Size-SouFile.Position;
SouFile.ReadBuffer(Buf,iLen);
DescFile.WriteBuffer(Buf,iLen);
Break;
End;
end;
SouFile.Free();
DescFile.Free();
application.messagebox('加密成功','good',mb_ok);
end;
procedure TForm1.Button2Click(Sender: TObject);
Var SouFile,DescFile:TFileStream;
buf1, Buf:Array [1..4096] of Char;
iLen:integer;
begin
if (edit1.Text='') or (edit2.Text='') then
begin
application.messagebox('请填写正确路径','提示',mb_ok);
exit;
end;
SouFile:=TfileStream.Create(edit1.Text,fmOpenRead or fmShareDenyWrite);
SouFile.Position:=0;
SouFile.ReadBuffer(Buf,sizeof(buf));
SouFile.ReadBuffer(Buf1,sizeof(buf));
if buf<>buf1 then
begin
application.messagebox('些程序未加密','提示',mb_ok);
SouFile.Free();
exit;
end;
DescFile:=TFileStream.Create(edit2.Text,fmCreate);
SouFile.Position:=0;
While SouFile.Position <=SouFile.Size do
begin
If (SouFile.Size-SouFile.Position)>4096 Then
Begin
SouFile.ReadBuffer(Buf,sizeof(buf));
DescFile.WriteBuffer(Buf,sizeof(buf));
SouFile.Position:=SouFile.Position+4096;
end
else
begin
iLen:=SouFile.Size-SouFile.Position;
SouFile.ReadBuffer(Buf,iLen);
DescFile.WriteBuffer(Buf,iLen);
Break;
End;
end;
SouFile.Free();
DescFile.Free();
application.messagebox('复原成功','good',mb_ok);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if opendialog1.Execute then
edit1.Text:=opendialog1.FileName;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
if savedialog1.Execute then
edit2.Text:=savedialog1.FileName;
end;
end.
如果自己做不好可以下载我的源码试着学
下载地址
http://www.cnitblog.com/Files/shuyezi122/加解.rar
posted @
2009-01-23 22:57 小叶子 阅读(2003) |
评论 (0) |
编辑 收藏