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

📄 bcjq063.txt

📁 c++ builder 的一些txt文档
💻 TXT
📖 第 1 页 / 共 2 页
字号:
      *lpszPathInfo;//请求的字符串的指针 char *lpszPathTranslated;//把请求的字符串指针翻译为服务器的物理路径  
      unsigned cbTotalBytes;//请求中字节的全部数目 unsigned  
      cbAvailable;//lpbData缓冲区长度 void *lpbData;//POST请求的数据缓冲区指针  
      char *lpszContentType;//识别请求的MIME内容类型的指针  
      TGetServerVariableProc GetServerVariable; /*检索服务器变量值的回调函数指  
      针*/ TWriteClientProc WriteClient;//写数据给用户的回调函数的指针  
      TReadClientProc ReadClient;//检索用户数据的回调函数指针  
      TServerSupportFunctionProc ServerSupportFunction; /*支持其他操作的回调函数指针*/  
      } 
      
这种结构包含服务请求和回调函数指针所需得信息,你可以调用它来获取信息或执  
      行操作,下面对其中的回调函数作一说明: 
      
(1)GetServerVariable函数 
      
原型为: 
      
typedef BOOL _stdcall (*TgetServerVarableProc) (int  
      hConn,*VariableName, void *Buff,int &Size); 
      
调用这个函数来获取服务器变量(如CONTEXT_TYPE)和同请求一起收到的头部。如通  
      过请求, 则得到HTTP_COOKIE来检索Cookies头部的内容。参数说明:hConn为传入参数  
      ECB的连接句柄ConnID;VariableName为要检索的变量的名字(如HTTP_COOKIE);Buffer为  
      接收变量的缓冲区指针;Size为缓冲区大小,若由于缓冲区空间不够而失败,该值被改  
      变为必要的缓冲区大小。 
      
(2)WriteClient函数 
      
原型为: 
      
typedef BOOL _stdcall (*TWriteClientProc) (int ConnID,void *Buffer,int  
      & Bytes,int dwReserver) 
      
调用这个函数来发送响应内容给用户, 参数说明:ConnID为传入参数ECB中的连接  
      句柄ConnID; Buffer为包含写数据缓冲区的指针; Bytes为缓冲区数据的字节数;  
      dwReserver保留。 
      
(3)ReadClient函数 
      
原型为: 
      
typedef BOOL _stdcall (*TReadClientProc) (int ConnID, void *Buffer,int  
      & Size) 
      
调用这个函数读取用户的附加数据,通过检验ECB中cbAvailable和cbTotalBytes的  
      值来确定是否调用此函数, 若cbTotalBytes大于cbAvailable;就表明有更多的数据需  
      要调用该函数去读取。 参数说明:ConnID为传入参数ECB中的连接句柄ConnID;Buffer  
      为读入数据存放的缓冲区;Size在调用时,传入Buffer缓冲区的大小,返回时,等于实  
      际读取的字节数。 
      
(4)ServerSupportFunction函数 
      
原型为: 
      
typedef BOOL _stdcall (*TServerSupportFunctionProc) (int hConn, int  
      HSERRequest,void buffer,int &Size,PDWORD DataType); 
      
这个函数实现其他一些操作,参数说明:hConn为传入参数ECB的连接句柄ConnID,  
      HSERRequest为要实现操作的常量值。Size为Buffer缓冲区的大小,Buffer缓冲区指针;  
      DataType为数据类型指针;其中Buffer和DataType的含义根据HSERRequest的值变化。 
      
下面说明这个函数的几个主要操作(也就是HSERRequest的可用值,在Isapi2.hpp中  
      定义),以及对应不同的操作,参数Buffer,Size,DataType的不同含义: 
      
●HSE_REQ_SEND_URL_REDIRECT_RESP:  
      重定向客户浏览器到另一个网址上的URL。 Buffer:指向一重定向目标URL字符串;DataType被忽略。 
      
●HSE_REQ_SEND_URL: 重定向到本服务器上的一个URL,Buffer:  
      指向一重定向目标 URL字符串;DataType被忽略。 
      
●HSE_REQ_SEND_RESPONSE_HEADER:发送响应头部给用户;Buffer:  
      指向包含头部的 字符串;DataType被忽略。 
      
●HSE_REQ_DONE_WITH_SESSION: 通知服务器,  
      异步的请求处理已经完成。 Size, Buffer,DataType均被忽略。 
      
●HSE_REQ_MAP_URL_TO_PATH:  
      映射一个逻辑路径到一个物理路径。Buffer:映射在  
      此缓冲区上完成;DataType被忽略。 
      
HttpExtensionProc()函数的返回值必须使以下四个值(在Isapi2.hpp中定义)中的一个: 
      
●HSE_STATUS_SUCCESS:所有进程已完成。 
      
●HSE_STATUS_SUCCESS_AND_KEEP_CONN:所有进程已经完成,但希望保持连接以继  
      续进一步的交互。 
      
●HSE_STATUS_PENDING: 进程未完成。  
      当扩展异步完成进程时, 将以参数  
      HSERRequest=HSE_REQ_DONE_WITH_SESSION调用ServerSupportFunction(),以提醒服务  
      器进程已完成。 
      
●HSE_STATUS_ERROR:进程由于错误已异常终止。 
      
清单3包含了处理一个"Hello World"网页请求的简单  
      但必要的逻辑。 
      
---------清单3------------------------ 
       
      int _export WINAPI HttpExtensionProc(Isapi2::TEXTENSION_CONTROL_BLOCK  
      &ECB) { char my_string[256]; int length; strcpy(my_string,"200  
      OK/r/nContext-Type:text/html"); length=strlen(my_string);  
      ECB.dwHttpStatusCode=200; ECB.ServerSupportFunction(ECB.ConnID,  
      HSE_REQ_SEND_RESPONSE_HEADER, my_ string,length,NULL);//发送头部  
      strcpy(my_string,"Hello World!"); length=strlen(my_string);  
      ECB.WriteClient(ECB.ConnID,my_string,length,0); //发送数据给客户浏览器  
      return(HSE_STATUS_SUCCESS); } 
      
这是一个简单的例子,实际应用的ISAPI扩展将需要做比这更多的工作。 
      
与GetExtenVersion()函数和TerninateExtension()函数不同,HttpExtensionProc  
      ()函数对用户的行为产生作用。 
      
1.3 TerminateExtension()函数 
      
TerminateExtension() 函数在用户将卸载DLL时被调用,它是可选择的。传入参数  
      为dwFlages,类型为int,是以下两个值(在Isapi2.hpp中定义)中的一个: 
      
●请求同意卸载DLL的HSE_TERM_ADVISORY_UNLOAD值。 函数返回true将允许服务器  
      卸载该DLL。 
      
●强迫DLL清除并准备被卸载的HSE_TERM_MUST_UNLOAD值。  
      TerminateExtension()函数对服务器行为产生作用。 
      
编写完ISAPI扩展应用程序后,用C++ Builder的Project->菜单项功能,为ISAPI扩  
      展生成一个DLL,这个DLL就可以直接被作为ISAPI扩展使用。 
      
2.结束语 
      
本文介绍的是一种在C++ Builder开发环境下较为复杂的ISAPI扩展的实现方法,这  
      种方法对理解ISAPI扩展的工作方式有很大帮助,除此以外,在C++  
      Builder中有更简单 的方法来实现, 即通过使用WebModule,  
      以及TISAPIApplication、 TISAPIRequest、 TISAPIResponse等类。详细方法参见C++  
      Builder文档。 
                                
                              
                            
                                
                        
                              
                                
                              
                  if (ad==1) {document.write(''+'');}              
                  if (ad==2) {document.write(''+'');}              
                  if (ad==3) {document.write(''+'');}              
                                                
                              
                            
                          
                        
                   
                    
                      
                        
                      
                      
                          
                      
                    
                       
                     
                   
                 
               
               
                 
                   
                     
                       
            C++ Builder开发者®            
              2000年06月01日 站长:唐朝            
                      
                    
                  
                
                
                  
                
              
              
            
            
            
            

⌨️ 快捷键说明

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