⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9930.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:
  INSERT INTO bgqxk (保管期限) VALUES ('永久') 
  INSERT INTO bgqxk (保管期限) VALUES ('长期') 
  INSERT INTO bgqxk (保管期限) VALUES ('短期') 
  ENDIF 
  CLOSE DATABASE 
  
****************************************************************

                  DELPHI:检测存在打印机  

  Printers是专门用来控制打印机的,可是在没有安装打印机时,
却会提示I/O错误,所以必须有一个检测是否存在打印机的方法,我
试过很多方法,可是I/O错误总是比我的判断早出现,所以采用以下
的烂招来检测打印机。首先在uses增加Printers,再准备一个列表框
ComboBox1,其属性Visible设为FALSE,然后在打印之前执行下列语
句,那么就可以检测到是否存在打印机了:

procedure TForm1.ButtonClick(Sender: TObject); 
begin ComboBox1.Clear;
ComboBox1.Items.Assign(Printer.Printers);
if ComboBox1.Items.CommaText=''then Messagedlg('你需要安装打
印机才能打印!',mtError,[mbOk],0);
else Form1.Print; 
end;  

****************************************************************

                            监视POP3信箱
                             
                  刘明华  西安交通大学9649#(710049)

----本文将向大家介绍怎样编写自己的信箱监视程序,程序将直接调用
WinSock函数来进行网络通信。除了具备WinSock编程知识之外,还必须了
解POP3协议。下面是对POP3的一个粗略的介绍,读者可以参看RFC 1225更
为详细地了解该协议。

一、关于POP3协议
----POP3服务器程序通常在TCP端口110提供服务。当客户想要使用服务时,
它便与服务器建立一个TCP连接。一旦连接建立,POP3服务器就向客户发送
一条欢迎消息。然后客户开始给服务器发送命令,服务器则给出相应的回
答。POP3的命令由一个关键词或者关键词加参数组成。每个命令以回车换
行(0xD0xA)作为结束标志。对于所有的命令,POP3服务器都会提供一个
回答。服务器的回答由一个状态标志加一些附加信息组成。目前使用的两
个标志是“+OK”和“-ERR”,分别表示客户的命令是否合法。所有的
回答也是以回车换行结束。
----与本文讨论的话题相关的四个POP3命令是USER、PASS、LIST和QUIT。

USER命令                                
格式USER name 
----其中name是用户在该POP3服务器上的用户标识。客户应该在接到服务器
的欢迎消息后或者在上一个USER或者PASS失败之后可以发送此命令。

PASS命令
格式PASS string 

----其中string为该用户的密码。客户在发送了USER命令并且收到了+OK的
回答之后方可发送此命令。如果用户名和密码都正确,服务器回答+OK,否
则-ERR。

LIST命令 
格式LIST 
----如果该用户有邮件,则LIST命令会回答+OK,并列出所有邮件的标识符
和大小(每个邮件一行),最后一个仅包含一个句点的行(0xD0xA0x2E)表
示整个回答的结束。如果该用户没有邮件,有些服务器会返回-ERR,有些
在可能返回一个+OK和一个仅包含一个句点的行。当然,客户必须在PASS命
令通过之后客户程序才能给服务器发送LIST命令。

QUIT命令

----从POP3服务器上退出登录。

二、实现相关函数
----接下来我们按照POP3协议所定义的通信规则来实现一个名叫POP3CheckMail
的函数,只要调用此函数,我们就可以检测信箱了。
----下面的代码是用与Delphi4兼容的Pascal语言实现的,我们必须包含
WinSock单元,并且在调用下列函数之前初始化好WinSock动态连接库。初始
化WinSock动态连接库的代码如下:

----if WSAStartup( $002, wsadata)<>0 then Halt; 

----POP3CheckMail的原型如下: 

----function POP3CheckMail(Email,Password:String;var MailList:
TStringList;var ErrorMsg:String):Bool; 

----参数说明: 

----Email和Password分别为用户的email信箱名和口令。 


----变量参数MailList用于返回邮件的标识和大小,MailList.Count表示邮
件的封数。

----变量参数ErrorMsg返回出错消息。

----以下是POP3CheckMail及其它所用到的函数的实现代码。

Connect_Server函数

----功能:与指定的主机建立一个TCP连接,返回一个Socket描述符。参数
host指定主机的名字,Port指定端口号。

function Connect_Server(host:string;Port:integer):integer;
var i:integer;
    p:^LongInt;
    phe:pHostEnt;
    sin:sockaddr_in;
begin
sin.sin_family:=AF_INET;
sin.sin_port:=htons(Port);
//Get the IP for host, allowing for dotted decimal
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
     end;
//create a socket
Result:=socket(PF_INET,SOCK_STREAM,0);
if (Result=INVALID_SOCKET) then Exit;
//connect to server
if Connect(Result,sin,sizeof(sin))=SOCKET_ERROR
then begin {Error handling} end;
end;
Write_Socket函数 

----功能:向Socket写入一个字符串。 

function Write_Socket(sockfd:Integer; const s:string):Integer;
begin
result:=Winsock.Send(sockfd,pointer(s)^,Length(s),0)
end;
Socket_Readline函数 

----功能:从Socket上读取一行。 

function Socket_Readline(sockfd:Integer):String;
//Read until #10
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;
Pop3Response 函 数 

----功能:读取POP3服务器的一行返回信息,如果是“+OK”则函数返回
TURE,如果是“-ERR”则返回FALSE。 

function Pop3Response(Sockfd:Integer):Bool;
var  S: string;
begin
  S:=socket_readline(sockfd);
  if copy(s,1,3)=‘ +OK' then Result:=True
  else {if copy(s,1,4)=‘ -ERR' then }Result:=False;
end;
POP3CheckMail函数 

----功能:检测名字为email的信箱,如果有新邮件,则通过变量参数
MailList将每一封邮件的大小返回。

function POP3CheckMail
(Email,Password:String;var MailList:
 TStringList;var ErrorMsg:String):Bool;
var sockfd,i:integer;
    S, Host, User:String;
begin
Result:=False; ErrorMsg:=‘';
if MailList=nil then Exit;
S:=Trim(Email);
i:=Pos(‘@',Email);
User:=Trim(Copy(S,1,i -1));
Host:=Trim(Copy(S,i +1,Length(Email) -i));
MailList.Clear;
if (user=‘')or(host=‘') then begin 
ErrorMsg:=‘Invalid email address.';exit; end;
if (Host[1]=‘[')and (Host[Length(host)]=‘]')
then begin Host[1]:=‘ ';Host[Length(host)]:= #0;end;
Host:=Trim(host);
sockfd:=Connect_Server(Host,110);
if not Pop3Response(sockfd)then begin ErrorMsg:=
‘Cannot connect to server';exit; end;
Write_Socket(sockfd,‘USER ' +User + #13 #10);
IF NOT POP3Response(sockfd) then begin ErrorMsg:=
‘USER failed'; Exit;end;
Write_Socket(sockfd,‘PASS ' +Password + #13 #10);
IF NOT POP3Response(sockfd) then begin ErrorMsg:=
‘PASS failed'; Exit;end;
Write_Socket(sockfd,‘LIST' #13 #10);
POP3Response(sockfd);
while true do begin
    s:=Socket_readline(sockfd);
    if s=‘.' then BREAK;
    MailList.Add(S);
end;
Write_Socket(sockfd,‘QUIT' #13 #10);
Closesocket(sockfd);
Result:=True;
end;
三、邮件的检测 
----下面我们来看一个使用POP3CheckMail函数的简单示例。 
var  MailList:TstringList;
     ErrorMsg:String;
....
MailList:=TstringList.Create;
POP3CheckMail(‘simon_liu@263.net', 
‘mypassword', MailList, ErrorMsg);
If MailList.Count>0 then
MessageBox(0, Pchar(‘You have ' +IntToStr
(MailList.Count) + ‘ new messages!'), 
‘New Message!', MB_ICONINFORMATION)
Else if ErrorMsg=‘' then MessageBox
(0, ‘No message!', ‘',0)
Else MessageBox(0, Pchar(ErrorMsg), ‘Error', 0);
MailList.Free;

----如果你仔细阅读了POP3CheckMail函数的实现代码,你会发现此函数除
了可以获取邮件的封数之外,还可以获得每一封邮件的大小。你可以通过
POP3CheckMail函数的变量参数MailList的Strings数组来获取邮件的大小。

----实现了POP3CheckMail函数,再在此基础上编写一个POP3信箱的监视程
序就变得很简单了。你可以通过一个定时器来定期地调用POP3CheckMail函
数,这样你就可以监视某个email信箱了。假若你想要同时监视多个email
信箱,只要为每一个信箱创建一个线程并且在线程中定期调用POP3CheckMail
函数即可。你的程序中如果没有使用Delphi的控件,那么一个完整的信箱监
视程序可能只有60K左右。

****************************************************************
              
               VB与VC混合编程中处理消息的方法 

  现在越来越多的人采用VB与VC的混合编程:用VB快速开发出漂亮的界
面以及外围处理程序,再用VC编写底层的各种操作,例如内存的操作、IO
端口的操作等,VC中还可以嵌入汇编语言进行更底层的操作。

  一般的做法是将VC程序编译成DLL,在VB中用Declare语句声明DLL
中的函数,例如:

  Declare Function SendCommand Lib″c:\program files
\devstudio\wjfprojects\Hr0506dllMnsr\debug\Hr0506dllMnsr.dll
″(CmdNum As Integer) As Boolean 

  声明以后,函数SendCommand就可以当作VB自己的函数使用了。

  但是,怎样将VC中的各种消息(例如各种底层的状态)及时通知
VB并且VB能够及时处理呢?这是VB的一个缺陷:不能方便地处理自定
义的Windows消息。例如在VC中自定义了两条消息:

MW_TAPI_DATACOME,MW_TAPI_BUSY,
在C语言中,用PostMessage(hWnd,MW_TAPI_CONNECTED,0,0);
语句可以很方便地将MW_TAPI_CONNECTED消息传递给窗体(窗体句柄
为hWnd),在主回调函数中就可以处理了。但是要把这条消息传递给
VB,并让VB处理这条消息,并不太容易。虽然在VB5.0以上的版本中,
可以定义自己的事件(EVENT),但比较麻烦。这里介绍一种简单的方
法,让VB巧妙地处理自定义的消息:
  
  1.首先将VB窗体中TextBox控件Text1的句柄传递给DLL(注意:
VB中的TextBox控件有hWnd属性)。

  VB中:′声明DLL中的函数
  Declare Function SendhWnd Lib″c:\program 
files\devstudio\wjfprojects\Hr0506dllMnsr\debug\
Hr0506dllMnsr.dll″((ByVal hWnd As Long) As Boolean 
  ′传递text1的句柄
  SendhWnd(text1.hWnd)
  VC中://句柄接收函数
  declspec(dllexport) BOOL GethWnd(HWND hWnd1) 
  { hWnd=hWnd1; 
  if (hWnd==NULL) 
  { return FALSE; } 
  return TRUE;} 

  2.在VC中用API函数SetWindowText取代PostMessage直接发送消
息给VB中的Text1控件:
  SetWindowText(hWnd,″MW_TAPI_DATACOME″); 

  3.在Text1_Change事件中处理消息:
  Private Sub Text1_Change() 
  Select case Text1.text 
  case W_TAPI_DATACOME:
  ′消息处理语句
  case MW_TAPI_BUSY:
  ′消息处理语句
  default: 
  ′其他处理语句
  End Select 
  End Sub 

  以上方法在作者编写的“TAPI远程监控系统”中使用,效果很好。 

****************************************************************

               用C++ Builder实现Word 97自动化 

         江西南昌华东交大控制信息工程研究所(330013) 刘遵雄 

---- 要 在 应 用 程 序 中 控 制Word 97 的 运 行, 首 先 必 须 在 
编 制 自 动 化 客 户 程 序 时 使 其 头 文 件 中 包 含 文 件ComObj.hpp, 
写 入 #include 。 编 程 工 具C + + Builder 的 开 发 者 把 调 用
Word 97 自 动 化 对 象 的 功 能 大 致 包 装 成 了 几 个Ole object 
class 函 数, 应 用 程 序 设 计 人 员 可 以 很 方 便 地 利 用 它 们。 

* 设 定Ole 对 象 的 属 性: 

    OlePropertyGet(propname)
    OlePropertySet(propname,value)
   其 中value 是 任 何 可 以 转 换 为Variant 型 的 值
* 调 用Ole 对 象 的 方 法: 

    OleProcedure(OleProcName,[val,...])
    OleFunction(OleFuncName,[val,...])
    其 中val 是 任 何 可 以 转 换 为Variant 型 的 值
---- 可 以 通 过OleFunction(OleFuncName,[val,...]) 父 对 象 返 回 其 子 
对 象, 句 法 是: 子 对 象 名= 父 对 象 名. OleFunction(OleFuncName,val)。 
而 且 可 以 对 此 方 法 组 合 从 父 对 象 返 回 其 下 层 对 象 的 对 象。 

---- C + + Builder 中 使 用OLE 自 动 化 控 制Word 97, 必 须 掌 握
Word 97 的 自 动 化 对 象 及Microsoft Word Visual Basic 帮 助 文 件 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -