»ØÊ×Ò³

ÓÃWinsockʵÏÖÓïÒôȫ˫¹¤Í¨ÐÅʹÓÃ
2000 03-21¡¤ ÕÅÏþÃ÷ Ñ»ª Ç®Ãû¡¤Hedgehog Studio

Ò»¡¢ÒýÑÔ£¿
¡¡¡¡Windows 95×÷Ϊ΢»úµÄ²Ù×÷ϵͳ£¬ÒѾ­ÍêÈ«ÈÚÈëÁËÍøÂçÓëͨÐŹ¦ÄÜ£¬²»½ö¿ÉÒÔ½¨Á¢´¿Windows 95»·¾³Ïµġ°¶ÔµÈÍøÂ硱£¬¶øÇÒÖ§³Ö¶àÖÖЭÒ飬ÈçTCP/IP¡¢IPX/SPX¡¢NETBUIµÈ¡£ÔÚTCP/IPЭÒé×éÖУ¬TPCÊÇÒ»ÖÖÃæÏòÁ¬½ÓµÄЭÒ壬ΪÓû§Ìṩ¿É¿¿µÄ¡¢È«Ë«¹¤µÄ×Ö½ÚÁ÷·þÎñ£¬¾ßÓÐÈ·ÈÏ¡¢Á÷¿ØÖÆ¡¢¶à·¸´ÓúÍͬ²½µÈ¹¦ÄÜ£¬ÊÊÓÚÊý¾Ý´«Êä¡£UDPЭÒéÔòÊÇÎÞÁ¬½ÓµÄ£¬Ã¿¸ö·Ö×鶼Я´øÍêÕûµÄÄ¿µÄµØÖ·£¬¸÷·Ö×éÔÚϵͳÖжÀÁ¢´«ËÍ¡£Ëü²»Äܱ£Ö¤·Ö×éµÄÏȺó˳Ðò£¬²»½øÐзÖ×é³ö´íµÄ»Ö¸´ÓëÖØ´«£¬Òò´Ë²»±£Ö¤´«ÊäµÄ¿É¿¿ÐÔ£¬µ«ÊÇ£¬ËüÌṩ¸ß´«ÊäЧÂʵÄÊý¾Ý±¨·þÎñ£¬ÊÊÓÚʵʱµÄÓïÒô¡¢Í¼Ïñ´«Êä¡¢¹ã²¥ÏûÏ¢µÈÍøÂç´«Êä¡££¿
¡¡¡¡Winsock½Ó¿ÚΪ½ø³Ì¼äͨÐÅÌṩÁËÒ»ÖÖеÄÊֶΣ¬Ëü²»µ«ÄÜÓÃÓÚͬһ»úÆ÷ÖеĽø³ÌÖ®¼äͨÐÅ£¬¶øÇÒÖ§³ÖÍøÂçͨÐŹ¦ÄÜ¡£Ëæ×ÅWindows 95µÄÍÆ³ö¡£WinsockÒѾ­±»Õýʽ¼¯³Éµ½ÁËWindowsϵͳÖУ¬Í¬Ê±°üÀ¨ÁË16λºÍ32λµÄ±à³Ì½Ó¿Ú¡£¶øWinsockµÄ¿ª·¢¹¤¾ßÒ²¿ÉÒÔÔÚBorland C++4.0¡¢Visual C++2.0ÕâЩC±àÒëÆ÷ÖÐÕÒµ½£¬Ö÷ÒªÓÉÒ»¸öÃûΪwinsock.hµÄÍ·ÎļþºÍ¶¯Ì¬Á¬½Ó¿âwinsock.dll»òwsodk32.dll×é³É£¬ÕâÁ½ÖÖ¶¯Ì¬Á¬½Ó¿â·Ö±ðÓÃÓÚWin16ºÍWin32µÄÓ¦ÓóÌÐò¡££¿
¡¡¡¡±¾ÎÄÕë¶Ô»°ÒôµÄȫ˫¹¤´«ÊäÒªÇ󣬲ÉÓÃUDPЭÒéʵÏÖÁËÊµÊ±ÍøÂçͨÐÅ¡£Ê¹ÓÃVisualC++2.0±àÒë»·¾³£¬Æä¶¯Ì¬Á¬½Ó¿âÃûΪwsock32.dll¡££¿

¶þ¡¢Ö÷Òªº¯ÊýµÄʹÓÃÒªµã£¿
¡¡¡¡Í¨¹ý½¨Á¢Ë«Ì×½Ó×Ö£¬¿ÉÒԺܷ½±ãµØÊµÏÖȫ˫¹¤ÍøÂçͨÐÅ¡££¿
¡¡¡¡1.Ì×½Ó×Ö½¨Á¢º¯Êý£º£¿
SOCKET socket(int family,int type,int protocol)£¿
¶ÔÓÚUDPЭÒ飬дΪ£º£¿
SOCKRET s;£¿
s=socket(AF_INET,SOCK_DGRAM,0);£¿
»òs=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)£¿
ΪÁ˽¨Á¢Á½¸öÌ×½Ó×Ö£¬±ØÐëʵÏÖµØÖ·µÄÖØ¸´°ó¶¨£¬¼´£¬µ±Ò»¸öÌ×½Ó×ÖÒѾ­°ó¶¨µ½Ä³±¾µØµØÖ·ºó£¬ÎªÁËÈÃÁíÒ»¸öÌ×½Ó×ÖÖØ¸´Ê¹ÓøõØÖ·£¬±ØÐëΪµ÷ÓÃbind()º¯Êý°ó¶¨µÚ¶þ¸öÌ×½Ó×Ö֮ǰ£¬Í¨¹ýº¯Êýsetsockopt()Ϊ¸ÃÌ×½Ó×ÖÉèÖÃSO_REUSEADDRÌ×½Ó×ÖÑ¡Ïͨ¹ýº¯Êýgetsockopt()¿É»ñµÃÌ×½Ó×ÖÑ¡ÏîÉèÖÃ״̬¡£ÐèҪעÒâµÄÊÇ£¬Á½¸öÌ×½Ó×ÖËù¶ÔÓ¦µÄ¶Ë¿ÚºÅ²»ÄÜÏàͬ¡££¿
´ËÍ⣬»¹Éæ¼°µ½Ì×½Ó×Ö»º³åÇøµÄÉèÖÃÎÊÌ⣬°´¹æ¶¨£¬Ã¿¸öÇøµÄÉèÖ÷¶Î§ÊÇ£º²»Ð¡ÓÚ512¸ö×Ö½Ú£¬´ó´óÓÚ8k×Ö½Ú£¬¸ù¾ÝÐèÒª£¬ÎÄÖÐÑ¡ÓÃÁË4k×Ö½Ú¡££¿

¡¡¡¡2.Ì×½Ó×ְ󶨺¯Êý£¿
¡¡¡¡int bind(SOCKET s,struct sockaddr_in*name,int namelen)£¿
sÊǸղŴ´½¨ºÃµÄÌ×½Ó×Ö£¬nameÖ¸ÏòÃèÊöͨѶ¶ÔÏóµÄ½á¹¹ÌåµÄÖ¸Õ룬namelenÊǸýṹÌåµÄ³¤¶È¡£¸Ã½á¹¹ÌåÖеķÖÁ¿°üÀ¨£ºIPµØÖ·(¶ÔÓ¦name.sin_addr.s_addr)¡¢¶Ë¿ÚºÅ(name.sin_port)¡¢µØÖ·ÀàÐÍ(name.sin_family£¬Ò»°ã¶¼¸³³ÉAF_INET£¬±íʾÊÇinternetµØÖ·)¡££¿
¡¡¡¡(1)IPµØÖ·µÄÌîд·½·¨£ºÔÚȫ˫¹¤Í¨ÐÅÖУ¬Òª°ÑÓû§Ãû¶ÔÓ¦µÄµã·Ö±íʾ·¨µØÖ·×ª»»³É32볤ÕûÊý¸ñʽµÄIPµØÖ·£¬Ê¹ÓÃinet_addr()º¯Êý¡££¿
(2)¶Ë¿ÚºÅÊÇÓÃÓÚ±íʾͬһ̨¼ÆËã»ú²»Í¬µÄ½ø³Ì(Ó¦ÓóÌÐò)£¬Æä·ÖÅä·½·¨ÓÐÁ½ÖÖ£º1)½ø³Ì¿ÉÒÔÈÃϵͳΪÌ×½Ó×Ö×Ô¶¯·ÖÅäÒ»¶Ë¿ÚºÅ£¬Ö»ÒªÔÚµ÷ÓÃbindǰ½«¶Ë¿ÚºÅÖ¸¶¨Îª0¼´¿É¡£ÓÉϵͳ×Ô¶¯·ÖÅäµÄ¶Ë¿ÚºÅλÓÚ1024~5000Ö®¼ä£¬¶ø1~1023Ö®¼äµÄÈÎÒ»TCP»òUDP¶Ë¿Ú¶¼ÊDZ£ÁôµÄ£¬ÏµÍ³²»ÔÊÐíÈÎÒ»½ø³ÌʹÓñ£Áô¶Ë¿Ú£¬³ý·ÇÆäÓÐЧÓû§IDÊÇÁã(³¬¼¶Óû§)¡££¿
¡¡¡¡(2)½ø³Ì¿ÉΪÌ×½Ó×ÖÖ¸¶¨Ò»Ìض¨¶Ë¿Ú¡£Õâ¶ÔÓÚÐèÒª¸øÌ×½Ó×Ö·ÖÅäÒ»ÖÚËù¶Ë¿ÚµÄ·þÎñÆ÷ÊǺÜÓÐÓõġ£Ö¸¶¨·¶Î§Îª1024ºÍ65536Ö®¼ä¡£¿ÉÈÎÒâÖ¸¶¨¡££¿
ÔÚ±¾³ÌÐòÖУ¬¶ÔÁ½¸öÌ×½Ó×ֵĶ˿ںŹ涨Ϊ2000ºÍ2001£¬Ç°Õß¶ÔÓ¦·¢ËÍÌ×½Ó×Ö£¬ºóÕß¶ÔÓ¦½ÓÊÕÌ×½Ó×Ö¡££¿
¶Ë¿ÚºÅÒª´ÓÒ»¸ö16λÎÞ·ûºÅÊý(u_shortÀàÐÍÊý)´ÓÖ÷»ú×Ö½Ú˳Ðòת»»³ÉÍøÂç×Ö½Ú˳Ðò£¬Ê¹ÓÃ
htons()º¯Êý¡££¿
¸ù¾ÝÒÔÉÏÁ½¸öº¯Êý£¬¿ÉÒÔ¸ø³öË«Ì×½Ó×Ö½¨Á¢Óë°ó¶¨µÄ³ÌÐòƬ¶Ï£»£¿
//ÉèÖÃÓйصÄÈ«¾Ö±äÁ¿£¿
SOCKET sr,ss;£¿
HPSTR sockBufferS,sockBufferR;£¿
HANDLE hSendData,hReceiveData;£¿
DWROD dwDataSize=1024*4;£¿
struct sockaddr_in therel.there2;£¿
#DEFINE LOCAL_HOST_ADDR 200.200.200.201£¿
#DEFINE REMOTE_HOST-ADDR 200.200.200.202£¿
#DEFINE LOCAL_HOST_PORT 2000£¿
#DEFINE LOCAL_HOST_PORT 2001£¿
//Ì×½Ó×Ö½¨Á¢º¯Êý£¿
BOOL make_skt(HWND hwnd)£¿
{£¿

struct sockaddr_in here,here1;£¿
ss=socket(AF_INET,SOCK_DGRAM,0);£¿
sr=socket(AF_INET,SOCK_DGRAM,0);£¿
if((ss==INVALID_SOCKET)||(sr==INVALID_SOCKET))£¿
{£¿

MessageBox(hwnd,¡°Ì×½Ó×Ö½¨Á¢Ê§°Ü!¡±£¬¡°¡±,MB_OK);£¿
return(FALSE);£¿

}£¿
here.sin_family=AF_INET;£¿
here.sin_addr.s_addr=inet_addr(LOCAL_HOST_ADDR);£¿
here.sin_port=htons(LICAL_HOST_PORT);£¿
//another socket£¿
herel.sin_family=AF_INET;£¿
herel.sin_addr.s_addr(LOCAL_HOST_ADDR);£¿
herel.sin_port=htons(LOCAL_HOST_PORT1);£¿
SocketBuffer();//Ì×½Ó×Ö»º³åÇøµÄËø¶¨ÉèÖã¿
setsockopt(ss,SOL_SOCKET,SO_SNDBUF,(char FAR*)sockBufferS,dwDataSize);
if(bind(ss,(LPSOCKADDR)&here,sizeof(here)))
{

MessageBox(hwnd,¡°·¢ËÍÌ×½Ó×Ö°ó¶¨Ê§°Ü!¡±£¬¡°¡±£¬MB_OK);
return(FALSE);

}
setsockopt(sr SQL_SOCKET,SO_RCVBUF|SO_REUSEADDR,(char FAR*)
sockBufferR,dwDataSize);
if(bind(sr,(LPSOCKADDR)&here1,sizeof(here1)))
{

MessageBox(hwnd,¡°½ÓÊÕÌ×½Ó×Ö°ó¶¨Ê§°Ü!¡±£¬¡°¡±£¬MB_OK);
return(FALSE);

}
return(TRUE);

}
//Ì×½Ó×Ö»º³åÇøÉèÖÃ
void sockBuffer(void)
{

hSendData=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize);
if(!hSendData)
{

MessageBox(hwnd,¡°·¢ËÍÌ×½Ó×Ö»º³åÇø¶¨Î»Ê§°Ü!¡±£¬NULL,
MB_OK|MB_ICONEXCLAMATION);
return;

}
if((sockBufferS=GlobalLock(hSendData)==NULL)
{

MessageBox(hwnd,¡°·¢ËÍÌ×½Ó×Ö»º³åÇøËø¶¨Ê§°Ü!¡±£¬NULL,
MB_OK|MB_ICONEXCLAMATION);
GlobalFree(hRecordData[0];
return;

}
hReceiveData=globalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize);
if(!hReceiveData)
{

MessageBox(hwnd,"¡°½ÓÊÕÌ×½Ó×Ö»º³åÇø¶¨Î»°Ü!¡±£¬NULL
MB_OK|MB_ICONEXCLAMATION);
return;

}
if((sockBufferT=Globallock(hReceiveData))=NULL)
MessageBox(hwnd,"·¢ËÍÌ×½Ó×Ö»º³åÇøËø¶¨Ê§°Ü!¡±£¬NULL,
MB_OK|MB_ICONEXCLAMATION);
GlobalFree(hRecordData[0]);
return;

}

¡¡¡¡3.Êý¾Ý·¢ËÍÓë½ÓÊÕº¯Êý£»£¿

int sendto(SOCKET s.char*buf,int len,int flags,struct sockaddr_in to,int
tolen);£¿

int recvfrom(SOCKET s.char*buf,int len,int flags,struct sockaddr_in 
fron,int*fromlen)ÆäÖУ¬²ÎÊýflagsÒ»°ãÈ¡0¡££¿
¡¡¡¡recvfrom()º¯Êýʵ¼ÊÉÏÊǶÁÈ¡sendto()º¯Êý·¢¹ýÀ´µÄÒ»¸öÊý¾Ý°ü£¬µ±¶Áµ½µÄÊý¾Ý×Ö½ÚÉÙÓڹ涨½ÓÊÕµÄÊýĿʱ£¬¾Í°ÑÊý¾ÝÈ«²¿½ÓÊÕ£¬²¢·µ»ØÊµ¼Ê½ÓÊÕµ½µÄ×Ö½ÚÊý£»µ±¶Áµ½µÄÊý¾Ý¶àÓڹ涨ֵʱ£¬ÔÚÊý¾Ý±¨ÎÄ·½Ê½Ï£¬¶àÓàµÄÊý¾Ý½«±»¶ªÆú¡£¶øÔÚÁ÷·½Ê½Ï£¬Ê£ÓàµÄÊý¾ÝÓÉÏÂrecvfrom()¶Á³ö¡£ÎªÁË·¢ËͺͽÓÊÕÊý¾Ý£¬±ØÐ뽨Á¢Êý¾Ý·¢ËÍ»º³åÇøºÍÊý¾Ý½ÓÊÕ»º³åÇø¡£¹æ¶¨£ºIP²ãµÄÒ»¸öÊý¾Ý±¨×î´ó²»³¬¹ý64K(º¬Êý¾Ý±¨Í·)¡£µ±»º³åÇøÉèÖõùý¶à¡¢¹ý´óʱ£¬³£ÒòÄÚ´æ²»¹»¶øµ¼ÖÂÌ×½Ó×Ö½¨Á¢Ê§°Ü¡£ÔÚ¼õС»º³åÇøºó£¬¸Ã´íÎóÏûʧ¡£¾­¹ýʵÑ飬ÎÄÖÐÑ¡ÓÃÁË4K×Ö½Ú¡££¿
´ËÍ⣬»¹Ó¦×¢ÒâÕâÁ½¸öº¯ÊýÖÐ×îºó²ÎÊýµÄд·¨£¬¸øsendto()µÄ×îºó²ÎÊýÊÇÒ»¸öÕûÊýÖµ£¬¶ørecvfrom()µÄÔòÊÇÖ¸ÏòÒ»ÕûÊýÖµµÄÖ¸Õë¡££¿
4.Ì×½Ó×ֹرպ¯Êý£ºclosesocket(SOCKET s)£¿
ͨѶ½áÊøÊ±£¬Ó¦¹Ø±ÕÖ¸¶¨µÄÌ×½Ó×Ö£¬ÒÔÊÍÓëÖ®Ïà¹ØµÄ×ÊÔ´¡££¿
ÔڹرÕÌ×½Ó×Öʱ£¬Ó¦ÏȶÔËø¶¨µÄ¸÷ÖÖ»º³åÇø¼ÓÒÔÊÍ·Å¡£Æä³ÌÐòƬ¶ÏΪ£º£¿
void CloseSocket(void)£¿
{£¿

GlobalUnlock(hSendData);£¿
GlobalFree(hSenddata);£¿
GlobalUnlock(hReceiveData);£¿
GlobalFree(hReceiveDava);£¿
if(WSAAysncSelect(ss,hwnd,0,0)=SOCKET_ERROR)£¿
{£¿

MessageBos(hwnd,¡°·¢ËÍÌ×½Ó×ֹرÕʧ°Ü!¡±£¬¡°¡±£¬MB_OK);£¿
return;£¿

}£¿
if(WSAAysncSelect(sr,hwnd,0,0)==SOCKET_ERROR)£¿
{£¿

MessageBox(hwnd,¡°½ÓÊÕÌ×½Ó×ֹرÕʧ°Ü!¡±£¬¡°¡±£¬MB_OK);£¿
return;£¿
}£¿
WSACleanup();£¿
closesockent(ss);£¿
closesockent(sr);£¿
return;£¿

}

£ý 

¡¡¡¡Èý¡¢WinsockµÄ±à³ÌÌØµãÓëÒ첽ѡÔñ»úÖÆ£¿
¡¡¡¡1 ×èÈû¼°Æä´¦Àí·½Ê½£¿
¡¡¡¡ÔÚÍøÂçͨѶÖУ¬ÓÉÓÚÍøÂçÓµ¼·»òÒ»´Î·¢Ë͵ÄÊý¾ÝÁ¿¹ý´óµÈÔ­Òò£¬¾­³£»á·¢Éú½»»»µÄÊý¾ÝÔÚ¶Ìʱ¼äÄÚ²»ÄÜ´«ËÍÍ꣬ÊÕ·¢Êý¾ÝµÄº¯ÊýÒò´Ë²»ÄÜ·µ»Ø£¬ÕâÖÖÏÖÏó½Ð×ö×èÈû¡£Winsock¶ÔÓпÉÄÜ×èÈûµÄº¯ÊýÌṩÁËÁ½ÖÖ´¦Àí·½Ê½£º×èÈûºÍ·Ç×èÈû·½Ê½¡£ÔÚ×èÈû·½Ê½Ï£¬ÊÕ·¢Êý¾ÝµÄº¯ÊýÔÚ±»µ÷ÓúóÒ»Ö±Òªµ½´«ËÍÍê±Ï»òÕß³ö´í²ÅÄÜ·µ»Ø¡£ÔÚ×èÈûÆÚ¼ä£¬±»×èµÄº¯Êý²»»á¶Ïµ÷ÓÃϵͳº¯ÊýGetMessage()À´±£³ÖÏûϢѭ»·µÄÕý³£½øÐС£¶ÔÓÚ·Ç×èÈû·½Ê½£¬º¯Êý±»µ÷ÓúóÁ¢¼´·µ»Ø£¬µ±´«ËÍÍê³ÉºóÓÉWinsock¸ø³ÌÐò·¢Ò»¸öÊÂÏÈÔ¼¶¨ºÃµÄÏûÏ¢¡££¿
ÔÚ±à³Ìʱ£¬Ó¦¾¡Á¿Ê¹Ó÷Ç×èÈû·½Ê½¡£ÒòΪÔÚ×èÈû·½Ê½Ï£¬Óû§¿ÉÄ᳤ܻʱ¼äµÄµÈ´ý¹ý³ÌÖÐÊÔͼ¹Ø±Õ³ÌÐò£¬ÒòΪÏûϢѭ»·»¹ÔÚÆð×÷Óã¬ËùÒÔ³ÌÐòµÄ´°¿Ú¿ÉÄܱ»¹Ø±Õ£¬ÕâÑùµ±º¯Êý´ÓWinsockµÄ¶¯Ì¬Á¬½Ó¿âÖзµ»ØÊ±£¬Ö÷³ÌÐòÒѾ­´ÓÄÚ´æÖÐɾ³ý£¬ÕâÏÔÈ»ÊǼ«ÆäΣÏյġ££¿

¡¡¡¡2 Ò첽ѡÔñº¯ÊýWSAAsyncSelect()µÄʹÓã¿
¡¡¡¡Winsockͨ¹ýWSAAsyncSelect()×Ô¶¯µØÉèÖÃÌ×½Ó×Ö´¦ÓÚ·Ç×èÈû·½Ê½¡£Ê¹ÓÃWindows SocketsʵÏÖWindowsÍøÂç³ÌÐòÉè¼ÆµÄ¹Ø¼ü¾ÍÊÇËüÌṩÁ˶ÔÍøÂçʼþ»ùÓÚÏûÏ¢µÄÒì²½´æÈ¡£¬ÓÃÓÚ×¢²áÓ¦ÓóÌÐò¸ÐÐËȤµÄÍøÂçʼþ¡£ËüÇëÇóWindows Sockets DLLÔÚ¼ì²âµ½Ì×½Ó×ÖÉÏ·¢ÉúµÄÍøÂçʼþʱ£¬Ïò´°¿Ú·¢ËÍÒ»¸öÏûÏ¢¡£¶ÔUDPЭÒ飬ÕâÐ©ÍøÂçʼþÖ÷ҪΪ£º£¿

FD_READ ÆÚÍûÔÚÌ×½Ó×ÖÊÕµ½Êý¾Ý(¼´¶Á×¼±¸ºÃ)ʱ½ÓÊÕ֪ͨ£»£¿

FD_WRITE ÆÚÍûÔÚÌ×½Ó×Ö¿É·¢ËÍÊý(¼´Ð´×¼±¸ºÃ)ʱ½ÓÊÕ֪ͨ£»£¿

FD_CLOSE ÆÚÍûÔÚÌ×½Ó×ֹرÕʱ½Óµç֪ͨ£¿
¡¡¡¡ÏûÏ¢±äÁ¿wParamָʾ·¢ÉúÍøÂçʼþµÄÌ×½Ó×Ö£¬±äÁ¿1ParamµÄµÍ×Ö½ÚÃèÊö·¢ÉúµÄÍøÂçʼþ£¬¸ß×Ö°üº¬´íÎóÂë¡£ÈçÔÚ´°¿Úº¯ÊýµÄÏûϢѭ»·Öоù¼ÓÒ»¸ö·ÖÖ§£º£¿
int ok=sizeof(SOCKADDR);£¿
case wMsg;£¿
switch(1Param)£¿
{£¿

case FD_READ:£¿
//Ì×½Ó×ÖÉ϶ÁÊý¾Ý£¿
if(recvfrom(sr.lpPlayData[j],dwDataSize,0,(struct sockaddr FAR*)&there1,
£¿
(int FAR*)&ok)==SOCKET_ERROR0£¿
{£¿

MessageBox)hwnd,¡°Êý¾Ý½ÓÊÕʧ°Ü!¡±£¬¡°¡±£¬MB_OK);£¿
return(FALSE);£¿

}£¿
case FD_WRITE:£¿
//Ì×½Ó×ÖÉÏдÊý¾Ý£¿

}£¿
break£»£¿
¡¡¡¡ÔÚ³ÌÐòµÄ±àÖÆÖУ¬Ó¦¸ù¾ÝÐèÒªÁé»îµØ½«WSAAsyncSelect()º¯ÁéÃô·ÅÔÚÏàÓ¦µÄÏûϢѭ»·Ö®ÖУ¬ÆäËü˵Ã÷¿É²Î¼ûÎÄÏ×[1]¡£´ËÍ⣬Ӧ¸ÃÖ¸³öµÄÊÇ£¬ÒÔÉϳÌÐòƬ¶ÏÖеÄÏûÏ¢¿òÖ÷ÒªÊÇΪ³ÌÐòµ÷ÊÔ·½±ã¶øÉèÖõ쬶øÔÚÕýʽ²úÆ·Öв»ÔÙ³öÏÖ¡£Í¬Ê±£¬°´ÕÕ³ÌÐòÈÝ´íÎóÉè¼Æ£¬Ó¦½¨Á¢Ò»¸öרÃŵÄÈÝ´í´¦Àíº¯Êý¡£³ÌÐòÖпÉÄܳöÏֵĸ÷ÖÖ´íÎó¶¼½«Óɸú¯Êý½øÐд¦Àí£¬ÒÀ¾Ý´íÎóµÄΣº¦³Ì¶È²»Í¬£¬½¨Á¢¼¸ÖÖ²»Í¬µÄ´¦Àí´ëÊ©¡£ÕâÑù£¬²ÅÄܱ£Ö¤Ë«·½Í¨»°µÄ˳ÀûºÍ¿É¿¿¡££¿

ËÄ¡¢½áÂÛ£¿
¡¡¡¡±¾ÎÄÊǶàýÌåÍøÂç´«ÊäÏîÄ¿µÄÖØÒªÄÚÈÝÖ®Ò»£¬Ä¿Ç°£¬½áºÏÓ²¼þȫ˫¹¤ÓïÒô¿¨µÈÉ豸£¬ÒѾ­³É¹¦µØÊµÏÖÁË»°ÒôµÄȫ˫¹¤µÄͨÐÅ¡£ÓйØÕû¸ö¶àýÌå´«ÊäϵͳÉè¼ÆµÄÄÚÈÝ£¬½«ÓÐÁíÎÄÐðÊö¡£
£¿
²Î¿¼ÎÄÏ×£¿
1 ½¯¶«ÐË£¬ÁÖ¶õ»ªWindows SocketsÍøÂç³ÌÐòÉè¼ÆÖ¸ÄÏ¡£Ç廪´óѧ³ö°æÉç¡£1995,12
2 ףСº² Winsock±à³Ì³õ²½£¬Î¢µçÄÔÊÀ½ç£¬1996,(8):54~60

ÔÚVC++6.0ÖÐÓÃMFC½øÐÐCOM±à³Ì
2000 03-21¡¤ ÑîÄþ¡¤vchelp

Ê×ÏÈÓ¦µ±Ã÷È·,MFCÖÐÊÇͨ¹ýǶÌ×Àà¶ø²»ÊǶàÖØ¼Ì³ÐÀ´ÊµÏÖCOM½Ó¿ÚµÄ,ͨ¹ý½Ó¿ÚÓ³Éä»úÖÆ½«½Ó¿ÚºÍʵÏָýӿڵÄǶÌ×Àà¹ØÁªÆðÀ´;MFCÖÐÌṩһÌ×¼òÃ÷µÄºêÀ´ÊµÏÖǶÌ×ÀàµÄ¶¨Òå.Æä´Î,MFCͨ¹ýCCmdTargetÀàʵÏÖÁËIUnknown½Ó¿Ú.

¡¡¡¡±¾ÎÄÊ×ÏÈÃèÊö´´½¨Ò»¸öCOM·þÎñÆ÷µÄ²½ÖèºÍºËÐÄ´úÂë.È»ºó˵Ã÷¿Í»§³ÌÐò¹Ø¼ü´úÂë.

¡¡¡¡´ËCOM·þÎñÆ÷ʵÏÖÒ»¸öTimeLogServer×é¼þ,Ϊ¼òÃ÷Æð¼û,´Ë×é¼þÖ»ÓÐÒ»¸ö½Ó¿ÚITimeLog,ͨ¹ýITimeLogµÄ·½·¨OutputLog¿ÉÒÔ½«ÈÕÖ¾Îı¾Êä³öÖÁÈÕÖ¾Îļþ.

¡¡¡¡´´½¨Ò»¸öMFC DLL¹¤³Ì,Ñ¡ÔñÖ§³ÖAutomation(µ±È»±¾³ÌÐò²»Ò»¶¨ÊÇ×Ô¶¯»¯·þÎñÆ÷,ÔÚÕâÀïÕâÑù×öºÃ´¦ÔÚÓÚ×Ô¶¯ÊµÏÖÁ˼¸¸ö±ØÒªµÄÊä³öº¯ÊýÈçDllGetClassObject,DllRegisterServerµÈ,·ñÔòÒª×Ô¼ºÐ´)

¡¡¡¡µÚÒ»½Ú COM·þÎñÆ÷

¡¡¡¡Ò». ÉùÃ÷×é¼þºÍ½Ó¿Ú 

¡¡¡¡1.дһ¸öGUIDs.h,ÔÚGUIDs.hÖÐÉùÃ÷×é¼þºÍ½Ó¿ÚµÄGUID 

//ÉùÃ÷×é¼þGUID {A433E701-E45E-11d3-97B5-52544CBA7F28}
//DEFINE_GUID(CLSID_TimeLogServer,
//0xa433e701, 0xe45e, 0x11d3, 0x97, 0xb5, 0x52, 0x54, 0x4c, 0xba, 0x7f, 0x28);
static const IID CLSID_TimeLogServer =
{0xa433e701, 0xe45e, 0x11d3, {0x97, 0xb5, 0x52, 0x54, 0x4c, 0xba, 0x7f, 0x28}};
// ÉùÃ÷½Ó¿ÚGUID{A433E702-E45E-11d3-97B5-52544CBA7F28}
//DEFINE_GUID(IID_ITimeLog,
//0xa433e702, 0xe45e, 0x11d3, 0x97, 0xb5, 0x52, 0x54, 0x4c, 0xba, 0x7f, 0x28);
static const IID IID_ITimeLog =
{0xa433e702, 0xe45e, 0x11d3, {0x97, 0xb5, 0x52, 0x54, 0x4c, 0xba, 0x7f, 0x28}};

¡¡¡¡2.дһ¸öITimeLogServer.h,ÔÚITimeLogServer.hÎļþÖÐÉùÃ÷×é¼þºÍ½Ó¿Ú 

//ITimeLogServer.h
#include "GUIDs.h"
//½Ó¿ÚITimeLogµÄÉùÃ÷
DECLARE_INTERFACE_(ITimeLog,IUnknown)
{
STDMETHOD(OutputLog)(BSTR* varLogText)PURE;
};

¡¡¡¡ËµÃ÷£º1.ºêDEFINE_GUID½«×é¼þºÍ½Ó¿ÚµÄprogidÓëGUIDÏà¹ØÁª.¿ÉÒÔÓÃguidgen.exe¹¤¾ß²úÉú.

¡¡¡¡2.ºêDECLARE_INTERFACE_ÉùÃ÷½Ó¿Ú;¸ÃºêµÚÒ»¸ö²ÎÊýΪ½Ó¿ÚÃû,µÚ¶þ¸ö²ÎÊýΪ¸Ã½Ó¿ÚµÄ»ùÀà.ÉùÃ÷ûÓлùÀàµÄ½Ó¿ÚÓÃDECLARE_INTERFACEºê.

¡¡¡¡3.ºêSTDMETHODÉùÃ÷½Ó¿ÚÖеķ½·¨.´Ë·½·¨µÄ·µ»ØÖµÎªHRESULT.PURE±»½âÊÍΪ"=0",¼´´Ë·½·¨Îª´¿Ð麯Êý.µ±·½·¨µÄ·µ»ØÖµ²»ÊÇHRESULTʱ,ÓúêSTDMETHOD_(·µ»ØÀàÐÍ,º¯ÊýÃû)(²ÎÊý)PURE;

¡¡¡¡¶þ.ÉùÃ÷×é¼þÀàCTimeLogServerºÍʵÏÖ½Ó¿ÚµÄǶÌ×Àà 

¡¡¡¡ÔÚClassWizardÖÐÌí¼ÓÐÂÀàCTimeLogServer£¬Æä»ùÀàÑ¡ÔñΪCCmdTarget.ÐÞ¸ÄÆäÍ·ÎļþTimeLogServer1.h,¼ÓÉÏ#include "ITimeLogServer.h";ͬʱÔÚÀàÉùÃ÷ÌåÖмÓÉÏ 

//ÉùÃ÷ʵÏÖITimelog½Ó¿ÚµÄǶÌ×Àà
BEGIN_INTERFACE_PART(TimeLog,ITimeLog)//×Ô¶¯ÉùÃ÷IUnknown½Ó¿ÚµÄÈý¸ö·½·¨
STDMETHOD(OutputLog)(BSTR* varLogText);
END_INTERFACE_PART(TimeLog)
//ÉùÃ÷½Ó¿ÚÓ³Éä
DECLARE_INTERFACE_MAP()
//ÉùÃ÷Àà³§
DECLARE_OLECREATE(CTimeLogServer)

¡¡¡¡Èý.ʵÏÖÀà³§ºÍ½Ó¿ÚÓ³Éä 

¡¡¡¡ÔÚCTimeLogServerµÄʵÏÖÎļþÖÐдÈë:

//ʵÏÖÀà³§
IMPLEMENT_OLECREATE(CTimeLogServer,"TimeLogServer",
0xa433e701, 0xe45e, 0x11d3, 0x97, 0xb5, 0x52, 0x54, 0x4c, 0xba, 0x7f, 0x28);
//Ó³Éä½Ó¿Úµ½ÏàÓ¦µÄǶÌ×Àà
BEGIN_INTERFACE_MAP(CTimeLogServer,CCmdTarget)
INTERFACE_PART(CTimeLogServer,IID_ITimeLog,TimeLog)
END_INTERFACE_MAP()
¡¡¡¡ËÄ.ÔÚ×é¼þµÄ¹¹ÔìºÍÎö¹¹º¯ÊýÖжÔÈ«¾Ö¶ÔÏó¼ÆÊý
CTimeLogServer::CTimeLogServer()
{
::AfxOleLockApp();
}

CTimeLogServer::~CTimeLogServer()
{
::AfxOleUnlockApp();
}
¡¡¡¡Îå.ΪǶÌ×ÀàʵÏÖIUnknown½Ó¿Ú 

//ΪǶÌ×Àà¶øÊµÏÖIUnknown½Ó¿Ú
STDMETHODIMP_(ULONG)
CTimeLogServer::XTimeLog::AddRef()
{
METHOD_PROLOGUE(CTimeLogServer,TimeLog)
return pThis->ExternalAddRef();
}

STDMETHODIMP_(ULONG)
CTimeLogServer::XTimeLog::Release()
{
METHOD_PROLOGUE(CTimeLogServer,TimeLog)
return pThis->ExternalRelease();
}

STDMETHODIMP
CTimeLogServer::XTimeLog::QueryInterface(REFIID riid,void**ppvObj)
{
METHOD_PROLOGUE(CTimeLogServer,TimeLog)
return pThis->ExternalQueryInterface(&riid,ppvObj);
}
¡¡¡¡ËµÃ÷:ËäÈ»CCmdTargetÀàÒѾ­ÊµÏÖÁËIUnknown½Ó¿Ú,µ«ÊÇ»¹±ØÐëͨ¹ýÉÏÊö´úÂëÀ´½«Ç¶Ì×ÀàµÄIUnknownÓ³Éäµ½CCmdTargetÖ§³ÖµÄIUnknown½Ó¿Ú.METHOD_PROLOGUEHºêµÄÁ½¸ö²ÎÊý·Ö±ðÊÇʵÏÖ×é¼þ¶ÔÏóµÄÀàºÍʵÏÖ½Ó¿ÚµÄǶÌ×Àà.

¡¡¡¡Áù.ʵÏÖItimeLog½Ó¿ÚµÄ·½·¨OutputLog 

¡¡¡¡×¢Òâ±¾×é¼þµÄ¹¦ÄÜÊÇÍùÈÕÖ¾ÎļþÖÐÊäÈëÈÕÖ¾.

¡¡¡¡1. ÔÚ×é¼þÀàÖÐÌí¼ÓÒ»¸öÎļþÖ¸Õë:

// Attributes
public:
protected:
FILE* m_logfile;

¡¡¡¡2. ³õʼ»¯ºÍÍ˳ö 

¡¡¡¡Ê×ÏÈÔÚCTimeLogServerµÄ¹¹Ô캯ÊýÖнøÐÐһЩ³õʼ»¯:

CTimeLogServer::CTimeLogServer()
{
::AfxOleLockApp();
CTime TimeStamp = CTime::GetCurrentTime();
CString FileName;
FileName.Format(_T("%s.log"),TimeStamp.Format("%Y%m%d"));
m_logfile = fopen(FileName,_T("a"));
if(m_logfile)
{
fprintf(m_logfile,_T("# # # # # # # # # # # # # # # # # \n"));
fprintf(m_logfile,_T("¿ªÊ¼ÓÚ:%s"),(LPCTSTR)TimeStamp.Format("%YÄê%mÔÂ%dÈÕ%H:%M %S"));
fprintf(m_logfile,_T("\n"));
}
}
//È»ºóÔÚÎö¹¹º¯ÊýÖйرÕÎļþ
CTimeLogServer::~CTimeLogServer()
{
::AfxOleUnlockApp();
if(m_logfile)
{
CTime TimeStamp = CTime::GetCurrentTime();
fprintf(m_logfile,_T("\n"));
fprintf(m_logfile,_T("½áÊøÓÚ:%s"),(LPCTSTR)TimeStamp.Format("%YÄê%mÔÂ%dÈÕ%H:%M %S"));
fprintf(m_logfile,_T("\n"));
fprintf(m_logfile,_T("# # # # # # # # # # # # # # # # #\n"));
fclose(m_logfile);
}
}
¡¡¡¡3. ʵÏÖ½Ó¿ÚITimeLog·½·¨

//ʵÏÖ½Ó¿ÚITimeLog·½·¨
STDMETHODIMP
CTimeLogServer::XTimeLog::OutputLog(BSTR* varLogText)
{
METHOD_PROLOGUE(CTimeLogServer,TimeLog)
if(pThis->m_logfile)
{
CTime TimeStamp = CTime::GetCurrentTime();
CString NowTime = TimeStamp.Format("%YÄê%mÔÂ%dÈÕ%H:%M:%S");
CString LogText((LPCWSTR)*varLogText);
fprintf(pThis->m_logfile,"\n%s\n%s\n%",NowTime,LogText);
return NOERROR;
}
else
{
AfxMessageBox("ûÓÐÈÕÖ¾Îļþ!");
return S_FALSE;
}
}
¡¡¡¡Æß.ÍêÉÆ×é¼þ·þÎñÆ÷

¡¡¡¡ÔÚÓ¦ÓöÔÏóCTimeLogServerAppµÄ ʵÏÖÎļþÖÐ,´¦ÀíInstance()ºÍExitInstance()

BOOL CTimeLogServerApp::InitInstance()
{
::AfxOleLockApp();
// Register all OLE server (factories) as running. This enables the
// OLE libraries to create objects from other applications.
COleObjectFactory::RegisterAll();

return TRUE;
}
int CTimeLogServerApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
::AfxOleUnlockApp();
return CWinApp::ExitInstance();
}
¡¡¡¡µÚ¶þ½Ú ¿Í»§³ÌÐò 

¡¡¡¡Ê¹ÓÃCOM×é¼þ·þÎñÆ÷µÄ¿Í»§³ÌÐò¹Ø¼ü²½ÖèÊÇ:³õʼ»¯COM¿â,´´½¨×é¼þ¶ÔÏó²¢»ñÈ¡IUnknown½Ó¿ÚÖ¸Õë,²éѯ½Ó¿Ú²¢Ê¹ÓÃ,ÊÍ·Å×é¼þ.

#include "ITimeLogServer.h"
//³õʼ»¯COM¿â,¶Ô×é¼þʵÀý»¯
HRESULT hResult;
IUnknown* pIUnknown;
hResult = ::CoInitialize(NULL);
if(FAILED(hResult))
{
::AfxMessageBox("²»Äܳõʼ»¯COM¿â!");
return FALSE;
}

//´´½¨×é¼þʵÀý
pIUnknown = NULL;
hResult = ::CoCreateInstance(CLSID_TimeLogServer,NULL,
CLSCTX_INPROC_SERVER,IID_IUnknown,(void**)&pIUnknown);
if(FAILED(hResult))
{
pIUnknown = NULL;
::AfxMessageBox("²»ÄÜ´´½¨TimeLog¶ÔÏó!");
return FALSE;
}
//²éѯ½Ó¿Ú²¢Ê¹ÓÃ
if(pIUnknown!=NULL)
{
ITimeLog* pITimeLog;
HResult=pIUnknown->QueryInterface(IID_ITimeLog,(void**)&pITimeLog);
if(FAILED(hResult))
{
::AfxMessageBox("²»ÄÜ»ñÈ¡½Ó¿ÚITimeLog!");
pIUnknown->Release();
return;
}
BSTR bstrLogText;
bstrLogText = m_logtext.AllocSysString();
CString text((LPCWSTR)bstrLogText);
::AfxMessageBox(text);

if(FAILED(pITimeLog->OutputLog(&bstrLogText)))
{
::AfxMessageBox("ÈÕÖ¾Êä³ö³ö´í!");
pITimeLog->Release();
return;
}
pITimeLog->Release();
::AfxMessageBox("ÈÕÖ¾ÒѾ­Ð´Èë!");
}
//ÊÍ·Å×é¼þ
pIUnknown->Release();
pIUnknown = NULL; ::CoUninitialize();

¡¡
ÓÃVC++±àдCGI³ÌÐò

Õã½­´óѧÉúÃü¿ÆÑ§Óëҽѧ¹¤³Ìѧϵ Ð쳿Ó ¶Î»áÁú ÂÀάѩ
¡¡¡¡Õª Òª¡¡ ¸ÃÎÄͨ¹ý¶ÔCGI³ÌÐò,ÌØ±ðÊÇWindows CGI³ÌÐòÔ­ÀíµÄ·ÖÎö,½éÉÜÁËÓÃVisual C+ +ÓïÑÔ±àдCGI³ÌÐòµÄ·½·¨,²¢¸ø³öÁËÒ»¸öÓÃCGI³ÌÐòʹµÃWWW·þÎñÆ÷ÓëϵͳÊý¾Ý¿âÏàÁ¬µÄÀý×Ó¡£

¹Ø¼ü´Ê CGI WWW HTML VC++ Êý¾Ý¿â

¡¡¡¡½üÄêÀ´,InternetÓëIntranetѸÃÍ·¢Õ¹,ÆóÒµ·×·×½¨Á¢×Ô¼ºµÄIntranet,ÒÔ¼ÓÇ¿ÆóÒµÄÚ²¿µÄÁªÏµ,´Ù½øÓëÍⲿÊÀ½çµÄ¹µÍ¨,ÔöÇ¿ÆóÒµµÄ¾ºÕùÄÜÁ¦¡£Í¨¹ý½¨Á¢×Ô¼ºµÄInternet·þÎñÆ÷,ÆóÒµÄÜÔÚÍøÂçÉÏ·¢²¼¹ã¸æ,½éÉܱ¾¹«Ë¾µÄÇé¿öÓë²úÆ·,ÊÕ¼¯¹Ë¿ÍÒâ¼û,ÒÔ¼°½¨Á¢ÐéÄâµç×ÓÉ̳¡µÈ¡£´ó¼Ò¶¼ÖªµÀдһ¸öHTML³¬Îı¾Îļþ·ÅÔÚWorld Wide Web·þÎñÆ÷ÉÏ,¼´¿Éͨ¹ý¸÷ÖÖä¯ÀÀÆ÷·ÃÎÊÄãµÄÖ÷Ò³,µ«ÊÇÈçºÎʹÄãµÄ¾²Ì¬Ö÷Ò³ÄÜÏìÓ¦¿Í»§µÄ¶¯×÷,²¢Óë±¾µØµÄÊý¾Ý¿âÁªÏµ,½«Êý¾Ý¿âµÄÏàÓ¦ÄÚÈÝ´«Ë͸øÔ¶¶ËµÄä¯ÀÀÆ÷ÄØ?Õâ¾ÍÐèҪͨ¹ýCGI½Ó¿Ú½øÐÐÁªÏµ¡£
¡¡¡¡CGIÈ«ÃûÊÇCommon Gateway Interface,ËüÊÇWWW·þÎñÆ÷µ÷ÓÃÍⲿ³ÌÐòµÄ½Ó¿Úͨ¹ýCGI,WW W·þÎñÆ÷ÄÜÍê³ÉһЩ±¾ÉíËùÁ¦²»Äܼ°µÄ¹¤×÷¡£

¡¡¡¡ÔÚ²»Í¬²Ù×÷ϵͳÏÂCGI½Ó¿ÚÒ²²»Ïàͬ,¿É·ÖΪStandard CGI½Ó¿Ú¡¢DOS CGI½Ó¿ÚÓëWin CG I½Ó¿ÚµÈ¡£Standard CGI½Ó¿ÚÓÃÓÚUnixϵͳ,ËüÊÇͨ¹ý»·¾³±äÁ¿À´ÊµÏÖWWW ServerÓëCGIÓ¦ÓóÌÐòÖ®¼äµÄÁªÏµ¡£DOS CGI½Ó¿ÚÓëStandard CGI½Ó¿ÚÔ­ÀíÀàͬ¡£Win CGI½Ó¿ÚÔòÓëǰÁ½Õß´ó²»Ïàͬ¡£ÓÉÓÚÔ½À´Ô½¶àµÄWWW Server²ÉÓÃWindowsϵͳ,¶øWindowsϵͳÓÖ²»ÄÜÓÐЧµØ´«µÝ»·¾³±äÁ¿,ÓÉBob DennyÌá³öÁËÒ»ÖÖWindows CGI±ê×¼,²¢µÃÒÔ²»¶ÏÍÆ¹ã¡£
Win CGIÊÇͨ¹ý.iniÎļþÀ´½øÐÐÁªÏµµÄ¡£ÔÚWindows»·¾³ÏÂ,Ðí¶àÓ¦ÓóÌÐò¶¼ÊÇÀûÓÃ.ini Îļþ,¼´profileÎļþÀ´¶¨ÒåһЩ»ù±¾É趨,¶øWin CGI³ÌÐòÓëWWW ServerÖ®¼äÒ²ÕýÊÇͨ¹ýpro fileÎļþÀ´ÊµÏÖÁªÏµµÄ¡£µ±WWW Clientͨ¹ýWWW Server´¥·¢CGI³ÌÐòʱ,WWW ServerÏȶ¯Ì¬Éú³É¼¸¸öÎļþÓÚÁÙʱĿ¼ÏÂ,·ÖΪ.ini¡¢.inp¡¢.outµÈÎļþ¡£ÔÚWWW ServerÉú³ÉCGI³ÌÐòµÄ½ø³Ìʱ,ͨ¹ýÃüÁîÐвÎÊý½«.iniÎļþµÄ¾ø¶Ô·¾¶´«¸øCGI½ø³Ì¡£.iniÎļþÖÐÒ²°üº¬ÁË.inp¡¢.ou tµÈÎļþ·¾¶ÐÅÏ¢¡£ÕâÑù,CGI³ÌÐò¿É¶ÁÈ¡.iniºÍ.inpÎļþËùÌṩµÄÐÅÏ¢,Á˽âËùÓÐÀ´×ÔWWW Server¶ËºÍÓëWWW Client¶ËµÄÊý¾Ý¡£È»ºó,CGI³ÌÐò¿ÉÒÔµ÷ÓÃÍⲿ³ÌÐò,»òÓÉCGIÖ±½ÓÖ´ÐÐÍⲿ³ÌÐòµÄ¹¦ÄÜ,²¢½«Òª´«¸ø¿Í»§¶ËµÄÐÅÏ¢ÒÔHTMLÎı¾µÄÐÎʽдÔÚ.outÎļþÉÏ¡£×îºó,WWW ServerÈ¡.outÎļþµÄHTMLÎı¾,½«ÐÅÏ¢´«Ë͸øWWW Client¶Ë,²¢É¾³ýÁÙʱĿ¼ÏµÄÎļþ¡£ÄÇô,CGIµÄprofileÎļþ°üº¬ÁËʲôÊý¾ÝÄØ?ÓëWindowsÆäËü.iniÎļþÒ»Ñù,CGI profile Îļþ°üº¬ÁËÐí¶àsession,ÿ¸ösessionÓÖ°üº¬Ò»Ð©key,ÒÔÏÂÊÇÒ»¸öCGI profileµÄ²¿·ÝÄÚÈÝ

[CGI]
Request Method=POST //´«µÝ·½Ê½,¼´HTMLÖеÄForm methodÓÐGET,POST,HEADµÈ¡£
Server Software=WebSite/1.1e
//ServerµÄÃû³ÆÓë°æ±¾¡£
Server Name=199.199.198.55
//ServerµÄIPµØÖ·¡£
Server Port=80//ServerµÄSocket Port¡£
Server Admin=tomy@vico.bme.zju.edu.cn//Server¹ÜÀíÕßµÄE-mailµØÖ·¡£
Referer=http://199.199.198.55/
//Ö÷Ò³µÄURL·¾¶¡£
Remote Address=199.199.198.89
//Client¶ËµÄIPµØÖ·¡£
[System]
Output File=c:\WebSite\cgi-temp\198ws.out//Êä³öÎļþµÄ·¾¶Ãû¡£
Content File=c:\WebSite\cgi-temp\198ws.inp//ÊäÈëÎļþµÄ·¾¶Ãû¡£
[Form Literal]
type=B//½ÓÊÕµ½µÄForm data¼´client¶Ë¶¯×÷µÄ½á¹ûÐÅÏ¢¡£

¡¡¡¡Ô­ÔòÉÏ¿ÉÓÃÀ´±àдCGI³ÌÐòµÄÓïÑÔÓÐ:perl, AppleScript, Unix Shell, VB, C/C++µÈ¡£µ«ÔÚWindows(NT¡¢3x¡¢95)»·¾³ÏÂ,»¹ÊDZØÐë½èÖú³ÉÊìµÄWindows±à³ÌÓïÑÔ²ÅÄܱàд³ö¾«ÇɵÄWin CGI³ÌÐò¡£CÓïÑÔÊÇÒ»ÃÅÉîÊܹã´ó³ÌÐòԱϲ°®µÄÓïÑÔ,ÓÈÆäÊÇVCi++×÷ΪһÃÅÃæÏò¶ÔÏóµÄÓïÑÔ,¾ß±¸ÁËWindows»·¾³µÄÐí¶à»ù±¾¹¦ÄÜ,ÈçOLE,ODBCµÈ¡£Í¨¹ýODBCÕâÏÄÜ,¿ÉÒԷdz£ÈÝÒ×µØÁ¬½ÓFoxPro, Access, dBASEµÈ¶àÖÖÊý¾Ý¿â,¶øÎÞÐ迼ÂǸ÷ÖÖÊý¾Ý¿â½á¹¹µÄ²îÒì¡£
¡¡¡¡ÒÔÏÂÊDZÊÕßÓÃVC++4.0±àдµÄÒ»¸öÓÃWin CGIÁ¬½ÓÊý¾Ý¿âµÄ·¶Àý¡£Ê¹ÓÃÕß¿ÉÔÚÆÁÄ»ÉÏÑ¡Ôñ,ÒÔ²éѯISP·þÎñÉÌÌṩµÄinternet·þÎñ¼Û¸ñ±í¡£ÏµÍ³»·¾³²ÉÓÃWindows 95,Êý¾Ý¿â²ÉÓÃFoxP ro2.5, WWW Server²ÉÓÃWebsite¡£

1.½¨Á¢Êý¾Ý¿â
¡¡¡¡±¾ÀýµÄCGI³ÌÐòÊÇͨ¹ýODBCÁ¬½ÓÊý¾Ý¿â,Òò´ËÊý¾Ý¿â½¨Íêºó,Ó¦ÓÃ32λODBCÇý¶¯Æ÷¼ÓÒԵǼǡ£

2.±àдHTML³ÌÐò
¡¡¡¡Ê¹ÓÃÕß¿ÉÔÚÆÁÄ»ÉÏÑ¡ÔñÒ»·þÎñÀàÐÍ,ÔÙ°´"Ìá½»"¼ü,¼´¿É²éѯÕâÒ»·þÎñÀàÐ͵ĸ÷¼Û¸ñÀ¸Ä¿¡£ÆäHTMLÎı¾ÃèÊöÈçÏÂ:

{TITLE>ά¿Æ¹«Ë¾internet·þÎñÊշѱê×¼

ά¿Æ¹«Ë¾internet·þÎñÊշѱê×¼



ÄúÒª²éѯµÄÀàÐÍÊÇ:



3.±àдVC++CGI³ÌÐò

¡¡¡¡WebsiteΪC++³ÌÐòÔ±ÌṩÁËÒ»¸öCCGIÀà,¿ÉÔÚ\websiteĿ¼ÏÂÕÒµ½¡£¸ÃÀàÌṩÁËһЩ·½±ãµÄº¯Êý,ÎÞÐè³ÌÐòÔ±±àдһЩֱ½ÓÓëCGI½çÃæ´ò½»µÀµÄµ×²ã¹¤×÷,³ä·ÖÌåÏÖÃæÏò¶ÔÏóÓïÑÔµÄÓÅÊÆ¡£ÔÚVC++4.0Öн¨Á¢Ò»¸ö"Dialog based"¹¤³Ì¿ò¼Ü¡£½«CCGIÀàÒýÈë¿ò¼Ü,¼´½«cgi.h,cgi .cpp¼ÓÈë³ÌÐò¡£È»ºóÓÃVC++µÄClassWizard¹¤¾ß´´½¨Ò»¸öÓëÊý¾Ý¿âÏà¶ÔÓ¦µÄCUserSetÀà,¸ÃÀà¼Ì³ÐMFCÀà¿âÖеÄCRecordSetÀà¡£
Ö÷Òª´úÂë¼ÓÔÚwincgi.cppÎļþÖС£

//³ÌÐò:wincgi.cpp
#include "stdafx.h"
#include "wincgi.h"
#include "cgi.h"
#include "userset.h"
¡­¡­
void ProcessCGI(CCGI *cgi);
BOOL CBaseApp::InitInstance()
{
CCGI cgi(m-ipCmdLine); //ʵÀý»¯CCGIÀà,²¢ÓÃÃüÁîÐвÎÊý³õʼ»¯
if(cgi.CalledAsCGI())
{
try
{
ProcessCGI(&cgi);
//ÔÚ´Ë×öËùÓÐÕæÕýµÄ¹¤×÷
}
catch(CException* e)
{
cgi.HandleException(e);
//Òì³£´¦Àí
e->Delete();
}
}
return FALSE;
}
void ProcessCGI(CCGI *cgi)
{
int i;
CString strTemp, strWebmaster, strReferer;
strWebmaster=cgi->GetCGIVar("Server Admin");
//»ñµÃServer¹ÜÀíÕßµÄE-mailµØÖ·¡£
strReferer=cgi->GetCGIVar("Referer"); //»ñµÃÖ÷Ò³µÄURL·¾¶¡£
CStringArray csaFields;
cgi->EnumFormFieldNames(csaFields);
//È¡µÃËùÓбäÁ¿Ãû,·ÅÔÚÊý×éÖС£
cgi->WriteHTMLHeader();
cgi->WriteHTMLBody("\015\012");
cgi->WriteHTMLBody("\015\012");
CString csaFieldVal;
csaFieldVal=cgi->GetFormField(csaFields[0]);
//µÃµ½µÚÒ»¸ö±äÁ¿µÄÖµ,¼´"usertype"±äÁ¿µÄÖµ¡£
cgi->WriteHTMLBody("

internet·þÎñÊշѱê×¼²éѯ½á¹û


");
CUserSet m-user;
//ʵÀý»¯CUserSetÀà
char sfilter[80];
wsprintf(sfilter,"USER-TYPE='%s''',csaFieldVal);
m-user.m-strFilter=sfilter;
//ÉèÖÃɸѡÆ÷¡£
m-user.Open();
strTemp="

"+m-user.m-USER-TYPE+"ÀàÓû§"+"

\015\012";
cgi->WriteHTMLBody(strTemp);
strTemp="

ÈëÍø·Ñ:"+m-user-FARE-INI+".
\015\012";
cgi->WriteHTMLBody(strTemp);
¡­¡­
strTemp="

ͨÐÅ·Ñ:"+m-user.m-FARE-COM+".
\015\012"
;
cgi->WriteHTMLBody(strTemp);
m-user.Close();
if(!strReferer.IsEmpty())
//ÉèÖûص½Ö÷Ò³µÄêµã¡£
{
cgi->WriteHTMLBody("

Gocgi->WriteHTMLBody(strReferer);

cgi->WriteHTMLBody("\">Backwhere you came from.
\015\012");
}
if(!strWebmaster.IsEmpty())
//ÉèÖÃServer¹ÜÀíÕßµÄE-mailµØÖ·¡£
{
cgi->WriteHTMLBody("

Please email comments to");
cgi->WriteHTMLBody(" "
cgi->WriteHTMLBody(strWebmaster);
"
cgi->WriteHTMLBody("\">");
"
cgi->WriteHTMLBody(strWebmaster);
"
cgi->WriteHTMLBody(".
\015\012");
}
cgi->WriteHTMLBody("\015\012");
cgi->WriteHTMLFooter();
}

4.½áÂÛ
¡¡¡¡½«³ÌÐò±àÒëºó,°Ñwincgi.exe¿½Èëwebsite/cgi-win/Ŀ¼ÏÂ,ÓÃä¯ÀÀÆ÷²éѯ½á¹û¡£ÖÁ´Ë¼òµ¥µØ²ûÊöÁËÓÃVC++±àдWin CGI³ÌÐòµÄÕû¸ö¹ý³Ì,C³ÌÐòÔ±Ò²¿ÉÒÔÓÃ×Ô¼ºÊìϤµÄÓïÑÔ±àдCGI³ÌÐòÁË¡£ÀûÓÃVC++µÄÇ¿´ó¹¦ÄÜ,ÄãµÄWWW Server½«ÎÞËù²»ÄÜ¡£

OracleÊý¾Ý¿âµÄWeb¹¤¾ß¼°ÆäÓ¦Óà
¡¡¡¡ÖÙΡ ÄµÀÉú 

¡¡¡¡Web¼¼ÊõÓëÊý¾Ý¿â¼¼ÊõµÄÁªÒöʹÊݿͻ§¶ËµÄÊý¾Ý¿â·ÃÎÊϵͳ½øÈë´óÖÚÓ¦Óã¬Óû§½èÖúÓÚÆÕͨµÄWebä¯ÀÀÆ÷¾Í¿ÉÒÔ·ÃÎʲ»Í¬Æ½Ì¨Ïµĸ÷ÖÖÊý¾Ý¿âϵͳ¡£ÕâÏî¼¼ÊõʹÊý¾Ý¿âϵͳµÄ¿ª·¢ÃâÈ¥Á˿ͻ§»ú·½µÄ¹¤×÷£¬Ê¹Õû¸ö¿ª·¢¹¤×÷¼¯ÖÐÓÚ·þÎñÆ÷·½£¬´Ó¶øÌá¸ßÁËϵͳµÄÒ×ά»¤ÐÔ£¬Í¬Ê±Ò²Ìá¸ßÁËÊý¾Ý¿âÖÐÊý¾ÝʵʱºÍ¶¯Ì¬·¢²¼µÄÄÜÁ¦¡£±¾ÎÄÄâ¶ÔOracle¹«Ë¾µÄWebServer 2.0×÷Ò»¸ö¼òµ¥µÄ½éÉÜ£¬ÒÔ±ã´ó¼ÒÄܶÔÕâÖÖÊý¾Ý¿â·ÃÎÊ·½Ê½ÓÐËùÁ˽⡣

¡¡¡¡1£®WebServer¼ò½é 

¡¡¡¡Oracle WebServer 2.0ÊÇÒ»¸ö¾ßÓÐÇ¿´óµÄÊý¾Ý¿â¼¯³É¹¦ÄܺͿª·¢»·¾³µÄHTTP·þÎñÆ÷¡£ËüÓÉÁ½´ó²¿·Ö¹¹³É£ºµÚÒ»²¿·ÖÊÇWeb Listener£¬Ëü¸ºÔð½ÓÊÕÓû§µÄURLÇëÇóºÍ·µ»ØÏàÓ¦µÄ½á¹û¡£Êµ¼ÊÉÏ£¬ËüÊÇÒ»¸ö¾ßÓÐÍêÕû¹¦ÄܵÄHTTPÒýÇæ£¬Äܹ»Íê³ÉHTTP·þÎñÆ÷³£ÓõÄËùÓй¦ÄÜ£¬ÆäÖаüÀ¨Í¨¹ýCGI½Ó¿Úµ÷ÓÃÓ¦ÓóÌÐò£¬ËüÖ§³ÖCGI 1.1¡£Oracle WebServer¿ÉÒÔ´´½¨ºÍÆô¶¯¶à¸öListenerÀ´¼àÌý²»Í¬µÄͨÐŶ˿ڣ¬´Ó¶øÌá¸ßϵͳ¶Ô²¢·¢ÇëÇóµÄ´¦ÀíÄÜÁ¦¡£ÁíÍ⣬Web Listener»¹ÓÐÆäËûһЩÓÅÐãÌØÐÔ£¬ÖîÈçÓûùÓÚSSLµÄHTTPSÁ¬½ÓÀ´±£ÕÏÊý¾Ý´«ÊäµÄ°²È«ÐÔ£¬¶ÔÌØ¶¨ÎļþµÄ»º´æÒÔÌá¸ß·ÃÎÊËÙ¶È£¬¶ÔÃô¸ÐÎļþºÍĿ¼µÄÈÏÖ¤±£»¤£¬ÒªÇó·ÃÎʵÄÓû§³ö¾ßÓû§ÃûºÍ¿ÚÁîµÈ¡£

¡¡¡¡WebServerµÄµÚ¶þ²¿·ÖÊÇWeb Request Broker(WRB)£¬Ëü¸ºÔðά»¤Ò»Ð©³ÆÎªWRB¿ÉÖ´ÐÐÒýÇæµÄ½ø³Ì£¬ÕâЩ½ø³ÌÀ´Ô´ÓÚʹÓÃWRB APIµÄ¡¢Äܹ»Íê³ÉÌØ¶¨¹¦Äܵĺǫ́ӦÓóÌÐò£¬WRB API¿ÉÒÔÈõÚÈý·½Ôö¼ÓËûÃÇ×Ô¼ºµÄºǫ́ӦÓóÌÐò£¬ºǫ́ӦÓóÌÐòºÍWRB APIºÏ³ÆÎªWRB·þÎñ¡£Ä¿Ç°WebServer 2.0Ö»ÄÜÌṩÈýÖÖºǫ́ӦÓóÌÐò£¬ËùÒÔËüÖ§³ÖÈýÖÖWRB·þÎñ£º

¡¡¡¡(1)PL/SQL Agent·þÎñ 

¡¡¡¡Í¨¹ýÏòÊý¾Ý¿â·¢²¼ÃüÁÓÉÊý¾Ý¿âÖ´Ðд洢ÔÚÆäÖеÄPL/SQL¹ý³Ì£¬È»ºó½«Êä³ö½á¹ûºÍ״̬ÐÅÏ¢·µ»Ø¸øPL/SQL Agent£¬ËùÒÔWebServerÄܹ»ÀûÓÃÊý¾Ý¿âÖеÄÊý¾Ý¶¯Ì¬²úÉúHTML¡£

¡¡¡¡(2)Java½âÊÍÆ÷·þÎñ 

¡¡¡¡Äܹ»Ö´ÐзþÎñÆ÷ÉϵÄJava×Ö½Ú´úÂ룬¸Ã³ÌÐòʵ¼ÊÉÏÊÇÒ»¸öJavaÐéÄâ»ú£¬¿ÉÒÔ½âÊÍÖ´ÐбàÒëºóµÄJava×Ö½ÚÂ룻JavaÓïÑÔµÄÒýÈëÔÚÒ»¶¨³Ì¶ÈÉÏÃÖ²¹ÁËPL/SQLÓïÑÔÔÚ´¦Àí¶àýÌåºÍͼÐÎÊý¾Ý·½ÃæµÄ²»×ã¡£

¡¡¡¡(3)LiveHTM½âÊÍÆ÷·þÎñ 

¡¡¡¡ÕâÊÇOracle¹«Ë¾¶Ô·þÎñÆ÷¶Ë¹¦Äܺ¯Êý¹¤Òµ±ê×¼µÄÒ»¸ö¹á³¹ºÍÀ©Õ¹£¬¿ÉÒÔÈÃWebÉè¼ÆÕßÔÚWebÒ³ÃæÖÐǶÈëÄܹ»±»²Ù×÷ϵͳִÐеÄÈκγÌÐòµÄÊä³ö¡£

¡¡¡¡2£®WRB¹¤×÷Á÷³Ì 

¡¡¡¡WRBµÄÈýÖÖ·þÎñʵ¼ÊÉ϶ÔÓ¦ÓÚÈýÖÖÔËÐл·¾³£¬Ã¿ÖÖÔËÐл·¾³¶ÔÓ¦ÓÚÒ»¸ö»ò¶à¸öÔÚºǫ́ÔËÐеÄWRB¿ÉÖ´ÐÐÒýÇæ½ø³Ì¡£Óû§µÄä¯ÀÀÆ÷ͨ¹ýWeb ListenerÓë¸÷ÖÖºǫ́ÔËÐеÄWRB·þÎñ½ø³Ì¶¯Ì¬µØ¡¢ÎÞ·ìµØÁ¬½ÓÔÚÒ»Æð¡£ÎÞÂÛºÎʱWeb ListenerÊÕµ½Ò»¸öµ÷ÓÃWRBµÄURL£¬Ëü¶¼»á°Ñ¶Ô¸ÃÇëÇóµÄÖ´ÐÐȨ´«µÝ¸øWRBµ÷¶È³ÌÐò£¬¸Ãµ÷¶È³ÌÐò¸ºÔðÓëWRB¿ÉÖ´ÐÐÒýÇæ½ø³ÌͨÐÅ£¬Ñ°ÕÒ±»ÅäÖÃÓÃÀ´Íê³ÉÔ¤ÆÚWRB·þÎñµÄ¡¢¿ÕÏеÄWRBÒýÇæ½ø³Ì£¬²¢°Ñ¸ÃÇëÇóµÄÖ´ÐмÌÐø´«µÝ¸øËü¡£¸Ã½ø³Ìͨ¹ý½âÎöÓû§URLÇëÇóÖÐËùÇëÇóµÄÎļþÃûÀ´µ÷ÓÃÏàÓ¦µÄÎļþ£¬²¢ÓèÒÔÖ´ÐУ¬È»ºó½«Ö´Ðнá¹ûÒÔHTML¸ñʽ·µ»Ø¸øWeb Listener£¬ÓÉListenerÔÙ·µ»Ø¸øÓû§£¬×îºó¸Ã½ø³Ì½«¿ÕÏÐ״̬֪ͨ¸øµ÷¶È³ÌÐò£¬µÈ´ýеĵ÷Óá£

¡¡¡¡ÓëCGI·½Ê½Ïà±È£¬WRB±ÜÃâÁËÿ´Î´¦ÀíÓû§ÇëÇóʱ¶¼±ØÐë³õʼ»¯Ò»¸ö½ø³Ì²¢ÔÚ´¦Àí½áÊøºóɱËÀ¸Ã½ø³ÌËùÔì³ÉµÄϵͳ¿ªÏú¡£±¾ÎÄÒÔPL/SQL·þÎñΪÀý£¬¶Ô±Èһ϶þÕßÖ®¼äµÄÇø±ð¡£Í¨¹ýCGI»òÕßWRB£¬Óû§¶¼¿ÉÒÔͨ¹ý·ÃÎÊPL/SQL AgentÀ´µ÷ÓÃÊý¾Ý¿âÖд洢µÄPL/SQL´æ´¢¹ý³Ì£¬µ«ÎÞÂÛÒÔÄÄÒ»ÖÖ·½Ê½£¬PL/SQL Agent¶¼±ØÐëÁ¬½Óµ½Êý¾Ý¿â·þÎñÆ÷ÉÏ¡£PL/SQL Agent½ø³ÌÓëÊý¾Ý¿âµÄÁ¬½Ó¿ÉÒÔ·ÖΪÁ½¸ö²½Ö裺

¡¡¡¡(1)PL/SQL AgentÒýÇæ½ø³ÌÒ»´´½¨¾Í½¨Á¢ÆðÓëÊý¾Ý¿âµÄÁ¬½Ó£¬µ«ÊDz¢Ã»ÓеǼ£¬Ö±µ½ÓÐÓû§ÇëÇóʱ²Å½øÐиÃÏ×÷£»

¡¡¡¡(2)µÇ¼µ½Êý¾Ý¿âºó£¬ÎªÃ¿¸öÇëÇó·ÖÅäÒ»¸öµ¥¶ÀµÄÊý¾Ý¿â»á»°£¬Ò»µ©ÇëÇó´¦ÀíÍê±Ï£¬¸Ã½ø³Ì¾ÍÍ˳öÊý¾Ý¿â£¬µ«ÈÔÈ»±£³ÖÊý¾Ý¿âÁ¬½Ó£¬µÈ´ýÏÂÒ»´ÎÓû§ÇëÇó¡£

¡¡¡¡ÔÚÕâÁ½¸ö²½ÖèÖУ¬µÚÒ»²½ÊǺÄʱ×î¶àµÄ£¬ËùÒÔ£¬WRBͨ¹ý¼õÉÙµÚÒ»²½µÄ·¢Éú´ÎÊý£¬¼«´óµØÌá¸ßÁËÿ´ÎÊý¾Ý¿â»á»°µÄƽ¾ùÍê³ÉËÙ¶È¡£ÌÈÈôÒÔCGI·½Ê½·ÃÎÊPL/SQL Agent£¬Ôò¶Ôÿ´ÎÓû§ÇëÇó¶¼±ØÐëÍê³ÉÒÔÉÏÁ½¸ö²½Ö裬ͬʱ»¹Òª¸½¼Óÿ´Î´´½¨ºÍÖÕÖ¹CGI½ø³ÌËùÔì³ÉµÄϵͳʱ¼äµÄ¿ªÏú£¬ËùÒÔ£¬WRB·ÃÎÊ·½Ê½µÄ¿ÉÔËÐÐÐÔÄÜÔ¶Ô¶¸ßÓÚCGI·½Ê½µÄ¡£

¡¡¡¡3£®WebServerµÄÅäÖà

¡¡¡¡Í¨¹ýä¯ÀÀÆ÷µ÷ÈëWebServerµÄ¹ÜÀíÒ³Ãæ£¬¼üÈ밲װʱȷ¶¨µÄ¹ÜÀíÔ±¿ÚÁ¾Í¿ÉÒÔ½øÐйÜÀíÈÎÎñÁË¡£Ê×ÏÈÊÇWeb ListenerµÄÅäÖã¬ÒªÈ·¶¨µÄ¹Ø¼ü²ÎÊýÓÐListenerµÄÃû×Ö¡¢¼àÌýµÄ¶Ë¿ÚºÅÒÔ¼°ÐéÄâ·¾¶Ëù¶ÔÓ¦µÄWRB·þÎñ£¬´Ó¶øÊ¹ListenerÄܹ»¸ù¾ÝÓû§URLÇëÇóÖеÄÐéÄâ·¾¶ÃûÀ´È·¶¨µ÷ÓÃÏàÓ¦µÄWRB·þÎñ¡£Èç¹ûÐéÄâ·¾¶ÃûδÄܶÔÓ¦ÕýÈ·µÄWRB·þÎñ£¬ÔòWebServer²»ÄÜÖ´ÐÐURLÖÐÖ¸¶¨µÄÎļþ£¬Ëü»áÏòä¯ÀÀÆ÷·µ»ØURL²»ÕýÈ·µÄ±¨´íÐÅÏ¢¡£

¡¡¡¡WRBµÄÅäÖÃÐèÒªÖ¸¶¨Ã¿ÖÖ·þÎñÔ¤ÏÈ´´½¨µÄ½ø³ÌÊýÄ¿£¬ÒÔ¼°×î´ó¿ÉÒÔÔö¼Óµ½µÄ½ø³ÌÊýÄ¿ºÍ×îÉÙÒª±£³ÖµÄ¿ÕÏнø³ÌÊýÄ¿£¬Í¬Ê±£¬»¹ÐèÒªÖ¸¶¨ÔËÐÐÿÖÖ·þÎñËùÐèÒªµÄºǫ́³ÌÐòµÄÎïÀíĿ¼£¬Ò²¾ÍÊÇÖ¸Ã÷ÿÖÖÔËÐл·¾³ËùÐèÒªµÄÃüÁî½âÊÍÆ÷µÄÎïÀíĿ¼λÖá£

¡¡¡¡PL/SQL AgentÅäÖõĹؼüÊÇDCDµÄ´´½¨ºÍά»¤£¬Ã¿¸ö²»Í¬Ãû×ÖµÄDCDÊÇÒ»¸ö±»WebServer¹ÜÀíµÄ²Ù×÷ϵͳÎļþ£¬³ÆÎªÊý¾Ý¿âÁ¬½ÓÃèÊö·û£¬Ëü¼Ç¼×ÅÓÃÓÚ½¨Á¢Êý¾Ý¿âÁ¬½ÓËùÐèÒªµÄÓû§Ãû¡¢¿ÚÁî¡¢ÒªÁ¬½ÓµÄÊý¾Ý¿âºÍÆäËûһЩ±ØÒªÐÅÏ¢£¬ÆäÖУ¬Êý¾Ý¿âÖ¸µÄÊÇÒªÖ´ÐеĴ洢¹ý³ÌËùÔÚµÄÊý¾Ý¿â¡£DCD¾ö¶¨×ÅPL/SQL AgentÏìÓ¦Óû§ÇëÇóʱËù¾ßÓеÄÊý¾Ý¿â·ÃÎÊȨÏÞÒÔ¼°ÄÜ·ÃÎʵÄÊý¾Ý¿â·¶Î§¡£ÔÚURLÖУ¬DCD±íÏÖΪ¶ÔÓ¦WRB·þÎñµÄÐéÄâĿ¼ÖеÄÒ»¸öÎļþ£¬Í¨¹ýÖ¸¶¨²»Í¬µÄDCD£¬¿ÉÒÔ·ÃÎʲ»Í¬Êý¾Ý¿âÖеĴ洢¹ý³Ì¡£

¡¡¡¡4£®URL¸ñʽµÄÌØÊâ¹æ¶¨

¡¡¡¡µ÷Óþ²Ì¬WebÒ³ÃæµÄURLºÍͨ³£µÄURLûÓÐÊ²Ã´Çø±ð£¬Ö»ÊÇҪעÒâÐéÄâ·¾¶ºÍÎïÀí·¾¶µÄÕýÈ·¶ÔÓ¦£¬¶ÔÓÚWRBÖеÄJava·þÎñºÍLiveHTML·þÎñ£¬ÐéÄâ·¾¶ÔòÒª¶ÔÓ¦ÕýÈ·µÄ·þÎñÀàÐÍ¡£ÀûÓÃPL/SQL Agentµ÷Óö¯Ì¬WebÒ³ÃæµÄURL¸ñʽÉÔ΢ÓÐËù²»Í¬£¬Æä¸ñʽÊÇ£ºHTTP://Ö÷»úÃû:¶Ë¿ÚºÅ/ÐéÄâ·¾¶/¸½¼ÓÐÅÏ¢/Ó¦ÓóÌÐòÃû£¬ÆäÖУ¬Ö÷»úÃûΪWebServerËùÔÚµÄÍøÂçµØÖ·£¬¿ÉÒÔÊÇIPµØÖ·»òÕßÏàÓ¦µÄ»úÆ÷Ãû£»¶Ë¿ÚºÅΪָ¶¨Listener¼àÌýµÄ¶Ë¿Ú£»ÐéÄâ·¾¶ÓÃÀ´±êʶҪִÐеÄPL/SQL Agent·þÎñ£¬¶ÔÓ¦ÓÚÔÚListenerÖж¨ÒåµÄÐéÄâ·¾¶Ãû£»¸½¼ÓÐÅÏ¢Ö¸µÄÊÇËùÒªÓ¦ÓõÄDCDµÄÃû³Æ£¬Ò²¾ÍÊÇÒªÒÔºÎÖÖÉí·ÝµÇ¼µ½ÄÄÒ»¸öÊý¾Ý¿âÖУ»Ó¦ÓóÌÐòÃûÖ¸µÄÊÇDCDÖ¸¶¨µÄÊý¾Ý¿âÖеÄÒªÖ´ÐеĴ洢¹ý³ÌÃû¡£

¡¡¡¡5£®´æ´¢¹ý³ÌºÍHTMLÎļþÖ®¼äµÄ²ÎÊý´«µÝ 

¡¡¡¡Í¨³£ä¯ÀÀÆ÷ºÍ·þÎñÆ÷Ö®¼äµÄÐÅÏ¢´«µÝÊÇ£ºÔÚ¿Í»§»ú¶ËµÄHTMLÎļþÖÐÓÃForm±íµ¥ÊÕ¼¯Óû§µÄÐÅÏ¢ÊäÈ룬ȻºóÉÏ´«¸ø·þÎñÆ÷£¬ÓÉ·þÎñÆ÷µ÷ÓÃÏàÓ¦µÄÓ¦ÓóÌÐò¶ÔÓû§ÊäÈëÐÅÏ¢½øÐд¦Àí£¬WebServerÑØÓÃÁËÕâÖÖ·½Ê½¡£

¡¡¡¡³ÌÐò1ÊÇÒ»¸ö¼òµ¥µÄÐÅÏ¢´«µÝµÄÀý×Ó£¬ÔÚ¿Í»§¶ËHTMLÎļþÖеÄForm±íµ¥Îª£º

¡¡¡¡


¡¡¡¡"http£º//citslab01.hit.edu.cn£º8000/ows-bin/dcd-person/data_deal">

¡¡¡¡

ÇëÊäÈë²éѯÈËÃû£º

¡¡¡¡

¡¡¡¡

¡¡¡¡£¨³ÌÐò1£©

¡¡¡¡·þÎñÆ÷¶ËÌáÈ¡¸Ã²ÎÊýµÄÏàÓ¦´æ´¢¹ý³Ì¼û³ÌÐò2£º

¡¡¡¡Create or replace procedure data_deal (person in varchar2) is 

¡¡¡¡Sex varchar2;

¡¡¡¡Begin select sex_record into sex 

¡¡¡¡From person_sex where name=person;

¡¡¡¡Htp.print (person||' is '|| sex)

¡¡¡¡End;

¡¡¡¡£¨³ÌÐò2£©

¡¡¡¡ÔÚÕâÁ½¸ö³ÌÐòÖУ¬citslab01.hit.edu.cn ÊÇһ̨Ö÷»úÃû£»8000ÊÇListener¼àÌýµÄ¶Ë¿ÚºÅ£»ows-bin¶ÔÓ¦ÓÚPL/SQL·þÎñ£»dcd-person¶ÔÓ¦ÓÚÒ»¸öDCDÁ¬½Ó·û£»data_dealÊÇËùÒªµ÷ÓõĴ洢¹ý³ÌÃû£»sex_recordºÍnameÊDZísex_recordµÄÁ½¸ö×ֶΣ»HtpÊÇWebServer¸½´øµÄ¿ª·¢°üÖ®Ò»£¬Htp.printÓï¾äÏòä¯ÀÀÆ÷Êä³öÒ»ÐÐÎı¾¡£²ÎÊý´«µÝµÄ¹Ø¼üÊÇHTMLÎļþÖеıäÁ¿ºÍ´æ´¢¹ý³ÌÊäÈë±äÁ¿µÄÃû³ÆÍ³Ò»£¬ÕâÑù²ÅÄÜÈ·±£²ÎÊý´«µÝÕýÈ·¡£ÔÚÉÏÀýÖУ¬±äÁ¿Ãû¶¼Îªperson¡£ÔÚʵ¼Ê¿ª·¢ÖУ¬»¹¿ÉÄÜÓöµ½¶à¸ö²ÎÊýÊäÈëºÍÉ趨²ÎÊýĬÈÏÖµµÄÇé¿ö£¬ÏÞÓÚÆª·ù£¬±¾ÎIJ»ÔÙ׸Êö¡£½â¾öÎÊÌâµÄ¹Ø¼ü»¹ÊÇҪעÒâ±äÁ¿ÃûµÄͳһ¡£

¡¡¡¡6£®WebServerµÄ¿ª·¢°ü 

¡¡¡¡WebServerÒ»¹²ÌṩÁËÈýÖÖ¿ª·¢°ü¡£Ò»ÖÖ³ÆÎªJava Web Toolkit£¬ÀûÓÃÕâЩJavaÀ࣬¿ª·¢ÈËÔ±Äܹ»ÔÚJava Application³ÌÐòÖе÷ÓÃPL/SQL ´æ´¢¹ý³Ì£¬´Ó¶øÓÐЧµØ¸´ºÏÕâÁ½ÖÖÓïÑÔµÄÓŵ㣬ͬʱ£¬ÕâÖÖ¿ª·¢°ü»¹°üÀ¨Ò»ÖÖÓÃÓÚJava Applet ³ÌÐòµÄ°ü×°¹¤¾ß£¬¿ÉÒÔ½«Java Applet³ÌÐò´æ´¢ÓÚÊý¾Ý¿âÖУ¬²¢Í¨¹ýJava½âÊÍÆ÷´ÓÊý¾Ý¿âÖн«ËüÃÇÈ¡³ö£¬È»ºóÄÚǶÓÚWebÒ³ÃæÖз¢Ë͵½¿Í»§¶ËÖ´ÐС£Java Web ToolkitÒ»¹²ÌṩÁËÈýÖÖJava Package£¨¼û±í1£©£º

¡¡¡¡Oracle.html. * º¬ÓÐÉú³É¶¯Ì¬HTMLµÄ¶ÔÏó 

¡¡¡¡Oracle.rdbms. * º¬ÓзÃÎÊÊý¾Ý¿âµÄ¶ÔÏó 

¡¡¡¡Oracle.plsql. * º¬ÓзÃÎÊPL/SQLµÄ¶ÔÏó 

¡¡¡¡£¨±í1£©

¡¡¡¡ÁíÒ»ÖÖ¿ª·¢°ü³ÆÎªPL/SQL Web Toolkit¡£½èÖúÓڸÿª·¢°ü£¬³ÌÐò¿ª·¢Õß²»ÐèÒªÖªµÀHTMLµÄ׼ȷÓï·¨£¬Ö»ÐèÒª¶ÔHTMLÓÐÒ»¸ö´ó¸ÅµÄÈÏʶ¾ÍÄÜÉè¼Æ³ö±ê×¼µÄWeb Ò³Ãæ¡£¸Ã¿ª·¢°üÖ÷Òª¹¦Äܲ¿¼þÓÐÈý¸ö£ºÒ»¸ö³ÆÎªHTP(HyperText Procedure Package)£¬¸ÃPackageÖеĴ洢¹ý³ÌÄܹ»Ö±½Ó·µ»ØHTMLÎļþÖеÄTags±êÇ©£¬ËüÊÇʹÓÃ×îÆµ·±µÄÒ»¸ö¹¤¾ß£»µÚ¶þ¸ö³ÆÎªHypertext Function£¬Ã¿¸ö³¬Îı¾º¯Êý¿ÉÒÔ·µ»ØËü¶ÔÓ¦µÄ³¬Îı¾±êÇ©£¬µ«³¬Îı¾º¯ÊýµÄÊä³ö²»ÄÜÖ±½Ó´«µÝµ½PL/SQL Agent£¬ËùÒÔ±ØÐëµ÷ÓÃHtp.printÓï¾ä²ÅÄÜʹº¯ÊýµÄÊä³öÕæÕý¹¹³Éʵ¼ÊHTMLÎļþµÄÒ»²¿·Ö¡£ÏÂÃæÁ½¸öÓï¾äµÄ×÷ÓÃÊÇÒ»ÑùµÄ£ºHtp.print (htf.bold ('hello'))ºÍHtp.bold('hello')£¬ËüÃǶ¼¶ÔÓ¦ÓÚ³¬Îı¾±êÇ©hello¡£

¡¡¡¡Ã¿¸ö³¬Îı¾º¯Êý¶¼ÓÐÆäÏà¶ÔÓ¦µÄ¹¦ÄÜÏàͬµÄ³¬Îı¾´æ´¢¹ý³Ì£¬ËùÒÔ³¬Îı¾º¯ÊýÒ»°ãÓÃÓÚǶÌ×µ÷ÓõÄÄÚ²ãµ÷ÓÃÖС£µÚÈý²¿·ÖÊÇOWA´æ´¢¹ý³Ì°ü£¬ÕâÊÇÒ»×éÄÜʵÏÖWeb³£Óù¦ÄܵĴ洢¹ý³ÌºÍº¯ÊýµÄ¼¯ºÏ£¬¾ßÌåÄÚÈݼû±í2£º

¡¡¡¡OWA_UTIL ÓÃÓÚÖÆ×÷Ç©ÃûºÍ»ñÈ¡»·¾³±äÁ¿¡£

¡¡¡¡OWA_PATTERN ¶Ô×Ö·û´®½øÐвéÕÒºÍÆ¥ÅäµÈ¸´ÔÓ²Ù×÷¡£

¡¡¡¡OWA_TEXT ºÍOWA_PATTERNһͬʹÓ㬶ÔÎı¾½øÐиñʽ²Ù×÷£¬Ò²¿ÉÒÔµ¥¶ÀʹÓá£

¡¡¡¡OWA_IMAGE ¸Ã°üÖеĺ¯ÊýÌṩÁ˶Գ¬Îı¾Í¼ÏñµÄ²Ù×÷¹¦ÄÜ¡£

¡¡¡¡OWA_COOKIE Ïòä¯ÀÀÆ÷·¢ËÍ»òÕß»ñÈ¡COOKIE¡£

¡¡¡¡£¨±í2£©

¡¡¡¡7£®Ó¦ÓÃʵÀý 

¡¡¡¡ÏÞÓÚÆª·ù£¬±¾ÎÄÖ÷Òª½éÉÜPL/SQL AgentµÄÓ¦Óá£ÔÚÏÂÃæµÄÀý×ÓÖУ¬Óû§ÔÚ´æ´¢¹ý³Ìp_formÉú³ÉµÄHTMLÎļþÖÐÊäÈëÐÕÃû£¬²¢Ñ¡ÔñÕýÈ·µÄ¸öÈËÐÅÏ¢£¬È»ºóÌá½»¸ø´æ´¢¹ý³Ìp_print£¬¸Ã´æ´¢¹ý³Ì½«Óû§µÄÐÅÏ¢ÌáÈ¡³öÀ´²¢´òÓ¡µ½ÆÁÄ»ÉÏ¡£³ÌÐò3ÊÇ´æ´¢¹ý³Ìp_formµÄ´úÂ룺

¡¡¡¡CREATE OR REPLACE PROCEDURE p_form AS 

¡¡¡¡BEGIN 

¡¡¡¡ HTP.HTMLOPEN£»

¡¡¡¡ HTP.HTITLE('¸öÈËÐÅÏ¢ÊäÈë±íµ¥')£»

¡¡¡¡ //³¬Îı¾Îļþ±êÌâ 

¡¡¡¡HTP.FORMOPEN ('p_print')£»

¡¡¡¡ //Ìá½»ÐÅÏ¢µÄ´æ´¢¹ý³Ì 

¡¡¡¡ HTP.P('ÐÕÃû'||HTF.FORMTEXT('NAME'))£»

¡¡¡¡ //Îı¾¿òÊäÈë 

¡¡¡¡ HTP.P('ÐÔ±ð:')£»

¡¡¡¡ HTP.P('ÄÐ'||HTF.FORMRADIO('SEX','M')£»

¡¡¡¡ //µ¥Ñ¡°´Å¥

¡¡¡¡ HTP.P('Å®'||HTF.FORMRADIO('SEX','F')£»

¡¡¡¡ HTP.FORMSELECTOPEN('DEP','²¿ÃÅ£º')£»

¡¡¡¡ //µ¥Ñ¡ÏÂÀ­¿ò 

¡¡¡¡ HTP.FORMSELECTOPTION('ÏúÊÛ')£»

¡¡¡¡ HTP.FORMSELECTOPTION('άÐÞ')£»

¡¡¡¡ HTP.FORMSELECTOPTIONCLOSE£»

¡¡¡¡HTP.P('Ö÷¹Ü:'||HTF.FORMCHECKBOX('HEAD'))£»

¡¡¡¡ //¸´Ñ¡¿ò 

¡¡¡¡HTP.PARAGRAPH£»

¡¡¡¡ //»»Ðзû 

¡¡¡¡HTP.FORMRESET£»

¡¡¡¡ //È¡Ïû°´Å¥

¡¡¡¡HTP.FORMSUBMIT£»

¡¡¡¡ //Ìá½»°´Å¥

¡¡¡¡ HTP.FORMCLOSE£»

¡¡¡¡ HTP.HTMLCLOSE£»

¡¡¡¡END£»

¡¡¡¡£¨³ÌÐò3£©

¡¡¡¡³ÌÐò4ÊÇ´æ´¢¹ý³Ìp_printµÄ´úÂ룺

¡¡¡¡CREATE OR REPLACE PROCEDURE p_print (

¡¡¡¡ NAME VARCHAR2£º=NULL,

¡¡¡¡ SEX VARCHAR2£º=NULL,

¡¡¡¡ DEP VARCHAR2£º=NULL,

¡¡¡¡ HEAD VARCHAR2£º=NULL) AS 

¡¡¡¡ //»ñÈ¡ÊäÈë±äÁ¿

¡¡¡¡BEGIN 

¡¡¡¡ HTP.HTMLOPEN£»

¡¡¡¡ HTP.HTITLE('´òÓ¡µÄ½á¹û')£»

¡¡¡¡ HTP.P('ÐÕÃû:'||NAME||'
')£»

¡¡¡¡ //Êä³öÐÕÃû 

¡¡¡¡ HTP.P('ÐÔ±ð:'||SEX||'
')£»

¡¡¡¡ //Êä³öÐÔ±ðµÄµ¥Ñ¡½á¹û£¬

¡¡¡¡ HTP.P('²¿ÃÅ:'||DEP||'
')£»

¡¡¡¡ //Êä³ö²¿ÃŵÄÏÂÀ­¿òµ¥Ñ¡½á¹û 

¡¡¡¡ HTP.P('Ö÷¹Ü£º'||HEAD||'
')£»

¡¡¡¡ //Êä³öÊÇ·ñΪÖ÷¹ÜµÄ¸´Ñ¡¿ò½á¹û 

¡¡¡¡ HTP..HTMLCLOSE£»

¡¡¡¡END£»

¡¡¡¡£¨³ÌÐò4£©

¡¡¡¡×ÜÖ®£¬Oracle WebServer 2.0ΪWebÊý¾Ý¿âµÄ¿ª·¢ÌṩÁ˷ḻµÄ¿ª·¢¹¤¾ßºÍ¹¦ÄÜÇ¿´óµÄ¿ª·¢»·¾³£¬Îª»ùÓÚWebµÄÊý¾Ý·¢²¼ÌṩÁËÁ¼ºÃµÄ½â¾ö·½°¸¡£

¡¡¡¡£¨×÷ÕßµØÖ·£º±±¾©»³Èá3380ÐÅÏä73ºÅ·ÖÏä 101416 ÊÕ¸åÈÕÆÚ£º1998.12.28£©

ʹÓÃMFC±àдFTP³ÌÐò

ÎÅâùÑó

1¡¢Éú³ÉCInternetSession±äÁ¿¡£

CInternetSession ses;

2¡¢´ò¿ªFTPÁ¬½Ó¡£

CFtpConnection* pFTP=ses.GetFtpConnection("ftp.microsoft.com","user","password",port,FALSE);

3¡¢´ò¿ªÎļþ¡£

CInternetFile* pF=pFTP->OpenFile("abc.exe");

¸ü¼òµ¥µÄÊÇʹÓÃ

CFtpConnect::GetFile(...) ; CFtpConnection::PutFile(...) ;¿ÉÒÔ¿½±´Îļþ¡£

4¡¢¶ÁÈ¡Îļþ£¬ÓÉÓÚCInternetFileÊÇCStdFileµÄÅÉÉúÀ࣬Òò´Ë¿ÉÒÔʹÓÃCFile,CStdFileµÄËùÓк¯Êý¡£

pF->Read(...)

¸ß¼¶Ó÷¨£º

1¡¢²éÕÒÎļþ£¬ÁÐÎļþĿ¼¡£(FTP Tree Sample in VC5)

CFTPFileFindÀà¿ÉÒÔ°ïÖúÄãÁгöµ±Ç°Ä¿Â¼ÏµÄËùÓÐÎļþ¡£Ó÷¨ºÍCFileFindÏàͬ¡£

2¡¢¶ÏµãÐø´«¡£

µ±´ò¿ªÎļþºó£¬¿ÉÒÔʹÓÃCInternetFile::Seek(...)ÖØ¶¨Î»Ö¸Õë¡£µ«Èç¹û¸Ã·þÎñÆ÷²»Ö§³Ö¶ÏµãÐø´«»á²úÉúÒì³££¬Ó¦¸ÃÓÐÏàÓ¦µÄ²¶×½´úÂë¡£

ÆäËü£º

ͬÑùµÄCHttpConnectionµÄÓ÷¨Ò²ºÜÀàËÆ¡£

ÓÃVC++5.0±àдFtp¿Í»§³ÌÐò 

¡¡¡¡Ëæ×ÅInternetµÄѸÃÍ·¢Õ¹£¬ÍøÂçÈí¼þµÄ¿ª·¢ÓëÉè¼ÆÏÔµÃÔ½À´Ô½ÖØÒª¡£×î³õµÄÍøÂçÈí¼þÖ÷ÒªÊÇÒÔUNIX²Ù×÷ϵͳΪÈí¼þ¿ª·¢»·¾³µÄ£¬Ëæ×ÅWindows¸öÈ˲Ù×÷ϵͳµÄÁ÷ÐУ¬´«Í³µÄ±à³Ì½çÃæÏòÕâһеÄÈíÓ²¼þƽ̨ת»»±äµÃ¼«ÎªÆÈÇС£VC++5.0°æµÄMFC·â×°Á˵ÄCSocketÀàÌṩÁ˸߼¶µÄSOCKETÖ§³Ö£¬Îª±àдÒòÌØÍø»·¾³Ï»ùÓÚWindowsƽ̨µÄC/S³ÌÐòÌṩÁ˼«´óµÄ·½±ã¡£±¾ÎÄͨ¹ýÀûÓÃCSocketÀà±àдһ¸öFTP¿Í»§³ÌÐòΪÀý½éÉÜÁËÆäʹÓ÷½·¨£¬ÏòÄã½Ò¿ªÍøÂç±à³ÌµÄÃØÃÜ¡£

¡¡¡¡WINSOCKÒÔ¶¯Ì¬Á´½Ó¿âµÄÐÎʽÏò³ÌÐòÔ±ÌṩÁËÒ»¸ö¹¦ÄÜÇ¿´óµÄº¯Êý¼¯£¬Í¨¹ý¶ÔÕâ¸öº¯Êý¼¯µÄµ÷Óã¬Ó¦ÓóÌÐò¿ÉÒÔÍê³ÉÆäÌØ¶¨µÄÈÎÎñ¡£È»¶øÈ±µãÊdzÌÐò½ÏΪ·±Ëö¡£ÎªÁ˽â¾öÕâÒ»ÎÊÌ⣬Microsoft¶ÔÆäÍÆ³öµÄVisual C++ϵÁеĻù±¾Àà¿â(MFC)×öÁËÖð²½µÄÍêÉÆ¡£ÓÈÆäÊÇнü·¢ÐеÄVC++5.0°æ£¬·â×°ÁËÐí¶àÓëÍøÂç³ÌÐòÉè¼ÆÏà¹ØµÄÀà¡£CSocket¾ÍÊÇÆäÖÐÖ®Ò»¡£

¡¡¡¡CSocketÀà(¸¸ÀàΪCAsyncSocket)ÌṩÁËÒ»¸ö¸ß¼¶µÄSOCKETÖ§³Ö£¬Íê³É¶ÔµÍ²ãº¯ÊýµÄ²Ù×÷£¬´ó´ó½µµÍÁ˱à³ÌÄѶȡ£ÕâÀÒÔWindows 95Ϊ¿ª·¢»·¾³£¬²ÉÓÃVisual C++5.0±àдһ¸öFtp¿Í»§³ÌÐò£¬À´ËµÃ÷ÈçºÎÉîÈëÓÐЧµØÀûÓÃCSocketÀà½øÐÐÍøÂçÈí¼þµÄ¿ª·¢¡£¿¼Âǵ½C/SģʽÏÂÓ¦½¨Á¢Ò»¸öFtp·þÎñÆ÷µÄÎÊÌ⣬ËùÒÔÑ¡ÔñWindows 95µÄ4.00.950B°æ£¬ÒòΪÕâ¸ö°æ±¾º¬ÓиöÈËWeb·þÎñÆ÷£¬ÌṩÁËHTTP¼°FTP·þÎñ¡£

¡¡¡¡Ê×ÏÈ£¬½¨Á¢Ò»¸öSDI(µ¥Îĵµ½çÃæ)Ó¦ÓóÌÐòµÄ»ù±¾¿ò¼Ü¡£ÕâÒ»²½±È½Ï¼òµ¥£¬ÔÚVC++5.0ÖУ¬MFC AppWizardͨ¹ý´´½¨Ò»¸öеÄÏîÄ¿(Project)¶ø±»¼¤»î£¬Ñ¡ÔñFile²Ëµ¥ÖеÄNewÑ¡ÏѡȡProject£¬ÊäÈëÎļþÃûΪSuperFTP£¬Ñ¡ÔñOK¡£ËæºóµÄ²½ÖèΪVC++×Ô¶¯´´½¨¹ý³Ì£¬¿ÉÒԲμûÏà¹Ø×ÊÁÏ£¬²»ÔÙÏêÊö¡£×îºóÉú³ÉÒÔϼ¸¸öÖ÷ÒªÀࣺ
¡¡¡¡CMainFrame£¬
¡¡¡¡CSuperFTPApp,
¡¡¡¡CSuperFTPDoc,
¡¡¡¡CSuperFTPView,
¡¡¡¡CAboutDlg¡£
¡¡¡¡Æä´Î£¬½¨Á¢¼¸¸öÐÂÀ࣬ÈçÏÂ±í£º
¡¡¡¡ÓйØFtpЭÒéÇë²Î¿¼Ïà¹Ø×ÊÁÏ£¬ÕâÊÇÕýÈ·¿ª·¢Ftp¿Í»§³ÌÐòµÄÖØÒªÇ°Ìá¡£
¡¡¡¡µÚÈý²½£¬¾ßÌå³ÌÐòµÄ±àÖÆ¡£ÓÉÓÚÕû¸ö³ÌÐò±È½Ï³¤£¬ÏÂÃæ¸ø³öÖ÷Òª²¿·ÖµÄºËÐÄ´úÂë²¢¸½×¢ÊÍ¡£
¡¡¡¡1.MainFrm.cpp:
¡¡¡¡¡­¡­
¡¡¡¡CMainFrame::CMainFrame()
¡¡ £û
¡¡¡¡//³õʼ»¯Ö¸Õë
¡¡¡¡m_ctrlconn=NULL;
¡¡¡¡m_dataconn=NULL;
¡¡¡¡m_recvconn=NULL;
¡¡¡¡£ý
¡¡¡¡//Ñ¡Ôñ²Ëµ¥Ïî¡°¿ìËÙÁ¬½Ó¡
¡¡¡¡void CMainFrame::OnQuickconnect()
¡¡¡¡£û
¡¡¡¡if(!Makeconn())
¡¡¡¡MessageBox(¡°FTP¿ØÖÆÁ´Â·½¨Á¢Ê§°Ü!¡±£¬¡°Ìáʾ¡±£¬MB_ICONWARNING);
¡¡¡¡if(!MakeRemoteDir())
¡¡¡¡MessageBox(¡°FTPÊý¾ÝÁ´Â·½¨Á¢Ê§°Ü!¡±£¬¡°Ìáʾ¡±£¬MB_ICONWARNING)£»
¡¡¡¡£ý
¡¡¡¡//½¨Á¢¿ØÖÆÁ´Â·
¡¡¡¡BOOL CMainFrame£º£ºMakeconn()
¡¡¡¡£û
¡¡¡¡¡­¡­
¡¡¡¡Quickconn dlg£»
¡¡¡¡//ÊäÈë·þÎñÆ÷Ãû£¬Óû§Ãû£¬¿ÚÁî
¡¡¡¡if (dlg.DoModal()==IDOK)
¡¡¡¡£û
¡¡¡¡fservername=dlg.m_servername;
¡¡¡¡fusername=dlg.m_username;
¡¡¡¡fpassword=dlg.m_password;
¡¡¡¡£ý
¡¡¡¡m_ctrlconn=new ctrlsocket();
¡¡¡¡//½¨Á¢Ò»¸öSOCKET
¡¡¡¡If(!m_ctrlconn->Create(0,SOCK_STREAM,NULL)
¡¡¡¡£û
¡¡¡¡delete m_ctrlconn;
¡¡¡¡m_ctrlconn=NULL£»
¡¡¡¡MessageBox(¡°Socket()½¨Á¢Ê§°Ü!¡±£¬¡°Ìáʾ¡±£¬MB_ICONWARNING)£»
¡¡¡¡return FALSE£»
¡¡¡¡£ý
¡¡¡¡//ÉêÇëÍøÂçʼþ֪ͨ
¡¡¡¡If(!m_ctrlconn->AsyncSelect(FD_READ£üFD_WRITE£üFD_ACCEPT£üFD_CONNECT£üFD_CLOSE))
¡¡¡¡£û
¡¡¡¡MessageBox(¡°AsyncSelect()´íÎó!¡±£¬¡°Ìáʾ¡±£¬MB_ICNWARNING);
¡¡¡¡return FALSE£»
¡¡¡¡£ý
¡¡¡¡BeginWaitCursor();
¡¡¡¡//ÏòÓÉfservernameÖ¸¶¨µÄÖ÷»ú·¢³öÁ¬½ÓÇëÇó
¡¡¡¡if(!m_ctrlconn->Connect(fservername,IPPORT_FTP))
¡¡¡¡£û
¡¡¡¡delete m_ctrlconn;
¡¡¡¡m_ctrlconn=NULL;
¡¡¡¡MessageBox(Ô¶¶Ë·þÎñÆ÷Á¬½Óʧ°Ü!¡±£¬¡°Ìáʾ¡±£¬MB_ICONWARNING)£»
¡¡¡¡return FALSE£»
¡¡¡¡£ý
¡¡¡¡EndWaitCursor();
¡¡¡¡¡­¡­
¡¡¡¡return TRUE;
¡¡¡¡£ý
¡¡¡¡ÕâÀѡÔñÁ˲˵¥µÄ¡°¿ìËÙÁ¬½Ó¡±Ïîºó£¬Ö´Ðнá¹ûÈçÏÂͼ£º
¡¡¡¡Èç¹ûÑ¡ÔñÁË¡°ÄäÃû¡±µÇ¼£¬Ó¦ÓóÌÐòÔò×Ô¶¯½«Óû§ÐÕÃûºÍ¿ÚÁî×ÖÌî³äΪ£ºanonymous,guest@unknown
¡¡¡¡BOOL CMainFrame::MakeRemoteDir()
¡¡¡¡£û
¡¡¡¡if(m_ctrlconn==NULL)
¡¡¡¡¡¡£û
¡¡¡¡¡¡(¡°ÇëÁ¬½Óµ½·þÎñÆ÷!¡±£¬¡°Ìáʾ¡±£¬MB_iconwarwing)£»
¡¡¡¡¡¡retrurn FALSE£»
¡¡¡¡¡¡£ý
¡¡¡¡¡¡if(!MakeDataListen())
¡¡¡¡¡¡£û
¡¡¡¡¡¡MessageBox(¡°Êý¾ÝÁ´Â·½¨Á¢Ê§°Ü!¡±£¬¡°Ìáʾ¡±£¬MB_ICONWARNING)£»
¡¡¡¡¡¡return FALSE£»
¡¡¡¡¡¡£ý
¡¡¡¡¡¡¡­¡­
¡¡¡¡¡¡return TRUE£»
¡¡¡¡£ý
¡¡¡¡//´¦ÀíÀ´×ÔÔ¶¶Ë·þÎñÆ÷µÄÏìÓ¦
¡¡¡¡BOOL CMainFrame::Processftp()
¡¡¡¡£û
¡¡¡¡¡­¡­¡­
¡¡¡¡£ý
¡¡¡¡//½¨Á¢Êý¾ÝÁ¬½Ó¡°¼àÌý¡±º¯Êý
¡¡¡¡BOOL CMainFrame::MakeDataListen()
¡¡¡¡£û
¡¡¡¡¡­¡­
¡¡¡¡m_dataconn=new Listensocket();
¡¡¡¡/* ½¨Á¢Ò»¸öSOCKET£¬²¢Óë±¾µØÖ÷»úµØÖ·À¦°ó¡£×÷Ϊһ¸öÀý×Ó£¬Ö±½Ó²åÈëÁ˱¾»úµÄIPµØÖ·¡°90.0.0.8¡±£¬¶øÔÚʵ¼ÊÓ¦ÓÃÖÐÓ¦Ê×ÏÈͨ¹ýÏàÓ¦µÄº¯Êýµ÷ÓÃÈ¡µÃ±¾µØÖ÷»úµØÖ·¡£
¡¡¡¡×¢Ò⣺Èç¹û²»²ÉÓÃVC++µÄCSocketÀà¶øÓÃÆäËüµÄ·½·¨£¬ÐèÔÚ½¨Á¢SOCKETÖ®ºó£¬µ÷ÓÃbind()º¯ÊýÀ´½øÐÐÓë±¾µØÖ÷»úµØÖ·µÄÀ¦°ó¡£*/
¡¡¡¡if(!m_dataconn->Create(0,SOCK_STREAM,¡°90.0.0.8¡±))
¡¡¡¡£û
¡¡¡¡delete m_dataconn;
¡¡¡¡¡¡¡¡¡¡ m_dataconn=NULL;MessageBox(¡°Socket()½¨Á¢Ê§°Ü!¡±£¬¡°Ìáʾ¡±£¬MB_ICONWARNING)£»
¡¡¡¡return FALSE£»
¡¡¡¡£ý
¡¡¡¡//ÉêÇëÍøÂçʼþ֪ͨ
¡¡¡¡if(!m_dataconn->AsyncSelect(FD_ACCEPT))
¡¡¡¡£û
¡¡¡¡delete m_dataconn;
¡¡¡¡¡¡¡¡¡¡ m_dataconn=NULL;
¡¡¡¡MessageBox(¡°AsyncSelect()´íÎó!¡±£¬¡°Ìáʾ¡±£¬MB_ICONWARNING)£»
¡¡¡¡return FALSE£»
¡¡¡¡£ý
¡¡¡¡¡­¡­
¡¡¡¡if(!m_dataconn->Listen(5))
¡¡¡¡£û
¡¡¡¡MessageBox(¡°listen()´íÎó!¡±£¬¡°Ìáʾ¡±£¬MB_ICONWARNING)£»
¡¡¡¡return FALSE£»
¡¡¡¡£ý
¡¡¡¡¡­¡­
¡¡¡¡£ý
¡¡¡¡//½ÓÊÜÊý¾ÝÁ¬½ÓÇëÇóµÄº¯Êý
¡¡¡¡BOOL CMainFrame::AcceptDataConn()
¡¡¡¡£û
¡¡¡¡int num,nRet£»
¡¡¡¡SOCKADDR_IN RemoteDataAddr£»
¡¡¡¡num=sizeof(SOCKADDR_IN)£»
¡¡¡¡if(m_recvconn==NULL)
¡¡¡¡£û
¡¡¡¡m_recvconn=new Datasocket();
¡¡¡¡£ý
¡¡¡¡if(!m_dataconn->Accept(*m_recvconn,(LPSOCKADDR)&RemoteDataAddr,(int FAR*)&num))
¡¡¡¡£û
¡¡¡¡MessageBox(¡°accept()´íÎó!¡±£¬¡°Ìáʾ¡±£¬MB_ICONWARWING);
¡¡¡¡return FALSE£»
¡¡¡¡£ý
¡¡¡¡¡­¡­
¡¡¡¡m_dataconn->Close();
¡¡¡¡//ÉêÇëÍøÂçʼþ֪ͨ
¡¡¡¡if(!m_recvconn->AsyncSelect(FD_READ£üFD_WRITE£üFD_CLOSE)
¡¡¡¡£û
¡¡¡¡MessageBox(¡°Asyncselect()´íÎó!¡±£¬¡°Ìáʾ¡±£¬MB_ICONWARNING);
¡¡¡¡return FALSE;
¡¡¡¡£ý
¡¡¡¡return TRUE£»
¡¡¡¡£ý
¡¡¡¡//Êý¾Ý½ÓÊܺ¯Êý£¬½ÓÊÜÀ´×ÔÔ¶¶Ë·þÎñÆ÷µÄÊý¾Ý
¡¡¡¡int CMainFrame::RecvData()
¡¡¡¡£û
¡¡¡¡¡­¡­
¡¡¡¡int nRet=m_recvconn->Receive(¡­)£»
¡¡¡¡if (nRet>0)
¡¡¡¡£û
¡¡¡¡¡­
¡¡¡¡£ý
¡¡¡¡else
¡¡¡¡£û
¡¡¡¡¡­
¡¡¡¡£ý
¡¡¡¡¡­¡­
¡¡¡¡£ý
¡¡¡¡2.ctrlsocket.cpp
¡¡¡¡¡­¡­
¡¡¡¡void ctrlsocket::OnReceive(int nErrorCode)
¡¡¡¡£û
¡¡¡¡//´¦ÀíÍøÂçʼþFD_READ
¡¡¡¡CSocket::OnReceive(nErrorCode);
¡¡¡¡((CmainFrame *)(AfxGetApp() >m_pMainWnd)) >Processftp();
¡¡¡¡£ý
¡¡¡¡3.Listensocket.cpp
¡¡¡¡¡­¡­
¡¡¡¡void Listensocket::OnAccept(int nErrorCode)
¡¡¡¡£û
¡¡¡¡//´¦ÀíÍøÂçʼþFD_ACCEPT
¡¡¡¡CSocket::OnAccept(nErrorCode);
¡¡¡¡((CmainFrame*)AfxGetApp() >m_pMainWnd)) >AcceptDataConn();
¡¡¡¡£ý
¡¡¡¡4.Datasocket.cpp
¡¡¡¡¡­¡­
¡¡¡¡Datasocket::OnReceive(int nErrorCode)
¡¡¡¡£û
¡¡¡¡//´¦ÀíÍøÂçʼþFD_READ
¡¡¡¡CAsyncSocket::OnReceive(nErrorCode);
¡¡¡¡((CMainFrame*)(AfxGetApp() >m_pMainWnd)) >RecvData();
¡¡¡¡£ý
¡¡¡¡void Datasocket::OnSend(int nErrorCode)
¡¡¡¡£û
¡¡¡¡//´¦ÀíÍøÂçʼþFD_WRITE
¡¡¡¡CAsyncSocket::OnSend(nErrorCode);
¡¡¡¡((CMainFrame*)(AfxGetApp() >m_pMainWnd)) >SendData();
¡¡¡¡£ý

¡¡¡¡³ÌÐòÖ´ÐÐʱ×óÏ´°¿ÚΪ±¾µØÏµÍ³£¬ÓÒÏ´°¿ÚΪԶ¶Ëϵͳ¡£Í¨¹ý¼¤»îÏà¹ØµÄ²Ëµ¥Ï¾Í¿ÉÒÔ¶ÔÔ¶¶ËÖ÷»úµÄÎļþϵͳ½øÐÐÏÂÔØ²Ù×÷¡£µ±È»£¬Èç¹ûFtp·þÎñÆ÷ÔÊÐíÉÏÔØ£¬ÄãÒ²¿ÉÒÔ½«×Ô¼ºµÄÎļþ´«Ë͵½Ô¶¶ËÖ÷»ú¡£ÓÉÓÚÔ´³ÌÐò½Ï³¤£¬ÓÐÐËȤµÄÅóÓÑ¿ÉÒÔÀ´ÐÅË÷È¡¡£

Ô¶Íû×ÊѶ°æÈ¨ËùÓР

Windows NT ÏÂService µÄ ±à ³Ì 
½­ ËÕ Ê¡ µç ÐÅ ´« Êä ¾Ö 
ÖÜ Ïþ 
Windows NT Server Ìá ¹© ¶à ÖÖ ¹¦ ÄÜ Ç¿ ´ó µÄ ·þ Îñ£¨Service£©, Àý ÈçFTP,WWW »ò Ô¶ ³Ì µÇ ¼ ·þ Îñ£¬ Áí Íâ ³£ Óà µÄ Êý ¾Ý ¿â ·þ Îñ Æ÷ Ò² ÊÇ ÒÔService µÄ ÐΠʽ ´æ ÔÚ ÓÚNT Server ÉÏ µÄ£¬ ÈçSybase SQL Server For NT¡£Service Ò» °ã ÔÚNT Æô ¶¯ ʱ ×Ô ¶¯ Æô ¶¯£¬ ÔÚNT ¹Ø »ú ʱ Í£ Ö¹¡£ µ« ÊÇ ÓРʱ Óà »§ ¿É ÄÜ Ïë ÊÖ ¹¤ Æô ¶¯©p ÔÝ Í£©p Í£ Ö¹ ij ÏîService£¬ Õâ ¾Í Ðè Òª ÔÚ ¿Ø ÖÆ Ãæ °å ÖÐ ½ø ÐÐ Åä Ö㬠¶Ô ÓÚ ²» Ì« Êì ϤNT µÄ Óà »§ À´ ˵ ±È ½Ï À§ ÄÑ£» ¶Ô ÓÚ Èí ¼þ ¿ª ·¢ ÈË Ô±£¬ ÓРʱ Ðè Òª ÔÚ Èí ¼þ ÖÐ ·Ã ÎÊ ºÍ ²Ù ×÷ ij ÏîService£¬ Éõ ÖÁ ¿É ÄÜ Ðè Òª ¿ª ·¢ ÐÂService µÄ Ìá ¹© ¸ø Óà »§ ʹ ÓᣠÉÏ Ãæ Á½ ÖÖ Çé ¿ö ¶¼ ¿É ÒÔ Í¨ ¹ý ¶ÔService µÄ ±à ³Ì À´ ½â ¾ö¡£ ¶ÔService µÄ ±à ³Ì Éæ ¼° µ½NT µÄ ÄÚ ºË£¬ ±È ½Ï ¸´ ÔÓ ÇÒ Ïà ¹Ø ×Ê ÁÏ ½Ï ÉÙ£¬ ¸ø Èí ¼þ ¿ª ·¢ ÈË Ô± ´ø À´ ºÜ ¶à À§ ÄÑ£¬ ±Ê Õß Í¨ ¹ý ¶ÔWindows NT µÄAPI µÄ ·Ö Îö ÕÒ µ½ ÁË Ïà Ó¦ µÄ ±à ³Ì ·½ ·¨£¬ ÔÙ ´Ë ½é ÉÜ ¸ø ´ó ¼Ò¡£

ÔÚWindows NT Ï£¬ ¸÷ ÖÖService ¶¼ ´æ ÔÚservice control manager database ÖУ¬ Òò ´Ë ÎÒ ÃÇ ¿É ÒÔ Í¨ ¹ý ¶Ôservice control manager database ½ø ÐÐ ²Ù ×÷ À´ ʵ ÏÖ ¶ÔService µÄ ±à ³Ì¡£ ÏÂ Ãæ ½é ÉÜ ³£ Óà µÄ º¯ Êý£º

¡¡ 1£ºSC_HANDLE¡¡OpenSCManager
¡¡¡¡¡¡(LPCTSTR¡¡lpszMachineName£¬
¡¡¡¡¡¡LPCTSTR¡¡ lpszDatabaseName£¬
¡¡¡¡¡¡DWORD¡¡¡¡fdwDesiredAccess)£»

OpenSCManager º¯ Êý ´ò ¿ª Ö¸ ¶¨ ¼Æ Ëã »ú ÉÏ µÄservice control manager database ¡£ Æä ÖÐ ²Î ÊýlpszMachineName Ö¸ ¶¨ ¼Æ Ëã »ú Ãû£¬ Èô Ϊ ¿Õ Ôò Ö¸ ¶¨ Ϊ ±¾ »ú¡£ ²Î ÊýlpszDatabaseName Ö¸ ¶¨ Òª ´ò ¿ª µÄservice control manager database, Ĭ ÈÏ Îª ¿Õ¡£
²Î ÊýfdwDesiredAccess Ö¸ ¶¨ ²Ù ×÷ µÄ Ȩ ÏÞ, ¿É ÒÔ Îª ÏÂ Ãæ È¡ Öµ Ö® Ò»

¡¡¡¡¡¡¡¡SC_MANAGER_ALL_ACCESS ¡¡¡¡¡¡//ËùÓÐȨÏÞ
¡¡¡¡¡¡¡¡SC_MANAGER_CONNECT ¡¡¡¡
¡¡¡¡¡¡ //ÔÊÐíÁ¬½Óservice control manager
¡¡¡¡¡¡¡¡SC_MANAGER_CREATE_SERVICE¡¡
¡¡¡¡¡¡ //ÔÊÐí´´½¨·þÎñ¶ÔÏó²¢°ÑËü¼ÓÈë
¡¡¡¡¡¡ service control manager database 
¡¡¡¡¡¡¡¡SC_MANAGER_ENUMERATE_SERVICE
¡¡¡¡ //ÔÊÐíö¾Ùservice control manager databaseÖеķþÎñ
¡¡¡¡¡¡¡¡SC_MANAGER_LOCK ¡¡¡¡
¡¡¡¡¡¡//ÔÊÐíËø×¡service control manager database
¡¡¡¡¡¡¡¡SC_MANAGER_QUERY_LOCK_STATUS 
¡¡¡¡ //ÔÊÐí»ñÈ¡service control manager databaseµÄ·âËøÐÅÏ¢

º¯ Êý ·µ »Ø Öµ£º º¯ Êý Ö´ ÐÐ ³É ¹¦ Ôò ·µ »Ø Ò» ¸ö Ö¸ Ïòservice control manager database µÄ ¾ä ±ú£¬ ʧ °Ü Ôò ·µ »ØNULL¡£
¡¡ 2£ºSC_HANDLE OpenService
¡¡¡¡¡¡(SC_HANDLE¡¡schSCManager£¬
¡¡¡¡¡¡LPCTSTR¡¡¡¡ lpszServiceName£¬
¡¡¡¡¡¡DWORD¡¡¡¡¡¡fdwDesiredAccess)£»

OpenService º¯ Êý ´ò ¿ª Ö¸ ¶¨ µÄService¡£
Æä ÖÐ ²Î ÊýschSCManager ÊÇ Ö¸ Ïòservice control manager database µÄ ¾ä ±ú£¬ ÓÉOpenSCManager º¯ Êý ·µ »Ø¡£

²Î ÊýlpszServiceName Òª ´ò ¿ª µÄ ·þ Îñ µÄ Ãû ×Ö£¬ ×¢ Òâ ´ó С д¡£

²Î ÊýfdwDesiredAccess Ö¸ ¶¨ ²Ù ×÷ µÄ Ȩ ÏÞ, ¿É ÒÔ Îª ÏÂ Ãæ È¡ Öµ Ö® Ò»

SERVICE_ALL_ACCESS ¡¡¡¡¡¡¡¡
¡¡¡¡ //ËùÓÐȨÏÞ
¡¡¡¡ SERVICE_CHANGE_CONFIG ¡¡¡¡
¡¡¡¡ //ÔÊÐí¸ü¸Ä·þÎñµÄÅäÖÃ
¡¡¡¡ SERVICE_ENUMERATE_DEPENDENTS 
¡¡¡¡ //ÔÊÐí»ñÈ¡ÒÀÀµÓڸ÷þÎñµÄÆäËû·þÎñ
¡¡¡¡ SERVICE_INTERROGATE 
¡¡¡¡ //ÔÊÐíÁ¢¼´»ñÈ¡·þÎñ״̬
¡¡¡¡ SERVICE_PAUSE_CONTINUE 
¡¡¡¡ //ÔÊÐíÔÝÍ£ºÍ»½ÐÑ·þÎñ
¡¡¡¡ SERVICE_QUERY_CONFIG
¡¡//ÔÊÐí»ñÈ¡·þÎñÅäÖÃ
¡¡¡¡ SERVICE_QUERY_STATU¡¡
¡¡¡¡ //ÔÊÐíͨ¹ý·ÃÎÊservice control manager»ñÈ¡·þÎñ״̬
¡¡¡¡ SERVICE_START 
¡¡¡¡//ÔÊÐíÆô¶¯·þÎñ
¡¡¡¡ SERVICE_STOP ¡¡
¡¡¡¡//ÔÊÐíÍ£Ö¹·þÎñ
¡¡¡¡ SERVICE_USER_DEFINE_CONTROL
//ÔÊÐíÓû§Ö¸¶¨ÌØÊâµÄ·þÎñ¿ØÖÆÂë

º¯ Êý ·µ »Ø Öµ£º º¯ Êý Ö´ ÐÐ ³É ¹¦ Ôò ·µ »Ø Ö¸ Ïò ij Ïî ·þ Îñ µÄ ¾ä ±ú£¬ ʧ °Ü Ôò ·µ »ØNULL¡£
3£ºBOOL QueryServiceStatus
¡¡¡¡¡¡(SC_HANDLE¡¡¡¡¡¡¡¡ schService£¬
¡¡¡¡¡¡¡¡¡¡LPSERVICE_STATUS¡¡lpssServiceStatus)£»

QueryServiceStatusº¯Êý·µ»ØÖ¸¶¨·þÎñµÄµ±Ç°×´Ì¬¡£
ÆäÖвÎÊýschServiceÊÇÖ¸ÏòijÏî·þÎñµÄ¾ä±ú£¬ÓÉOpenServiceº¯Êý·µ»Ø£¬ÇÒ±ØÐëSERVICE_QUERY_STATUSµÄȨÏÞ¡£

²ÎÊýlpssServiceStatusÖдæ·Å·µ»ØµÄ·þÎñ״̬ÐÅÏ¢£¬½á¹¹ÈçÏ 

typedef struct _SERVICE_STATUS {¡¡
DWORD dwServiceType£»
¡¡¡¡¡¡¡¡¡¡¡¡¡¡//·þÎñÀàÐÍ
DWORD dwCurrentState£»
¡¡¡¡¡¡¡¡¡¡¡¡¡¡//µ±Ç°×´Ì¬
DWORD dwControlsAccepted£»
¡¡¡¡¡¡¡¡¡¡//·þÎñ¿É½ÓÊܵĿØÖÆÂë
DWORD dwWin32ExitCode£»
¡¡¡¡¡¡¡¡¡¡//Win32³ö´í´úÂë
DWORD dwServiceSpecificExitCode£»
¡¡¡¡//·þÎñ³ö´í´úÂë
DWORD dwCheckPoint£»
¡¡¡¡ //ÓÃÓÚ¸ú×Ù·þÎñ³¤Ê±¼ä²Ù×÷
DWORD dwWaitHint£»
¡¡¡¡ //·þÎñijһ²Ù×÷µÄ×î´óÔÊÐíʱ¼ä,ÒÔºÁÃëΪµ¥Î»
} SERVICE_STATUS, *LPSERVICE_STATUS;

º¯ Êý ·µ »Ø Öµ£º º¯ Êý Ö´ ÐÐ ³É ¹¦ Ôò ·µ »ØTrue, ʧ °Ü Ôò ·µ »ØFalse¡£
¡¡¡¡4£ºBOOL StartService(SC_HANDLE¡¡ schService£¬
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ DWORD¡¡¡¡¡¡ dwNumServiceArgs£¬
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ LPCTSTR¡¡¡¡¡¡*lpszServiceArgs)£»

StartService º¯ Êý Æô ¶¯ Ö¸ ¶¨ µÄ ·þ Îñ¡£
Æä ÖÐ ²Î ÊýschService ÊÇ Ö¸ Ïò ij Ïî ·þ Îñ µÄ ¾ä ±ú£¬ ÓÉOpenService º¯ Êý ·µ »Ø£¬ ÇÒ ±Ø Ðë ÓÐSERVICE_START µÄ Ȩ ÏÞ¡£

dwNumServiceArgs Ϊ Æô ¶¯ ·þ Îñ Ëù Ðè µÄ ²Î Êý µÄ ¸ö Êý¡£

lpszServiceArgs Ϊ Æô ¶¯ ·þ Îñ Ëù Ðè µÄ ²Î Êý¡£ º¯ Êý ·µ »Ø Öµ£º º¯ Êý Ö´ ÐÐ ³É ¹¦ Ôò ·µ »ØTrue, ʧ °Ü Ôò ·µ »ØFalse¡£

¡¡¡¡5£ºBOOL ControlService(
¡¡¡¡¡¡¡¡SC_HANDLE¡¡¡¡¡¡¡¡ hService£¬
¡¡¡¡¡¡¡¡DWORD¡¡¡¡¡¡¡¡¡¡¡¡ dwControl£¬
¡¡¡¡¡¡¡¡LPSERVICE_STATUS¡¡lpServiceStatus)£»

ControlService º¯ Êý ÏòWin32 service ·¢ ËÍ ¿Ø ÖÆ Âë¡£
Æä ÖÐ ²Î ÊýhService ÊÇ Ö¸ Ïò ij Ïî ·þ Îñ µÄ ¾ä ±ú£¬ ÓÉOpenService º¯ Êý ·µ »Ø¡£

²Î ÊýdwControl Ϊ ¿Ø ÖÆ Â룬 ³£ Óà µÄ ÓР

SERVICE_CONTROL_STOP 
¡¡¡¡¡¡¡¡¡¡¡¡ //Í£Ö¹·þÎñ
SERVICE_CONTROL_PAUSE
¡¡¡¡¡¡¡¡¡¡//ÔÝÍ£·þÎñ
SERVICE_CONTROL_CONTINUE
¡¡¡¡¡¡¡¡//»½ÐÑÔÝÍ£µÄ·þÎñ 
SERVICE_CONTROL_INTERROGATE
¡¡ //Ë¢ÐÂij·þÎñµÄ״̬

²Î ÊýlpServiceStatus Ö¸ ÏòSERVICE_STATUS ½á ¹¹£¬ Óà ÓÚ ´æ ·Å ¸Ã ·þ Îñ ×î РµÄ ×´ ̬ ЊϢ¡£

º¯ Êý ·µ »Ø Öµ£º º¯ Êý Ö´ ÐÐ ³É ¹¦ Ôò ·µ »ØTrue, ʧ °Ü Ôò ·µ »ØFalse¡£

6£ºBOOL EnumServicesStatus
¡¡¡¡¡¡¡¡¡¡(SC_HANDLE¡¡hSCManager£¬
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ DWORD¡¡¡¡¡¡dwServiceType£¬
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ DWORD¡¡¡¡¡¡dwServiceState£¬
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ LPENUM_SERVICE_STATUS¡¡lpServices£¬
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ DWORD¡¡¡¡¡¡cbBufSize£¬
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ LPDWORD¡¡¡¡pcbBytesNeeded£¬
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ LPDWORD¡¡¡¡lpServicesReturned£¬
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ LPDWORD¡¡¡¡lpResumeHandle)£»

EnumServicesStatus º¯ Êý Óà ÓÚ Ã¶ ¾ÙNT Ï ´æ ÔÚ µÄService¡£
Æä ÖÐ ²Î ÊýhSCManager ÊÇ Ö¸ Ïòservice control manager database µÄ ¾ä ±ú£¬ ÓÉOpenSCManager º¯ Êý ·µ »Ø£¬ ÇÒ ±Ø Ðë ÓÐSC_MANAGER_ENUMERATE_SERVICE µÄ Ȩ ÏÞ¡£

²Î ÊýdwServiceType Ö¸ ¶¨ °´ ·þ Îñ µÄ Àà ÐÍ Ã¶ ¾Ù¡£

²Î ÊýdwServiceState Ö¸ ¶¨ °´ ·þ Îñ µÄ ×´ ̬ ö ¾Ù¡£

²Î ÊýlpServices Ö¸ ÏòENUM_SERVICE_STATUS ½á ¹¹£¬ Óà ÓÚ ´æ ·Å ·µ »Ø µÄ ·þ Îñ µÄ Ãû ×Ö ºÍ ×´ ̬ ЊϢ¡£

²Î ÊýcbBufSize ·µ »Ø ²Î ÊýlpServices µÄ ³¤ ¶È£¬ ÒÔ ×Ö ½Ú Ϊ µ¥ λ¡£

²Î ÊýpcbBytesNeeded ·µ »Ø »ñ È¡ Ê£ Óà µÄService Ëù Ðè ×Ö ½Ú µÄ ¸ö Êý¡£

²Î ÊýlpServicesReturned ·µ »Ø ·þ Îñ µÄ ¸ö Êý¡£

²Î ÊýlpResumeHandle£¬ µ± µÚ Ò» ´Î µ÷ Óà ʱ ¸Ã ²Î Êý Ϊ0£¬ µ± ¸Ã º¯ Êý ÔÙ ´Î ±» µ÷ Óà ÒÔ »ñ È¡ Áí Íâ µÄ ÐŠϢ ʱ£¬ ¸Ã ²Î Êý ±í ʾ Ï һ ¸ö ±» ¶Á µÄService¡£

º¯ Êý ·µ »Ø Öµ£º º¯ Êý Ö´ ÐÐ ³É ¹¦ Ôò ·µ »ØTrue, ʧ °Ü Ôò ·µ »ØFalse¡£

Öµ µÃ ×¢ Òâ µÄ ÊÇ Í¨ ³£ Çé ¿ö Ï ¸Ã º¯ Êý ·µ »Ø µÄ ½á ¹û ΪFALSE£¬ ÎÒ ÃÇ ¿É ÒÔ µ÷ ÓÃGetLastError() À´ »ñ È¡ ½ø Ò» ²½ ЊϢ¡£ Òò Ϊ Ò» ̨ »ú Æ÷ ÉÏ ÓÐ ¶à ÖÖ ·þ Îñ ´æ ÔÚ£¬ Ëù ÒÔGetLastError() Ó¦ ΪERROR_MORE_DATA£¬ ´Ë ʱ Ó¦ ÔÙ ´Î µ÷ ÓÃEnumServicesStatus º¯ Êý ÒÔ »ñ È¡ Õý È· µÄService ÁÐ ±í¡£

ÏÂ Ãæ ÓÐ Ò» ¸ö ÓÃDelphi ±à µÄ Ò» ¸ö ³Ì Ðò Àý ×Ó, Óà Æä Ëû ¿ª ·¢ ¹¤ ¾ß ÈçVC£¬VB Ò² ¿É ʵ ÏÖ¡£ ³Ì Ðò ÔË ÐРʱ, µ¥ »÷ °´ Å¥Button1 ö ¾ÙNT ÖÐ µÄService ²¢ ÏÔ Ê¾ ÔÚ ÁÐ ±í ¿òListBox1 ÖС£ ÔÚListBox1 Ñ¡ ÖРij ¸öService£¬ µ¥ »÷ °´ Å¥Button2 Ôò Æô ¶¯ ¸ÃService£¬ µ¥ »÷ °´ Å¥Button3 Ôò Í£ Ö¹ ¸ÃService¡£

unit Unit1;

interface

uses
¡¡Windows£¬Messages£¬ SysUtils£¬ Classes,
¡¡Graphics£¬Controls£¬Forms£¬
¡¡ Dialogs£¬StdCtrls£¬Winsvc£»

type
¡¡TForm1 = class(TForm)
¡¡¡¡ListBox1: TlistBox£»
¡¡¡¡Button1: Tbutton£»
¡¡¡¡Button2: Tbutton£»
¡¡¡¡Button3: Tbutton£»
¡¡¡¡procedure Button1Click(Sender: TObject)£»
¡¡¡¡procedure Button3Click(Sender: TObject)£»
¡¡¡¡procedure Button2Click(Sender: TObject)£»
procedure FormClose
(Sender: TObject; var Action: TCloseAction)£»

¡¡private
¡¡¡¡{ Private declarations }
¡¡public
¡¡hscmanager,hService:SC_HANDLE;
¡¡returnstatus:TServiceStatus;
¡¡¡¡{ Public declarations }
¡¡end;

var
¡¡Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
BytesNeeded,serviceReturned,resumeHandle:Dword;
returnflag:Bool;
lpservice:Array[0..100] of¡¡TEnumServiceStatus;
service:TEnumServiceStatus;
i,bytes:Dword;
begin
ListBox1.Items.Clear;
returnflag:=false;
resumeHandle:=0;
hscmanager:=OpenSCManager(nil,nil,SC_MANAGER
_ENUMERATE_SERVICE);// ´ò¿ª
service control manager database
if¡¡hscmanager<0 then
¡¡¡¡Begin
showmessage('ÎÞ·¨´ò¿ª
service control manager database');
¡¡¡¡exit;
¡¡¡¡End;
returnflag:=EnumServicesStatus(hscmanager,
SERVICE_DRIVER,SERVICE_ACTIVE,
service,sizeof(service),BytesNeeded,serviceR
eturned,resumeHandle);
//ö¾ÙService
if (returnflag=false) and (GetLastError()
=ERROR_MORE_DATA) then
¡¡¡¡begin
¡¡¡¡bytes:=BytesNeeded+sizeof(TEnumServiceStatus);
EnumServicesStatus(hscmanager,SERVICE_
DRIVER,SERVICE_ACTIVE,
lpservice[0],bytes,BytesNeeded,service
Returned,resumeHandle);
¡¡¡¡for i:=0 to serviceReturned-1 do
¡¡¡¡¡¡¡¡begin
¡¡¡¡¡¡¡¡ListBox1.Items.Add(lpservice[i].lpServiceName);
¡¡¡¡¡¡¡¡end;
¡¡¡¡end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
lpServiceArgVectors:Pchar;
begin
lpServiceArgVectors:=nil;
for i :=0 to (ListBox1.Items.Count-1) do
¡¡ if ListBox1.Selected[i] then
¡¡¡¡ begin
¡¡¡¡ hService:=OpenService(hscmanager,Pchar
(ListBox1.Items[i]),SERVICE_ALL_ACCESS);
//´ò¿ª¸ÃService
¡¡¡¡ if hService<0 then
¡¡¡¡¡¡¡¡begin
¡¡¡¡¡¡¡¡showmessage('ÎÞ·¨´ò¿ª¸ÃService');
¡¡¡¡¡¡¡¡exit;
¡¡¡¡¡¡¡¡end;
¡¡¡¡¡¡¡¡QueryServiceStatus(hService,returnstatus);
//²é¿´¸ÃServiceµÄ״̬
¡¡¡¡ if returnstatus.dwCurrentState=SERVICE_STOPPED
¡¡ then //Èç¹û¸ÃServiceÒÑÍ£Ö¹ÔòÆô¶¯Ëü
¡¡¡¡¡¡¡¡StartService(hService,0,lpServiceArgVectors)£»
¡¡¡¡ CloseServiceHandle(hService);//¹Ø±Õ¸ÃService
¡¡¡¡end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
for i :=0 to (ListBox1.Items.Count-1) do
¡¡ if ListBox1.Selected[i] then
¡¡¡¡ begin
¡¡¡¡ hService:=OpenService(hscmanager,Pchar
(ListBox1.Items[i]),SERVICE_ALL_ACCESS);
//´ò¿ª¸ÃService
¡¡¡¡ if hService<0 then
¡¡¡¡¡¡¡¡begin
¡¡¡¡¡¡¡¡showmessage('ÎÞ·¨´ò¿ª¸ÃService');
¡¡¡¡¡¡¡¡exit;
¡¡¡¡¡¡¡¡end;
¡¡¡¡¡¡¡¡QueryServiceStatus(hService,returnstatus)£»
²é¿´¸ÃServiceµÄ״̬
¡¡¡¡ if returnstatus.dwCurrentState=
SERVICE_RUNNING then
//Èç¹û¸ÃServiceÕýÔÚÔËÐÐÔòÍ£Ö¹Ëü
¡¡¡¡¡¡¡¡ControlService(hService,SERVICE
_CONTROL_STOP,returnstatus)£»
CloseServiceHandle(hService)£»//¹Ø±Õ¸ÃService
¡¡¡¡end;
end;

procedure TForm1.FormClose
(Sender: TObject; var Action: TCloseAction);
begin
CloseServiceHandle(hscmanager)£»
//¹Ø±Õservice control manager database
End£»

end.

MFC ISAPI±à³Ì̽ÌÖ 
ɽ¶«Òƶ¯Í¨ÐŹ«Ë¾
¹ù±ò 
±¾ÎÄͨ¹ý¶ÔCGIºÍISAPIµÄ¶Ô±ÈÒÔ¼°¶ÔISAPIµÄ¹¤×÷Ô­ÀíµÄ·ÖÎö£¬²ûÊöÁËʹÓÃMFC ISAPI±à³ÌµÄÒ»°ã·½·¨¡£

Ò»¡¢ISAPI¼ò½é£º

Ŀǰ´ó¶àÊýÍøÕ¾ÌṩÐÅÏ¢µÄ·½Ê½ÊÇÓÉÓû§Í¨¹ý¿Í»§ä¯ÀÀÆ÷(ÈçNetscape»òExplorerµÈ)ÓëWWW·þÎñÆ÷Á¬½Ó£¬È»ºóÓÃÊó±êµã°´³¬¼¶Á¬½ÓÒÔä¯ÀÀÏà¹ØµÄÖ÷Ò³¡£Ôڴ˹ý³ÌÖУ¬»ù±¾ÉÏÊÇ·þÎñÆ÷Ïò¿Í»§¶Ëµ¥·½ÏòµÄÐÅÏ¢´«µÝ£¬Ëæ×Å·þÎñÐèÇóµÄ²»¶ÏÀ©´ó£¬ÕâÖÖµ¥´¿µÄµ¥·½Ïò´«µÝÐÅÏ¢µÄ¾²Ì¬Ö÷Ò³ÒѲ»ÄÜÂú×ãÐèÇó¡£²»ÂÛÊÇ·þÎñÌṩ·½»¹Êǿͻ§£¬¶¼Ï£ÍûÔÚä¯ÀÀ·þÎñÆ÷½«ÐÅÏ¢·¢Ë͵½Óû§Í¬Ê±£¬Óû§¶ËÒ²Äܽ«ÐÅÏ¢·¢Ë͵½·þÎñÆ÷¶Ë£¬ÊµÏÖ·þÎñÆ÷Óë¿Í»§µÄ½»»¥¡£µäÐ͵ÄÓ¦ÓÃÈ磺Óû§µÇ¼Ç±í¡¢Óû§ÁôÑÔ°åÒÔ¼°Óû§Í¨¹ýWWW¼ìË÷·þÎñÆ÷¶ËµÄÊý¾Ý¿âµÈµÈ¡£

ҪʵÏÖÒ»¸ö¿ÉÓëÓû§½»»¥ÐÅÏ¢µÄ·þÎñϵͳ£¬ËùÐèÔö¼ÓµÄÓÐÁ½Ï½»»¥Ê½Ö÷Ò³ºÍÓû§ÊäÈëÐÅÏ¢´¦Àí³ÌÐò¡£½»»¥Ê½Ö÷Ò³¼´ÓÐÊäÈëÐÅÏ¢µÄ±à¼­¿ò£¬Ñ¡Ôñ²Ëµ¥°´Å¥Ö®ÀàµÄÖ÷Ò³£¬ÒÔ¹©Óû§ÊäÈëÐÅÏ¢£»Óû§ÊäÈëµÄÐÅÏ¢Ôò½»ÓÉÓû§ÐÅÏ¢´¦Àí³ÌÐò´¦Àí¡£ÊµÏָóÌÐò¿ÉÒÔÓжàÖÖ;¾¶£¬¸Ã³ÌÐò¿ÉÒÔ·ÅÔÚ·þÎñÆ÷¶Ë£¬Ò²¿ÉÒÔ·ÅÔÚ¿Í»§»ú¶Ë£¬Ç°ÕßÈçCGI¡¢ISAPI£¬ºóÕßÈçJAVA Applet¡¢JavascriptµÈµÈ¡£

ISAPI£¨¼´Internet Server Application Program Interface£©£¬ÊÇ΢ÈíÌṩµÄÒ»Ì×ÃæÏòInternet ·þÎñµÄAPI½Ó¿Ú£¬ËüÄÜʵÏÖCGI£¨Common Gateway Interface£¬¹«¹²Íø¹Ø½Ó¿Ú£©ÄÜÌṩµÄÈ«²¿¹¦ÄÜ£¬²¢ÔÚ´Ë»ù´¡ÉϽøÐÐÁËÀ©Õ¹£¬ÈçÌṩÁ˹ýÂËÆ÷Ó¦ÓóÌÐò½Ó¿Ú¡£

ÔÚWeb·þÎñÆ÷Õâ¸ö¾ºÕù¼¤ÁÒµÄÁìÓòÀ΢ÈíµÄIIS£¨Internet Information Server£¬InternetÐÅÏ¢·þÎñÆ÷£©Êǵ±½ñWindows NT²Ù×÷ƽ̨ÉÏÖ´ÐÐЧÂÊ×î¸ßµÄWeb·þÎñÆ÷Ö®Ò»¡£IISÌṩËùÓд«Í³µÄÄÚÈÝ´«µÝ·½Ê½£¬Ëü¶Ô¾²Ì¬ÍøÒ³ÓÐ×ÅÁ¼ºÃµÄÖ§³Ö¡£¶ÔÓÚ¸ü¸´ÔÓµÄÓ¦ÓóÌÐò£¬IISÌṩÁ˹¦ÄܸüÇ¿µÄÓ¦Óÿò¼Ü£ºÊ¹ÓÃISAPIÄܹ»´´Ôì³ö¼«¸ßÐÔÄܵÄÓ¦ÓóÌÐò¡£ÊéдÁ¼ºÃµÄISAPIÀ©Õ¹µÄÐÔÄÜ¿ÉÄܳ¬¹ýÀàËÆµÄCGIÒ»¸öÊýÁ¿¼¶¡£´ËÍ⣬ISAPIµÄÁé»îÐÔʹһЩÊÂÇé±äµÃ¼òµ¥¡£

ISAPIÌṩÁËÀ©Õ¹Ö§³ÖWEB·þÎñÆ÷µÄ¼òµ¥¶øÓÐЧµÄ·½·¨¡£¿ª·¢ÈËÔ±¿ÉÒÔÉè¼ÆÉú³ÉISAPI ·þÎñÆ÷À©Õ¹¶¯Ì¬Á¬½Ó¿â£¨ISAPI Server Extension DLL£©£¬Ëü¿ÉÒÔ±»HTTP·þÎñÆ÷µ÷Óá£ÀýÈ磬¿Í»§¶ËÓû§ÌîдÁËÒ»¸ö±íµ¥£¬°´ÏÂ"Ìá½»"°´Å¥ºó£¬ÊäÈëµÄÊý¾Ý½«±»´«ËÍÖÁHTTP·þÎñÆ÷£¬¼¤»îÏàÓ¦µÄISAPIÀ©Õ¹Ó¦ÓóÌÐò£¬¸ÃÓ¦ÓóÌÐò¿ÉÒÔ´¦ÀíÓû§µÄÊäÈëÐÅÏ¢£¬½øÐÐÏàÓ¦µÄ²Ù×÷¡£»òÕߣ¬°´ÕÕÓû§µÄÒªÇó·ÃÎÊÊý¾Ý¿â£¬¶ÁÈ¡Óû§Ö¸¶¨µÄÊý¾Ý£¬¶¯Ì¬Éú³ÉHTMLÎļþ£¬ÔÙ´«»Ø¿Í»§¶Ë¡£

CGIºÜÔç¾Í×÷Ϊ½»»¥Ê½µÄWebÓ¦ÓóÌÐòµÄÒ»¸ö±ê×¼¹ã·ºÓ¦ÓÃÔÚInternetÖ®ÖС£CGI½Å±¾ÔÊÐíÈËÃÇÓöàÖÖ±à³ÌÓïÑÔÈçBasic¡¢C¡¢Perl¡¢Shell µÈµÈÀ´±àд¼òµ¥µÄÓ¦ÓóÌÐò¡£ÕâЩ½Å±¾ÔËÐÐÔÚWeb·þÎñÆ÷ÉÏ£¬¶øÔÚ¿Í»§µÄWebä¯ÀÀÆ÷ÉÏÊä³öÔËÐнá¹û¡£¿Í»§µÄÊäÈëͨ¹ý»·¾³±äÁ¿»òÕß±ê×¼ÊäÈëÉ豸À´½øÐд«µÝ£¬È»ºóCGI³ÌÐò¸ù¾ÝÐèÒªÍê³ÉÌØ¶¨µÄ¹¦ÄÜ£¬²¢Í¨¹ý±ê×¼Êä³öÉ豸ËÍ»ØHTML¸ñʽµÄ½á¹ûÏÔʾÔÚ¿Í»§µÄä¯ÀÀÆ÷ÖС£CGIµÄÕâÒ»ÌØÐÔ¨DÉè¼Æ¼òµ¥£¬ÔÙ¼ÓÉÏËüÖ§³Ö¶àÖÖ±à³ÌÓïÑÔ£¬Ê¹µÃ¿ª·¢CGIÓ¦ÓóÌÐò·Ç³£¼òµ¥¡£¾¡¹ÜÈç´Ë£¬ÈËÃÇÔÚʹÓÃÖл¹ÊÇ·¢ÏÖÁËCGIÓ¦ÓóÌÐòµÄÒ»¸öºÜ´óµÄȱµã£ºÐÔÄܲ»¸ß¡£ ËäÈ»Óв»ÉÙ°ì·¨À´Ê¹CGIÓ¦ÓóÌÐòÔËÐеøü¿ìһЩ£¨Èç°ÑËüÃDZä³É±àÒëºÃµÄ¶þ½øÖÆ´úÂ룬¶ø²»ÓÃPerl½Å±¾£©£¬µ«Ö´ÐÐËÙ¶ÈÈÔÈ»ÊÇÒ»¸öÎÊÌ⡣ÿµ±Í¨¹ýWeb·ÃÎÊÒ»¸öCGI³ÌÐòʱ£¬CGIÖ´ÐÐÎļþ£¨»òÕ߽ű¾µÄ½âÊÍÆ÷£©¶¼ÒªÎªÃ¿Ò»¸öÇëÇó´´½¨Ò»¸öеĽø³Ì¡£¶ÔÓÚÒ»¸öÐÅÏ¢Á¿±È½Ï´óµÄÕ¾µãÀ´Ëµ£¬ÕâÎÞÒɸø·þÎñÆ÷Ôö¼ÓÁËÒ»¸ö³ÁÖØµÄ¸ºµ£¡£

¶þ¡¢ISAPIµÄ¹¤×÷Ô­Àí£º

ISAPIµÄ¹¤×÷Ô­ÀíºÍCGI´óÌåÉÏÊÇÏàͬµÄ£¬¶¼ÊÇͨ¹ý½»»¥Ê½Ö÷ҳȡµÃÓû§ÊäÈëÐÅÏ¢£¬È»ºó½»·þÎñÆ÷ºǫ́´¦Àí¡£µ«ÊǶþÕßÔÚʵÏÖ»úÖÆÉÏ´óÏàÍ¥¾¶¡£ISAPIÓëCGI×î´óµÄÇø±ðÔÚÓÚ£ºÔÚISAPIϽ¨Á¢µÄÓ¦ÓóÌÐòÊÇÒÔ¶¯Ì¬Á¬½Ó¿â£¨Dynamic Link Lib£¬DLL£©µÄÐÎʽ´æÔÚ£»¶øCGIµÄÓ¦ÓóÌÐòÒ»°ã¶¼ÊÇ¿ÉÖ´ÐгÌÐò¡£ISAPIÓ¦ÓõŤ×÷Á÷³ÌÓëCGIÒ²ÓÐһЩ²»Í¬¡£ISAPIÓ¦ÓõÄDLL²»½ö¿ÉÒÔÏóCGI³ÌÐòÒ»Ñù±»Óû§ÇëÇ󼤻»¹¿ÉÒÔ±»ÏµÍ³Ô¤Ïȼ¤»îÀ´¼àÊÓÓû§ÊäÈ룻¶ÔÓÚ±»Óû§¼¤»îµÄDLL£¬ÔÚ´¦ÀíÍêÒ»¸öÓû§ÇëÇóºó²»»áÂíÉÏÏûʧ£¬¶øÊǼÌÐø×¤ÁôÔÚÄÚ´æÖеȴý´¦Àí±ðµÄÓû§ÊäÈ룬ֱµ½¹ýÁËÒ»¶Îʱ¼äºóһֱûÓÐÓû§ÊäÈë¡£

Ò»¸öISAPIµÄDLL£¬¿ÉÒÔÔÚ±»Óû§ÇëÇ󼤻îºó³¤×¤Äڴ棬µÈ´ýÓû§µÄÁíÒ»¸öÇëÇ󣬻¹¿ÉÒÔÔÚÒ»¸öDLLÀïÉèÖöà¸öÓû§ÇëÇó´¦Àíº¯Êý£¬´ËÍ⣬ISAPIµÄDLLÓ¦ÓóÌÐòºÍWWW·þÎñÆ÷´¦ÓÚͬһ¸ö½ø³ÌÖУ¬Ð§ÂÊÒªÏÔÖø¸ßÓÚCGI¡£

²»¹ýISAPIµÄƽ̨¼æÈÝÐԽϲĿǰֻÄÜÓÃÓÚ΢Èí×Ô¼ºµÄWindows 95ºÍNT²Ù×÷ϵͳÉÏ£¬·þÎñÆ÷ƽ̨Ҳ½öÏÞÓÚIIS£¨Internet Information Server)ºÍMS personal web serverÒÔ¼°NT workstationÉϵÄpeer web server¡£

ISAPI DLLsµÄµ÷Ó÷½·¨ºÍCGIÒ»Ñù£ºÔÚ¿Í»§¶ËʹÓÃGET»òPOST·½·¨¡£ÀýÈ磬µ±¿Í»§×÷³öÏÂÁÐÇëÇóʱ£º

http://www.mysite.com/myisa.dll?name=fisherman&id=12345 "name"ÓòºÍ"id"ÓòÒÔ¼°ÓëËüÃÇÏà¹ØµÄÊý¾Ý¶¼±»´«µÝ¸øISA¡£ISAPIÔÚʹÓÃÕâЩÏà¹ØµÄÊý¾Ý֮ǰ°ÑËüÃÇ´æ·ÅÔÚÏàÓ¦µÄÊý¾Ý½á¹¹ÖУ¬ÕâÊÇͨ¹ýÒ»¸öÇëÇóÓ³ÉäϵͳÀ´ÊµÏֵġ£

ÿһ¸öÇëÇó¶¼ÓÐÒ»¸ö½âÎöÓ³Éä±í¡£Í¨¹ý¶¨Òå·þÎñÆ÷´Ó¿Í»§½ÓÊÕµÄÊý¾ÝµÄÀàÐͺÍ˳Ðò£¬¸Ã½âÎöÓ³Éä±í¿ÉÒÔ°ÑÊý¾Ý´«µÝµ½ºÏÊʵÄÊý¾Ý½á¹¹ÖС£ÀýÈ磬¶ÔÓÚÇëÇó"name=fisherman&id=12345"£¬½âÎöÓ³Éä±í½«ÏÔʾһ¸ö×Ö·û´®ºÍÒ»¸öÕûÐÍÊý£¬²¢ÇÒ" fisherman " and "12345"½«±»½âÎö³öÀ´´æ·Åµ½¸÷×ÔµÄÊý¾Ý½á¹¹ÖС£

½âÎöÓ³Éäϵͳ»¹ÓÐÁíÍâÒ»¸ö¹¦ÄÜ£ºISAPI¿ÉÒÔ°ÑÇëÇ󴫵ݸøISAÄÚÌØ¶¨µÄ³ÉÔ±º¯Êý¡£ÇëÇó×Ö·û´®¿ÉÒÔ°üº¬Ò»¸öÃüÁ½âÎöÓ³Éä±í¾ÍʹÓøÃÃüÁî°ÑÇëÇ󴫵ݸøISAÄÚÕýÈ·µÄ³ÉÔ±º¯Êý¡£

Èý¡¢MFCµÄISAPI±à³Ì·½·¨£º

1¡¢Óû§ÊäÈëµÄ·½·¨£º

Web±íµ¥£º

Web±íµ¥£¨Form£©ÌṩÁËÒ»ÖÖÓëÓû§½øÐн»»¥µÄ·½·¨¡£ËüʹÓÃ"´ò°ü"µÄ¼¼Êõ£¬ÒÔÊÕ¼¯Óû§µÄÊäÈ룬´¥·¢ÍøÂç·þÎñÆ÷µÄÐÐΪ£¬»ñÈ¡Óû§µÄÏìÓ¦£¬¹¦ÄÜÀàËÆÓÚWindowsÖеĶԻ°¿ò¡£

±íµ¥Ê¹ÓÃ
ºÍ
±êʶ¶¨ÒåÁËÒ»¸ö×é³É±íµ¥µÄHTMLÍøÒ³µÄÇøÓò¡£µ±Ñ¡ÔñÁË±íµ¥ÖеÄSubmit°´Å¥£¬Á½¸ö±êʶ֮¼äµÄÊý¾ÝÊäÈë¾Í±»×÷Ϊһ×é·¢Ë͵½·þÎñÆ÷¡£µäÐ͵ÄÉè¼ÆÈçÏÂËùʾ£º

< form ACTION="input.dll" METHOD="POST" >
< input TYPE="hidden" NAME="MfcISAPICommand" VALUE="Input" >
.
< input [attribute-list] >
.
< input TYPE="submit" VALUE="OK" >
< input TYPE="reset"¡¡VALUE="Reset" >
< /form >

ÆäÖÐ"ACTION"ÊôÐÔÖ¸¶¨ÁËISAPI DLLÔÚ·þÎñÆ÷ÉϵĴæ·ÅλÖá£"METHOD"ÊôÐÔÖ¸³öÁËÊý¾Ý½«±»´«Ë͵½·þÎñÆ÷µÄ·½Ê½£ºÈç¹ûÊÇ"GET"·½Ê½£¬Êý¾Ý¾Í×÷ΪURLµÄÒ»²¿·Ö±»±àÂë²¢·¢Ë͵½·þÎñÆ÷£»Èç¹ûÊÇ"POST"·½Ê½£¬Êý¾Ý¾Í×÷ΪÏûÏ¢µÄÖ÷Ìå±»·¢ËÍ¡£
< input >±êʶ·ûÓÃÓÚ´ÓÓû§ÊÕ¼¯ÊäÈ룬ÊäÈëÀàÐÍÓÉ"TYPE"ÊôÐÔ¾ö¶¨¡£Óɱêʶ·ûÖ§³ÖµÄÊäÈëÀàÐÍÈçÏ£º

¡§ Îı¾ÊäÈë
¡§ ¿ÚÁîÊäÈë
¡§ µ¥Ñ¡°´Å¥
¡§ ¸´Ñ¡¿ò
¡§ ͼÏóÊäÈë
¡§ Òþ²ØÓò
¡§ Ìá½»°´Å¥
¡§ ÖØÖð´Å¥

ÕâЩÊäÈëµ¥Ôª¶¼ÓÐÒÔϵÄÐÎʽ£º
< input type="text" name="EquipName" value="MSC" >
¡¡
"name"ÊǸøÊäÈëµ¥ÔªÒ»¸ö±êʶ£¬Õâ¸ö±êʶ½«×÷ΪISAPI DLLÖÐÏìÓ¦º¯ÊýµÄ²ÎÊý¡£"type"ÊÇÊäÈëµ¥ÔªµÄÀàÐÍ£¬ÓÃÒÔÇø·ÖÒÔÉϼ¸ÖÖÊäÈëµ¥Ôª¡£"value"ÉèÖÃÊäÈëµ¥ÔªµÄ³õʼֵ¡£
×¢ÒâÉÏÃæµÄHTMLÔ´³ÌÐò£¬ÔÚÀàÐÍΪ"hidden"µÄÊäÈëµ¥ÔªÖУ¬¶¨ÒåÁË·þÎñÆ÷¶ËÏìÓ¦´ËÓû§ÊäÈëµÄº¯ÊýÃû¡£¶øÀàÐÍΪ"submit"ºÍ"reset"µÄÁ½¸öÊäÈëµ¥ÔªÊÇÁ½¸ö°´Å¥£¬µ±Óû§°´ÏÂ"submit"°´Å¥£¬ÏµÍ³¾Í½«ÊäÈëµÄÄÚÈÝ·¢Ë͵½·þÎñÆ÷¶Ë£»µ±Óû§°´ÏÂ"reset"°´Å¥£¬ÏµÍ³¾Í½«Óû§ÊäÈëµÄÄÚÈÝÖØÖÃΪԭÀ´µÄĬÈÏÖµ£¬ÒÔ±ãÖØÐÂÊäÈë¡£

³¬¼¶Á¬½á£º

Óû§Ò²¿ÉÒÔʹÓ󬼶Á¬½áµÄ·½·¨À´¼¤»îÒ»¸öISAPI DLL¡£ÈçÏÂËùʾ£º

< a href="browser.dll?mfcISAPICommand
=Browser" >Browser< /a >

ÕâÀÒþº¬µØ²ÉÓÃÁË"GET"µÄ·½Ê½¡£ÔÚhrefÖÐÖ¸Ã÷ÁËISAPI DLLµÄÄ£¿éÃûºÍ¾ßÌåµÄº¯ÊýÃû¡£µ±Óû§µãÖÐÁËÕâ¸ö³¬¼¶Áª½á£¬ÏµÍ³¾Í»á½«Óû§µÄÇëÇó·¢Ë͵½·þÎñÆ÷¡£
2¡¢MFCÖжÔÓû§Êý¾ÝÊäÈëµÄÏìÓ¦·½·¨£º

´Ó·¢²¼¿ªÊ¼£¬MFC£¨Microsoft Foundamental Classes£¬Î¢Èí»ù´¡Àà¿â£©¾Í±»ÈÏΪÊÇ¿ª·¢WindowsÓ¦ÓóÌÐòµÄ±ê׼ƽ̨¡£Í¨¹ýÌṩ¸üÇåÎú¡¢¸ü¼òµ¥µÄWindows API½Ó¿Ú£¬MFC¿ÉÒÔ°ïÖú¿ª·¢Õ߸ü¿ì¡¢¸ü¼òµ¥µØ±àд³ÌÐò¡£

MFCÖÐÖ§³ÖISAPIµÄÀàÓУº

¡§ CHttpServer
¡§ CHttpServerContext
¡§ CHttpFilter
¡§ CHttpFilterContext
¡§ CHtmlStream

Óû§¿ÉÒÔ·½±ãµØÊ¹ÓÃ"ISAPI Extention Wizard"À´Éú³ÉÒ»¸öISAPI DLLµÄ»ù±¾¿ò¼Ü£¬È»ºóÖ»ÒªÌí¼Ó×Ô¼ºÐèÒªµÄº¯Êý¾Í¿ÉÒÔÁË¡£
HTMLµÄÓû§ÊäÈëºÍÃüÁî´¦ÀíÀý³ÌÊÇͨ¹ýÒ»¸ö½Ð×ö"MFC PARSEMAP"µÄÊý¾Ý½á¹¹À´ÊµÏÖ½âÎöÓ³ÉäµÄ¡£ÔÚÉú³ÉµÄ¿ò¼ÜÖУ¬¿ÉÒÔ¿´µ½ÐÎÈçÒÔϵÄÔ´³ÌÐò£º

BEGIN_PARSE_MAP(Cbrowser
Extension, CHttpServer)
ON_PARSE_COMMAND(Browser,
CBrowserExtension, ITS_EMPTY)
DEFAULT_PARSE_COMMAND(Browser,
CBrowserExtension)

ON_PARSE_COMMAND(Query,
CBrowserExtension, ITS_PSTR)
ON_PARSE_COMMAND_PARAMS("OfficeName")
END_PARSE_MAP(CBrowserExtension)

ËüÃǵĺ¬ÒåÈçÏ£º
BEGIN_PARSE_MAP(Cbrowser
Extension, CHttpServer)ºÍ
END_PARSE_MAP(CBrowserExtension)£º

¶¨ÒåPARSEMAPµÄ¿ªÊ¼ºÍ½áÊø¡£²¢ÇÒÖ¸³ö±¾DLLËùʹÓõÄÀàÃû¼°Æä»ùÀàÃû£¨Ò»°ãÊÇCHttpServer£©¡£
ON_PARSE_COMMAND(funcName,className,paramList)

¶¨ÒåÖ§³Ö·þÎñÆ÷²à½ÓÊÕÓû§ÊäÈëµÄÒ»¸öº¯Êý£¬ÒÔ¼°ËüËù½ÓÊܵIJÎÊý¡£¸Ãº¯ÊýÓëWEB±íµ¥µÄÒþº¬ÊäÈëÓòÖж¨ÒåµÄ"value"ÖµÒªÒ»Ö¡£Óû§Ö»Òª±àд´Ëº¯Êý£¬¾Í¿ÉÒÔʵÏÖ¶ÔÓû§ÊäÈëµÄÏìÓ¦¡£±ØÐëÒª±£Ö¤ÕâÀﶨÒåµÄ²ÎÊýÓëWEB±íµ¥Öж¨ÒåµÄÊäÈëµ¥ÔªÊÇÒ»Ò»¶ÔÓ¦µÄ¡£

ParamListÊÇÒ»¸ö»ò¶à¸ö´úÂ붨ÒåµÄº¯ÊýµÄ²ÎÊýÁÐ±í£¬¿ÉÓõĴúÂëÈçÏ£º

´úÂë ¡¡º¬Òå C++ÖÐÓëÖ®¶ÔÓ¦µÄÊý¾ÝÀàÐÍ
ITS_PSTR¡¡×Ö·û´® LPCSTR»òchar * const
ITS_I2 ¡¡¡¡2×Ö½ÚÕûÊý Int
ITS_I4 ¡¡¡¡4×Ö½ÚÕûÊý long int
ITS_R4 ¡¡ 4×Ö½Ú¸¡µãÊý Float
ITS_R8 ¡¡ 8×Ö½Ú¸¡µãÊý Double
ITS_EMPTY¡¡¿ÕµÄ²ÎÊýÁбí 

ON_PARSE_COMMAND_PARAMS

¸Ãºê¶¨Òå²ÎÊýµÄÃû³Æ£¬×¢ÒâÒªÓëHTMLµÄ±íµ¥Öи÷¸öÊäÈëµ¥ÔªµÄ"name"Öµ±£³ÖÒ»Ö¡£
DEFAULT_PARSE_COMMAND 

ÓÃÓÚÖ¸¶¨Èç¹ûä¯ÀÀÆ÷´«ËÍµÄ±íµ¥»ò³¬¼¶Á¬½áÖÐûÓаüº¬Ò»¸öº¯ÊýÃûʱ£¬±»DLLȱʡµ÷Óõĺ¯ÊýÃû¡£

3¡¢ÏìÓ¦º¯ÊýµÄ½á¹¹£º

ÏìÓ¦º¯ÊýÐÎÈçÒÔϽṹ£º

void CBrowserExtension::Browser
(CHttpServerContext* pCtxt,¡­)
{
StartContent(pCtxt);
*pCtxt << "< p >Hello World !< /p >";
//ÆäËüµÄ´¦Àí¡£
EndContent(pCtxt);
}

ÏìÓ¦º¯Êý×ÜÊÇÒÔStartContent(pCtxt)º¯Êý¿ªÊ¼£¬ÒÔEndContent(pCtxt)º¯Êý½áÊø¡£*pCtxtµÄ×÷ÓÃÊÇÏòÓû§¶Ë´«ËÍÊý¾Ý¡£
·þÎñÆ÷¿ÉÒÔ¶ÔÊäÈë²ÎÊý½øÐÐÏàÓ¦´¦Àí£¬²¢½«´¦Àí½á¹ûÒÔHTMLµÄÐÎʽ·¢ËÍ»ØÓû§¶Ë¡£ËùÒÔÒªÔڴ˺¯ÊýÖУ¬Òª½«ÐèÒªÔÚÓû§¶ËÏÔʾµÄÕû¸öÍøÒ³µÄHTMLÔ´´úÂë·¢Ë͹ýÈ¥¡£ËäÈ»ÂÔÏÔÂé·³£¬µ«Ôö¼ÓÁËÁé»îÐÔ£¬¿ÉÒÔ°´ÕÕÓû§µÄÊäÈëÀ´¶¯Ì¬µØÉú³É¸÷ʽ¸÷ÑùµÄÍøÒ³¡£

ʹÓÃISAPI£¬¿ÉÒÔʹµÃ¾²Ö¹µÄÍøÒ³Á¢¿Ì±äµÃ·á¸»¶à²ÊÆðÀ´

»ØÊ×Ò³