比如 ~~~~~ procedure TForm1.Create(Sender:TObject); begin AminateWindow(Handle,200,AW_BLEND);//直接调用WINDOWS API end; 这个可以直接用是因为前面uses里面已经声明过了(里面有个windows) 其他没有的,在uses里声明就可以了,不过前提是DELPHI已经封装过的API, 如果没有封装过的,不但要声明,还要写出这个函数的原形~~ 还是用DELPHI吧,WIN2000的API它都封装了,爽
比如 ~~~~~ procedure TForm1.Create(Sender:TObject); begin AminateWindow(Handle,200,AW_BLEND);//直接调用WINDOWS API end; 这个可以直接用是因为前面uses里面已经声明过了(里面有个windows) 其他没有的,在uses里声明就可以了,不过前提是DELPHI已经封装过的API, 如果没有封装过的,不但要声明,还要写出这个函数的原形~~ 还是用DELPHI6吧,WIN2000的API它都封装了,爽 (少了个6字,不好意思了)
这里有篇文章是直接调用Winsock API做的,现转贴如下. 祝进步!!!用WinSock实现POP3客户程序西安交通大学计算机系9649# 刘明华([email protected]) 一、POP3协议简介 POP3服务中包含三个阶段,它们是"身份验证"(Authorization)、"事务处理"(Transaction)和"更新"(Update)。首先,客户和服务器建立一个TCP连接(RFC 1939规定POP3服务器应该在110端口监听),服务器会发回一条欢迎信息。之后,POP3服务就进入了"身份验证"阶段。RFC 1939定义了两种身份验证的方法:USER和PASS命令,以及APOP命令;目前大多数POP3服务器使用USER和PASS命令来检验用户身份的真伪性;APOP方式则是对口令进行了加密,故而安全性有所增强。如果客户方通过了服务器的身份验证,POP3服务便进入了Transaction阶段。POP3服务器将锁住相应的邮箱以便对其进行互斥访问,这样可以确保在此Transaction中,邮箱中的邮件不会被修改和增删。在Transaction阶段,客户可以向POP3服务器以任意的顺序发送以下的命令:STAT(获取邮箱信息,可用来获取邮件的数目),LIST(获取邮件的信息),RETR(取某个邮件),DELE(给某个邮件加上删除标志,实际的删除操作在Update阶段进行),NOOP(空命令,不做任何事)和RSET(将所有邮件的删除标志清除掉)。如果客户程序在Transaction阶段向服务器发送QUIT命令,那么就会进入Update阶段,此时服务器将删除所有在Transaction阶段用DELE命令加上删除标志的邮件。不管删除操作成功与否,服务器都会关闭TCP连接,并将邮箱解锁。 二、登录POP3服务器 为了从POP3服务器上收取E-mail,程序的第一步便是登录到POP3服务器。为此,我们首先来实现一个名为POP3Login的函数,该函数的原型为:function POP3Login(Host, User, Password:String;Port:Integer=110):Integer;其中,Host为POP3服务器的主机名或者它的IP地址,User为用户名,Password为该用户的密码,Port为端口号(缺省值为110)。函数POP3Login将与POP3服务器在Port端口建立TCP连接,之后便向服务器发送USER和PASS命令。如果登录成功(即PASS命令通过),则返回与POP3服务器之间的Socket描述符;否则,关闭TCP连接,并返回INVALID_SOCKET,以表示登录失败。下面是POP3Login函数的实现。 function POP3Login(Host, User, Password:String; Port:Integer=110):Integer; var Sockfd:Integer; begin Result:=INVALID_SOCKET; Sockfd:=CreateClientSocket(Host, Port); if (Sockfd=INVALID_SOCKET) or not POP3Response(sockfd) then begin CloseSocket(Sockfd); MessageBox(0, ‘Cannot connect to server', nil,MB_ICONERROR); Exit; end; //发送USER命令 Write_Socket(sockfd,‘USER '+User+#13#10); if not POP3Response(sockfd) then begin CloseSocket(sockfd); MessageBox(0, ‘USER failed', nil,MB_ICONERROR); Exit; end; //发送PASS命令 Write_Socket(sockfd,‘PASS '+Password+#13#10); if not POP3Response(sockfd) then begin CloseSocket(sockfd); MessageBox(0, ‘PASS failed', nil,MB_ICONERROR); Exit; end; Result:=Sockfd; end; 三、收取邮件 接下来,我们来编写一个名叫POP3RetriveMail的函数,调用此函数就可以从POP3服务器下载邮件。POP3RetriveMail函数的原型为:function POP3RetriveMail(Host, User, Password:String;DeleteMail:Bool; Port:Integer=110):Integer;功能描述:从POP3服务器上收取电子邮件。收取的邮件将保存在当前目录的MailBox子目录下,返回值等于信箱中邮件的数目。 参数说明:Host为POP3主机名或者其IP地址,User和Password分别为用户名和口令,而布尔参数DeleteMail指示函数在收取邮件后是否将其从服务器上删除。由于POP3服务通常在110端口,我们将参数Port定义成缺省值为110的缺省参数(default parameter)。 function POP3RetriveMail(Host, User, Password:String;DeleteMail:Bool; Port:Integer=110):Integer; var sockfd,i:integer; hFile, c:THandle; S, T:String; begin Result:=0; Sockfd:=POP3Login(Host, User, Password, Port); if Sockfd=INVALID_SOCKET then Exit; //Get the number of mails in the maildrop //POP3服务器给STAT命令的返回信息的格式为: //+OK 邮件数目 所有邮件总的字节数 Write_Socket(sockfd,‘STAT'#13#10); S:=Socket_readline(sockfd); if UpperCase(Copy(S,1,3))<>‘+OK' then begin //error occurred CloseSocket(sockfd); Exit; end; S:=Copy(S,5,Length(S)-4); i:=Pos(‘',S); S:=Copy(S,1,i-1); Result:=StrToIntDef(S,0); for i:=1 to Result do begin //收取第i封邮件 S:=‘RETR '+IntToStr(i)+#13#10; Write_Socket(sockfd,S); //如果RETR的返回信息的第一行是+OK的话, //接下来的便是邮件的内容,邮件内容都是一行行的ASCII字符串。 //当遇到一个只包含一个"."的行时,意味着邮件内容已经结束。 if not POP3Response(sockfd) then continue; S:=GetUniqueFileName; //自定义函数 //创建一个文件,用于保存邮件 hFile:=CreateFile(PChar(s), GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0); SetFilePointer(hFile,0,nil,FILE_BEGIN); T:=Socket_ReadLine(sockfd); While T<>‘.' do begin T:=T+#13#10; WriteFile(hFile,PChar(T)^,Length(T),C,nil); T:=Socket_ReadLine(sockfd); end;//while CloseHandle(hFile); //如果参数DeleteMail为TRUE则从服务器上删除此邮件 if DeleteMail then Write_Socket(Sockfd,‘DELE '+ IntToStr(i)+#13#10); end; //for //发送QUIT命令,使已进行了的DELE操作生效 Write_Socket(sockfd,‘QUIT'#13#10); //关闭Socket(释放Socket描述符) Closesocket(sockfd); end; 四、其他函数的的实现 在以上的POP3Login函数和POP3RetriveMail函数中我们调用了一些自定义函数,下面是它们的实现代码。 * CreateClientSocket函数 function CreateClientSocket(Host:string;Port:integer):Integer; //功能:与指定的主机Host建立一个TCP连接,使用Port端口。 //返回值:如果成功返回一个Socket描述符;否则返回 INVALID_SOCKET。 var i:integer;p:^LongInt; phe:pHostEnt; sin:sockaddr_in; begin Result:=INVALID_SOCKET; sin.sin_family:=AF_INET; sin.sin_port:=htons(Port); //将主机名转换为32位的IP phe:=gethostbyname(pchar(host)); if phe<>nil then begin p:=Pointer(phe^.h_addr_list^); sin.sin_addr.s_addr:=p^; end else begin i:=inet_addr(PChar(Host)); if i<>-1 then sin.sin_addr.S_addr:=i else begin //无法获取主机Host的IP MessageBox(0, pChar(‘Cannot resolve '+Host), nil, MB_ICONERROR); Exit; end; end; //创建一个面向连接的字节流Socket Result:=socket(PF_INET,SOCK_STREAM,0); if (Result=INVALID_SOCKET) then begin MessageBox(0,‘socket() failed', nil,MB_ICONERROR); Exit; end; //使用此Socket描述符与远处的主机建立一个TCP连接 if Connect(Result,sin,sizeof(sin))=SOCKET_ERROR then begin MessageBox(0,‘connect() failed', nil,MB_ICONERROR); closesocket(Result); Result:=INVALID_SOCKET; end; end; * POP3Response函数 function POP3Response(Sockfd:Integer):Bool; //功能:检查POP3服务器返回的状态信息。 //返回值:如果是+OK,则返回TRUE;否则返回FALSE。 var S: string; begin S:=socket_readline(sockfd); if copy(s,1,3)=‘+OK' then Result:=True else Result:=False; end; * Write_Socket函数 function Write_Socket(sockfd:TSocket; const s:string):Integer; //功能:将字符串S写入sockfd begin Result:=Send(sockfd,pointer(s)^,Length(s),0) end; * Socket_Readline函数 function Socket_Readline(sockfd:Integer):String; //功能:从sockfd中读取一行(即,直至遇到换行符)。 //返回值:返回从sockfd中所读取的一行字符。 var S:String; buf:array[0..1]of Char; n:Cardinal; begin buf[0]:=#0;buf[1]:=#0; S:=‘'; n:=recv(sockfd,Buf,1,0); while n>0 do begin buf[1]:=#0; S:=S+buf; if (buf[0]=#10) then Break; n:=recv(sockfd, buf, 1, 0); end; Result:=Trim(S); end; 示例程序 下面是一个简单的示例程序,它调用POP3RetriveMail函数收取263.net上simon_liu的邮件。 Program GetMail; uses WinSock, Windows, SysUtils, POP3 in ‘POP3.pas'; var w:TWSADATA; I:integer; S:String; begin //初始化Windows Sockets动态连接库 if WSAStartup(2,w)<>0 then begin MessageBox(0,‘Initialization failed!',‘WinSock DLL Error',MB_ICONERROR); Halt; end; i:=POP3RetriveMail(‘263.net', ‘simon_liu', ‘mypass', TRUE, 110); //或者:i:=POP3RetriveMail(‘263.net', ‘simon_liu', ‘mypass', TRUE, 110); if i=0 then MessageBox(0,‘No Message!',‘GetMail',MB_ICONINFORMATION) else begin S:=IntToStr(i)+‘messages!'; MessageBox(0,PChar(S),‘New Message(s)!',MB_ICONINFORMATION); end; end. 说明:以上代码均使用Delphi 5编写;调试环境:Windows 98/Windows 2000。
~~~~~
procedure TForm1.Create(Sender:TObject);
begin
AminateWindow(Handle,200,AW_BLEND);//直接调用WINDOWS API
end;
这个可以直接用是因为前面uses里面已经声明过了(里面有个windows)
其他没有的,在uses里声明就可以了,不过前提是DELPHI已经封装过的API,
如果没有封装过的,不但要声明,还要写出这个函数的原形~~
还是用DELPHI吧,WIN2000的API它都封装了,爽
~~~~~
procedure TForm1.Create(Sender:TObject);
begin
AminateWindow(Handle,200,AW_BLEND);//直接调用WINDOWS API
end;
这个可以直接用是因为前面uses里面已经声明过了(里面有个windows)
其他没有的,在uses里声明就可以了,不过前提是DELPHI已经封装过的API,
如果没有封装过的,不但要声明,还要写出这个函数的原形~~
还是用DELPHI6吧,WIN2000的API它都封装了,爽
(少了个6字,不好意思了)