Este artículo describe principalmente cómo hacer que DELPHI e Internet funcionen juntos. En este artículo se detallarán dos tecnologías especializadas:
WININET: construir programas cliente FTP, HTTP y Gopher. ISAPI: ampliar los servicios de información de Internet, por ejemplo, obtener información en el servidor y mostrarla en el navegador.
En el mundo informático actual, se ha desencadenado una enorme tendencia de desarrollo debido a la estrategia de Internet de Microsoft. aquellos que hacen
Los días de CGI (Common Gateway Interface) y las herramientas de terceros incluso para las herramientas de Internet más básicas finalmente quedaron atrás. Siempre habrá una necesidad de herramientas sofisticadas de terceros, pero ahora los programadores encontrarán la amplia gama de herramientas de Internet que necesitan integradas en el sistema operativo. En resumen, sin mayor inversión, pueden utilizar los recursos gratuitos de DELPHI para:
*Desarrollar navegador WEB
*Ejecute FTP, HTTP y Gopher entre dos aplicaciones DELPHI o una aplicación DELPHI y TCP
(Protocolo de control de transmisión) opera TCP entre servidores
Debido a que DELPHI puede llamar fácilmente a la API de Windows y es compatible con OCX/ActiveX, la nueva estrategia de Microsoft
La estrategia encajaba perfectamente con nuestro plan. Microsoft produce herramientas y los programadores de DELPHI obtienen sus frutos.
¿Qué hay en este artículo?
Este artículo contiene tres partes principales y algunas partes pequeñas, con tres temas principales:
*Encuentre los materiales: la documentación técnica mencionada en este artículo está disponible allí e incluye una breve descripción del hardware y software que necesitará para ejecutar el código de este artículo.
*ISAPI: Cómo utilizar ISAPI
*WININET: Cómo utilizar WININET
En la mayoría de los casos, las secciones ISAPI y WININET de este artículo son completamente independientes y usted es libre de elegir el orden en que las lee.
Encuentre información, requisitos de hardware y software.
Necesitará una copia de Microsoft Windows NT 3.51 Server o NT 4.0 Server, que debe ir acompañada de la documentación de Internet Information Services, porque necesitará comprender las tecnologías mencionadas en ellos. Este documento debe incluirse con NT Server4.0 y los usuarios de NT 3.51 pueden descargarlo del sitio web de Microsoft. Para ejecutar Windows NT, la configuración mínima de su máquina debe ser compatible con 486 y 20 MB o más de memoria.
Debe tener otra computadora con un navegador web instalado. Para que la parte ISAPI de este artículo funcione sin problemas, el segundo
La máquina debe poder ejecutar todo el software compatible con navegadores web. Si su máquina ejecuta Windows 95 o Windows NT
Entonces el código WININET de este artículo funcionará mejor. En este entorno técnico se puede utilizar cualquier navegador web elegible.
En las versiones de Delphi 2.0 y superiores lanzadas después de junio de 1996, existen las herramientas que necesita para conectar Delphi a Internet.
casi todos los recursos.
Si no tiene la última versión de Delphi [Nota: el autor aquí se refiere a la versión 2.0 (traductor)], entonces necesita este artículo
Los archivos especiales mencionados en el archivo, todos los cuales están disponibles casi de forma gratuita en la World Wide Web [Nota: si está utilizando Delphi2.0 o superior, no puede considerar (Traductor)]. Todas las técnicas mencionadas en este artículo pueden funcionar sin problemas en el entorno Delphi 2.0, pero es posible que no funcionen sin problemas en el entorno Delphi de 16 bits.
Si necesita descargar información de la World Wide Web, el enlace es: http://www.borland.com/TechInfo/delphi/i
índice.html
[Nota: ¡Ya no existe! :-(( (Traductor)]
La nueva versión de Delphi2.0 viene con el documento WININET.PAS. Si su copia no lo contiene, entonces el de arriba.
World Wide Web Node puede proporcionárselo. WININET.PAS incluye una lista de variables, funciones, tipos y propiedades diseñadas para ampliar Microsoft Windows Internet. Esto significa que puede agregar fácilmente compatibilidad con FTP, HTTP y Gopher a sus aplicaciones. WININET.DLL de Microsoft se distribuye de forma gratuita. Si no está en su directorio Windows/System o Windows/System32, puede obtenerlo de Microsoft. Aquí está el nodo de la World Wide Web donde está disponible el archivo de ayuda de la ventana WININET.H:
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [Nota: ¡Parece que ya no está disponible! : -( (Traductor)]
En términos generales, el hogar en línea para los desarrolladores de Internet de Microsoft es la parte INTDEV del nodo de Microsoft.
Además de WININET e ICP, otra tecnología clave respaldada por Delphi es ISAP. Como se indica en la documentación corporativa de Microsoft.
Como se describe, esta tecnología le permite "'escribir' scripts del lado del servidor y filtrar scripts, extendiendo así Microsoft Internet Information Services y otros servicios web ISAPI".
Si necesitas encontrar una descripción sobre ISAPI, puedes dirigirte a:
http://www.microsoft.com/intdev/sdk/servapi.htm [Nota: ¡Dios los bendiga! ;-) (Traductor)]
Al final de este artículo, se adjunta una copia del documento clave ISAPI denominado HTTPEXT.PAS.
El Internet Control Pack (ICP) lanzado de forma gratuita por Microsoft es un conjunto de controles OCX/ActiveX que puede utilizar en Delphi.
Arrástrelos y suéltelos en la aplicación (Delphi 2.0 incluye estos controles). Proporcionan soporte inmediato para la creación de aplicaciones Delphi y saben cómo navegar por la web, utilizar FTP, WINSOCK y otras tecnologías de Internet. Si su copia de Delphi no contiene estos controles, debe agregar estos documentos al directorio Lib en el directorio donde se encuentra Delphi antes de usarlos. Los documentos se encuentran en el sitio INDEX.HTML de Borland en el enlace mencionado anteriormente. No he mencionado los controles de ICP en este artículo, pero cualquier persona interesada en esta tecnología definitivamente debe confirmar que los tiene.
Una copia del control.
Puede descargar los archivos de mi aplicación Pascal desde mi sitio, sus nombres son STRBOX.PAS y MATHBOX.PAS.
Sería beneficioso consultar este sitio con frecuencia para obtener actualizaciones de la información mencionada en este artículo.
Aquí asumo que el lector está familiarizado con Delphi y Object Pascal, y que está familiarizado con Internet, HTML,
Tener conocimientos básicos de navegadores y servidores de la World Wide Web.
ISAPI
ISAPI es una tecnología poderosa pero fácil de usar que le permite ampliar las capacidades de los servicios de información de Internet.
Esta tecnología viene con Windows NT 4.0 y le permite crear sitios WEB, FTP y GOPHER en su servidor. Al mismo tiempo, esta tecnología es compatible con WindowsNT3.51 Server [Nota: se refiere a la versión del servidor, la otra versión es la versión de la estación de trabajo (traductor)].
En el pasado, la mejor manera de escalar un servidor web era crear aplicaciones CGI. Son herramientas poderosas, pero también
Limitado por su formato de ejecución [Nota: Por ejemplo, PERL se interpreta y ejecuta (traductor)]. Cuando realiza una solicitud basada en CGI al servidor desde un navegador, lo más probable es que la aplicación CGI sea forzada a ingresar en la memoria primero, lo que consumirá mucho tiempo. Además, en algunas circunstancias, la tecnología CGI parece un poco más difícil de utilizar.
ISAPI es un método para reemplazar aplicaciones CGI escribiendo archivos DLL [Nota: Programa de enlace dinámico (Traductor)]. tu también puedes
Es posible escribir texto filtrado a través de ISAPI, pero no mencionaré esta tecnología en este artículo. En comparación con CGI, ISAPI es más fácil de usar, más rápido y hace un mejor uso de los recursos del sistema. En los siguientes puntos, explicaré en detalle por qué las DLL ISAPI son mejores que las aplicaciones CGI:
Las DLL de ISAPI están ubicadas en la misma dirección que el servicio HTTP, por lo que pueden acceder al servicio HTTP directamente desde el servidor. En comparación con las aplicaciones CGI, pueden cargarse en la memoria más rápido; cuando realizan una solicitud en el servidor, requieren menos tiempo de pausa [Nota: se refiere al tiempo entre realizar una solicitud y recibir una respuesta del servidor (Traductor)] Mucho. Esto es aún más importante cuando el servidor tiene una gran carga.
Puede controlar cuándo se cargan y descargan las DLL. Por ejemplo: puede precargar archivos DLL en la primera solicitud;
Descargue las DLL de la aplicación ISAPI cuando no estén en uso para liberar recursos del sistema.
Como se mencionó anteriormente, puede usar ISAPI para escribir texto filtrado [Nota: generalmente se refiere a scripts en la estructura C/S (traductor)], más
Según la documentación de Microsoft, puede filtrar texto a través de ISAPI para hacer lo siguiente:
Esquema de autorización de usuario
compresión
cifrado
acceso
Análisis de tráfico u otro análisis de solicitudes (por ejemplo, buscar solicitudes en "...etcpassWord")
En este artículo, me centraré en cómo escribir archivos DLL que devuelvan conjuntos de datos o cómo interactuar con los usuarios que ejecutan navegadores.
Haz un contacto sencillo.
Conceptos básicos de ISAPI
El archivo HTTPEXT.PAS contiene declaraciones clave para usar ISAPI. Este documento debe acompañar al
Versión Delphi distribuida. También se puede encontrar en el sitio de Borland, adjunto a la sección ISAPI de este artículo. Debido a que esto se basa en la tecnología NT, debe utilizar Delphi2.0 o superior para aplicar esta tecnología. No puedes usar esto en un editor de 16 bits.
HTTPEXT.PAS contiene la interfaz de la tecnología ISAPI creada por Microsoft [Nota: se refiere a la interfaz Delphi, ISAPI está compilada en C++
escritura (traductor)]. Al escribir Delphi, no se proporciona una interfaz de usuario ISAPI. Solo describiré cómo utilizar la tecnología existente de Microsoft. Sin embargo, ISAPI es demasiado fácil de usar y, para la mayoría de los usuarios, la versión del usuario del objeto Delphi no es necesaria.
Hay tres funciones que se pueden utilizar como entradas a las DLL de ISAPI. Las dos primeras son obligatorias y la tercera es opcional.
GetExtensionVersion: Verifique la versión mínima
HttpExtensionPRoc: este es el punto de entrada de la DLL, al igual que el bloque de inicio...fin en una aplicación Delphi.
TerminateExtension: este es un programa opcional que se puede utilizar como hilo para limpiar otras asignaciones de memoria.
Cuando crea una DLL ISAPI, debe hacer referencia a las dos primeras de las tres funciones enumeradas anteriormente, ejecute esto
Dos funciones son la clave de toda la programación ISAPI.
Las tres declaraciones contienen "salida de palabra", un término utilizado porque las DLL de ISAPI amplían Internet Information Services.
dispositivo. (Recuerde, Internet Information Server se refiere a Microsoft Server. Si desea utilizar un servidor NT como servidor web físico, entonces esta es exactamente la herramienta que necesita. Las DLL ISAPI se distribuyen con NT4.0 y se instalan al instalar el sistema operativo. . se instala automáticamente.)
ISAPI proporciona un estándar que los servidores de producción pueden seguir. Por ejemplo, puede utilizar la compleja interfaz NSAPI de Netscape.
Comprimido al ISAPI hermoso y conciso relevante para operar la interfaz NSAPI.
La siguiente es la declaración de estas dos importantes funciones.
función GetExtensionVersion (var Ver: THSE_VERSION_INFO): BOOL;
función HttpExtensionProc(var BCE: TExtensionControlBlock): DWORD;
Simplemente pegue GetExtensionVersion en sus archivos DLL y listo. Sólo necesita realizar cambios menores cuando ISAPI lance nuevas versiones al público.
función GetExtensionVersion (var Ver: THSE_VERSION_INFO):
BOOL; llamada estándar;
comenzar
Ver.dwExtensionVersion := $00010000; // soporte 1.0
Ver.lpszExtensionDesc := 'Delphi 2.0 ISAPI DLL' // Descripción
Resultado := Verdadero;
fin;
El parámetro pasado a esta función se declara en HTTPEXT.PAS de la siguiente manera:
Los parámetros relevantes se declaran en HTTPEXT.PAS de la siguiente manera:
PHSE_VERSION_INFO = ^THSE_VERSION_INFO;
THSE_VERSION_INFO = registro empaquetado
dwExtensionVersion: DWORD;
lpszExtensionDesc: matriz[0..HseMaxExtDLLNameLen-1] de Char;
fin;
La constante HseMaxExtDllNameLen tiene un valor de 256 en la declaración. Las dos variables del registro son "autodeclaradas". La primera contiene el número de versión de ISAPI [Nota: la variable dwExtensionVersion (Traductor)] y la segunda representa una cadena definida por el usuario que se utiliza para describir las DLL.
Cuando hace referencia a la instrucción GetExtensionVersion, debe agregar información a la sección del archivo DPR de su programa DLL.
fuera parte. Mientras escribe esta declaración, también debe escribir:
exportaciones
Obtener versión de extensión
HttpExtensionProc;
Esto es lo que debe hacer al configurar funciones para estos dos importantes archivos DLL de ISAPI. El siguiente paso, usar HttpExtensionProc, es un poco más complicado, así que lo dejaré en una sección separada.
Trabajar con HttpExtensionProc
La declaración HttpExtensionProc es el punto de entrada de la DLL. Su función es como la declaración main() en lenguaje C, o
La parte de inicio...final en Delfos.
A continuación se muestra un ejemplo sencillo que utiliza la declaración GetExtensionVersion.
función HttpExtensionProc(var BCE: TExtensionControlBlock):
DWORD; llamada estándar;
var
ResStr: cadena;
StrLen: entero;
comenzar
ECB.lpszLogData := 'Registro DLL de Delphi';
BCE.dwHTTPStatusCode := 200;
ResStr := ' +
'
'Hola desde ISAPI
' +
';
ResStr := Formato(
'HTTP/1.0 200 Aceptar'#13#10+
'Tipo de contenido: texto/html'#13#10+
'Longitud del contenido: %d'#13#10+
'Contenido:'#13#10#13#10'%s'
[Longitud(ResStr)
ResStr]);
StrLen := Longitud(ResStr);
BCE.WriteClient(BCE.ConnID
Puntero(ResStr)
StrLen
0);
Resultado := HSE_STATUS_SUCCESS;
fin;
Si realiza una solicitud a esta DLL mientras navega, obtendrá una respuesta como esta:
Resultados del servidor de prueba
Hola desde ISAPI
La mayoría de los campos dentro del cuerpo de la función están estrechamente relacionados con un código HTML simple que proporciona información básica. También debe completar algunos campos en TExtensionControlBlock como se muestra a continuación.
Observe que hay un puntero de función llamado WriteClient en este registro. Puede consultar esta función para pasar información.
Enviar de nuevo al navegador. Al llamar a esta función, utiliza el campo ConnID en el bloque TExtensionControl que se menciona a continuación. Cuando se llama a la función, el ConnID se completa automáticamente.
Antes de mirar el código de la función, permítame demostrarle todas las funciones HttpExtensionProc mencionadas anteriormente.
Programa completo de ISAPI DLL
biblioteca Isapi1;
biblioteca Isapi1;
usos
ventanas
SysUtils
HTTPExt;
función GetExtensionVersion (var Ver: THSE_VERSION_INFO): BOOL;
comenzar
Ver.dwExtensionVersion := $00010000; // Esperamos compatibilidad con la versión 1.0
Ver.lpszExtensionDesc := 'Escrito en Delphi 2.0';
Resultado := Verdadero;
fin;
función HttpExtensionProc (var BCE: TEXTENSION_CONTROL_BLOCK): DWORD;
llamada estándar;
var
ResStr: cadena;
StrLen: entero;
comenzar
ECB.lpszLogData := 'Registro DLL de Delphi';
BCE.dwHTTPStatusCode := 200;
ResStr := '
' +
'
Resultados del servidor de prueba
' +
'
Isapi saluda a DevRel
';
ResStr := Formato(
'HTTP/1.0 200 Aceptar'#13#10+
'Tipo de contenido: texto/html'#13#10+
'Longitud del contenido: %d'#13#10+
'Contenido:'#13#10#13#10'%s'
[Longitud(ResStr)
ResStr]);
StrLen := Longitud(ResStr);
BCE.WriteClient(BCE.ConnID
Puntero(ResStr)
StrLen
0);
Resultado := HSE_STATUS_SUCCESS;
fin;
exportaciones
Obtener versión de extensión
HttpExtensionProc;
comenzar
fin.
Para ejecutar este programa DLL, debe copiarlo al directorio de scripts de su servidor NT. En mi máquina NT4.0
Dice así:
c:winntsystem32inetsrvscriptsmystuffisapi1.dll
En este ejemplo he creado mi directorio llamado "mystuff"
Solo se usa para almacenar lo que creé.
DLL ISAPI. Su directorio, por supuesto, no será exactamente el mismo que en mi máquina, dependiendo de la ubicación de su directorio "inetsrv" y otros factores.
Para llamar exitosamente a esta DLL, debe agregar este hipervínculo a su página HTML:
ISAPI Uno
Cuando el usuario hace clic en este hipervínculo, se llamará a la Dll ISAPI1 y luego se mostrará la cadena "Hola desde ISAPI".
mostrado en el navegador del usuario. Si no coloca ISAPI.DLL en el directorio mystuff, deberá modificar el código HTML anterior para adaptarlo a su situación. Tenga en cuenta que su directorio debe ser relativo al directorio inetsrv y no debe ni puede contener el directorio donde se encuentra toda su DLL.
Aquí está el script HTML completo de la convocatoria:
Esta es la página de inicio de la computadora de mi hogar.
ISAPI Uno
Tenga en cuenta que si copia el programa ISAPI1.DLL al directorio mystuff varias veces, debería
Cierre el puerto World Wide Web del servidor web. Esto se debe a que, la primera vez que copias esta DLL, estás libre de restricciones, pero después de eso, pertenece al servidor. Por lo tanto, cuando copie la versión actualizada de la primera copia, debe desactivar el servicio World Wide Web. Puede utilizar un programa de administración de red para desactivar el servicio World Wide Web. Este programa debe estar en el grupo Microsoft Internet Server e instalarse en Explorer/Administrador de programas al instalar Network Information Services.
Funciona con TExtensionControlBlock
Con este punto de este artículo, podrá crear su primera DLL ISAPI y ejecutarla en línea en una segunda máquina.
El navegador web lo llama.
El resto de ISAPI se profundizará en este artículo.
Aquí está la parte más complicada de los parámetros de HttpExtensionProc.
PExtensionControlBlock = ^TExtensionControlBlock;
TExtensionControlBlock = registro empaquetado
cbSize: DWORD // = tamaño de (TExtensionControlBlock)
dwVersion: DWORD; // información de versión de esta especificación
ConnID: HCONN; // Contexto ¡No modificar!
dwHttpStatusCode: DWORD // Código de estado HTTP
// información de registro terminada en nulo específica de esta DLL de extensión
lpszLogData: matriz [0..HSE_LOG_BUFFER_LEN-1] de Char;
lpszMétodo: PChar; // REQUEST_METHOD
lpszQueryString: PChar; // QUERY_STRING
lpszPathInfo: PCar; // PATH_INFO
lpszPathTraducido: PChar; // PATH_TRANSLADO
cbTotalBytes: DWORD; // Bytes totales del cliente
cbAvailable: DWORD // Número de bytes disponibles
lpbData: puntero; // puntero a cbbytes disponibles
lpszContentType: PChar; // Tipo de contenido de los datos del cliente
GetServerVariable: TGetServerVariableProc;
WriteClient: TWriteClientProc;
ReadClient: TReadClientProc;
Función de soporte del servidor: TServerSupportFunctionProc;
fin;
Observe que este registro contiene el campo ConnID mencionado anteriormente y pasa el primer parámetro a WriteClient.
El primer parámetro de este registro es para el control de versiones. Debe tener el tamaño del TExtensionControlBlock especificado. Si Microsoft cambia su estructura, pueden determinar con qué versión de la estructura están tratando verificando el tamaño del registro. Nunca querrás los primeros tres campos en este registro, ya han sido completados por ISAPI y solo se puede acceder a ellos, no modificarlos, en tu programa.
Probablemente el campo más importante de este registro sea lpszQueryString, que contiene la solicitud del servidor.
información. Por ejemplo, supongamos que ha creado un archivo llamado ISAPI1.Dll. Para llamar a esta DLL, crea un HREF como este [Nota: un formato en lenguaje HTML (traductor)] en una página de su navegador:
Prueba uno
Si desea responder a esta DLL, debe cambiar la línea anterior de esta manera:
Prueba uno
Si el fragmento de código HTML contiene algo como la segunda de las dos líneas anteriores, entonces su DLL tendrá el parámetro lpszQueryString.
Obtenga la cadena de "MyQuery", preste especial atención al uso del indicador de solicitud después de la cadena de solicitud.
Por supuesto, puedes cambiar la cadena de solicitud como quieras. Por ejemplo, puedes escribir:
Prueba uno
En esta solicitud, esta DLL responderá con el nombre del servidor. No está sujeto a ninguna restricción al pasar este parámetro. tú
Puede pasar lo que quiera y depende de usted cómo desea analizar la información en la DLL.
Cuando devuelve información del servidor al navegador, utiliza el puntero de función "WriteClient" en este registro.
. No necesita hacer nada al inicializar este puntero; el servidor de información de la red se lo pasa automáticamente.
Los autores de aplicaciones CGI notarán que la sintaxis para pasar cadenas de solicitud es muy familiar. De hecho, ISAPI siguió al CGI.
Como ocurre con la mayoría de las convenciones, la mayoría de los campos en TExtensionControlBlock pueden simplemente tomarse prestados mediante tecnología CGI.
Otro campo clave en TExtensionControlBlock es lpbData, que contiene información adicional que se carga durante la navegación.
Por ejemplo, si tienes un formulario HTML con varios campos, la información contenida en estos campos se llamará "
Puntero "lpData". El siguiente tema de este artículo, "Obtención de información desde el botón 'Aceptar'", se centrará en cómo manejar esta situación.
Hasta ahora he introducido los cuatro campos clave en TExtensionControlBlock:
WriteClient: un puntero que le permite pasar datos HTML formateados al navegador. Esta función se utiliza
Campo ConnID de TExtensionControlBlock.
lpszQueryString: la solicitud proveniente del navegador.
lpbData: datos adicionales cargados desde el navegador. Generalmente el contenido de cualquier campo en un formulario HTML.
. Hablaré de esto más a fondo en la sección "Botón Confirmar".
Para tener una idea de cómo funcionan los otros campos en TExtensionControlBlock, la mejor manera es
Navega y compáralos. En otras palabras, querrás crear una página HTML que permita al usuario llamar a la DLL ISAPI del cliente. El propósito de esta DLL ISAPI es simplemente formatear cada campo en TExtensionControlBlock en HTML y luego devolverlos al navegador. Esto convierte su navegador en un depurador algo aterrador que muestra todos los campos en TExtensionControlBlock.
Aquí hay un programa, escrito por Danny Thorpe de Borland, que realiza esta tarea:
prueba de biblioteca1;
usos
ventanas
SysUtils
HTTPExt;
función GetExtensionVersion (var Ver: THSE_VERSION_INFO): BOOL;
comenzar
Ver.dwExtensionVersion := $00010000; // soporte 1.0
Ver.lpszExtensionDesc := 'Una DLL de prueba escrita en Delphi 2.0';
Resultado := Verdadero;
fin;
función HttpExtensionProc (var BCE: TEXTENSION_CONTROL_BLOCK):
DWORD; llamada estándar;
var
ResStr: cadena;
StrLen: entero;
Buf: matriz [0..1024] de Char;
comenzar
ECB.lpszLogData := 'Registro DLL de Delphi';
BCE.dwHTTPStatusCode := 200;
ResStr := Formato(
' +
'
'Tamaño = %d
'+
'Versión = %.8x
'+
'ConnID = %.8x
'+
'Método = %s
' +
'Consulta = %s
' +
'Información de ruta = %s
'+
'Ruta traducida = %s
'+
'TotalBytes = %d
'+
'Bytes disponibles = %d
'+
'Tipo de contenido = %s
'+
'
[BCE.cbTamaño
BCE.dwVersión
BCE.ConnID
BCE.lpszMétodo
BCE.lpszQueryString
BCE.lpszPathInfo
BCE.lpszPathTraducido
BCE.cbTotalBytes
BCE.cbDisponible
BCE.lpszContentType]);
con el BCE hacer
comenzar
StrLen := Tamaño de(Buf);
GetServerVariable(ConnID
'REMOTE_ADDR'
@Buf
StrLen);
ResStr := ResStr + 'REMOTE_ADDR = '+Buf+'
';
StrLen := TamañoDe(Buf);
GetServerVariable(ConnID
'REMOTE_HOST'
@Buf
StrLen);
ResStr := ResStr + 'Remote_Host = '+Buf+'
';
StrLen := TamañoDe(Buf);
GetServerVariable(ConnID
'USUARIO_REMOTO'
@Buf
StrLen);
ResStr := ResStr + 'Usuario_Remoto = '+Buf+'
';
StrLen := TamañoDe(Buf);
GetServerVariable(ConnID
'SERVIDOR_NOMBRE'
@Buf
StrLen);
ResStr := ResStr + 'SERVIDOR_NOMBRE = '+Buf+'
';
StrLen := TamañoDe(Buf);
GetServerVariable(ConnID
'SERVIDOR_PORT'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PORT = '+Buf+'
';
StrLen := TamañoDe(Buf);
GetServerVariable(ConnID
'SERVIDOR_PROTOCOL'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PROTOCOL = '+Buf+'
';
StrLen := TamañoDe(Buf);
GetServerVariable(ConnID
'SERVIDOR_SOFTWARE'
@Buf
StrLen);
ResStr := Formato('%sSERVER_SOFTWARE = %s
'+
'ID de hilo = %.8x
'
[ResStr
buf
GetCurrentThreadID]);
fin;
ResStr := ResStr + ';
ResStr := Formato(
'HTTP/1.0 200 Aceptar'#13#10+
'Tipo de contenido: texto/html'#13#10+
'Longitud del contenido: %d'#13#10+
'Contenido:'#13#10#13#10'%s'
[Longitud(ResStr)
ResStr]);
StrLen := Longitud(ResStr);
BCE.WriteClient(BCE.ConnID
Puntero(ResStr)
StrLen
0);
Resultado := HSE_STATUS_SUCCESS;
fin;
exportaciones
Obtener versión de extensión
HttpExtensionProc;
comenzar
fin.
Para llamar a esta DLL, debe crear un script HRML que incluya la siguiente línea
Prueba uno
Obtener información desde el botón "Confirmar"
Por lo general, los formularios HTML que le envían información tienen un botón de confirmación. Siempre que la cantidad de información sea inferior a 49 KB, puede
Considere que el campo lpbData en TExetensionControlBlock esté disponible. Así es como puedes
En la mayoría de los casos se obtiene la información enviada por el puntero a este campo:
var
S: cuerda;
comenzar
…
S := PChar(BCE.lpbData);
…
fin;
Si la información procedente de este campo supera los 48 KB, debe llamar a ReadClient para obtener la información restante.
Si desea saber exactamente qué información está disponible en el campo lpbData, puede utilizar las dos funciones siguientes para devolver los datos a su navegador web:
función SetUpResString: cadena;
comenzar
Resultado := ' +
' +
'
'lpbDatos = %s ' +
';
fin;
función HttpExtensionProc(var BCE: TExtensionControlBlock):
DWORD; llamada estándar;
var
ResStr: cadena;
StrLen: entero;
S
S1: cuerda;
comenzar
ECB.lpszLogData := 'Registro DLL de Delphi';
BCE.dwHTTPStatusCode := 200;
ResStr := ConfigurarResString;
S := PChar(BCE.lpbData);
ResStr := Formato(ResStr
[S]);
StrLen := Longitud(ResStr);
BCE.WriteClient(BCE.ConnID
Puntero(ResStr)
StrLen
0);
Resultado := HSE_STATUS_SUCCESS;
fin;
Suponga que ya tiene un formulario HTML con el siguiente código adjunto:
Este código generará un formulario con un área de texto para que ingrese números y un botón de "enviar" llamado "GetSquare". Si tiene este formulario, puede esperar que los dos programas anteriores devuelvan la siguiente cadena, suponiendo que el usuario ingrese el número 23 en el área de texto del formulario:
lpbData = GetCuadrado=23&GetCuadrado=Enviar
Para comprender lo que está sucediendo en este momento, preste atención a la parte principal de la declaración HTML extraída de la función anterior. Esta parte de la declaración reside en el servidor y se refleja de la siguiente manera:
'lpbDatos = %s ' +
Si estudia el código de la función HttpExtensionProc anterior, encontrará que justo antes de esta oración, utiliza el parámetro %s en la declaración Formato en lugar del valor en ECB.lpbData. (Si no sabe cómo funciona el formato de declaración, consulte la documentación relevante de Delphi) [Nota: en la Enciclopedia de programación Delphi2 del autor (Delphi2
Hay instrucciones detalladas en el Capítulo 3 "Cadenas y archivos de texto" en Unleashed (Traductor)]
Supongamos que en el formulario que se muestra arriba, cuando el usuario presiona el botón "Confirmar", el valor pasado por lpbData a la DLL ISAPI es:
GetCuadrado=23&GetCuadrado=Enviar
Para darle una idea clara, permítame repetir que la información que las dos declaraciones anteriores devuelven al navegador es la siguiente cadena, que ya ha visto:
lpbData = GetCuadrado=23&GetCuadrado=Enviar
La mejor manera de ver este proceso es ejecutar una prueba del programa ISAPI2 que se enumera a continuación. ISAPI2 es similar a ISAPI1, pero incluye la nueva función HttpExtensionProc que se muestra arriba y también incluye la función de utilidad SetUpResString.
biblioteca Isapi2;
usos
ventanas
SysUtils
HTTPExt;
función GetExtensionVersion (var Ver: THSE_VERSION_INFO):
BOOL; llamada estándar;
comenzar
Ver.dwExtensionVersion := $00010000; // soporte 1.0
Ver.lpszExtensionDesc := 'DLL escrita en Delphi 2.0';
Resultado := Verdadero;
fin;
función SetUpResString: cadena;
comenzar
Resultado := ' +
' +
'
'lpbDatos = %s ' +
';
fin;
función HttpExtensionProc (var BCE: TEXTENSION_CONTROL_BLOCK):
DWORD; llamada estándar;
var
ResStr: cadena;
StrLen: entero;
S
S1: cuerda;
Len: Entero;
comenzar
ECB.lpszLogData := 'Registro DLL de Delphi';
BCE.dwHTTPStatusCode := 200;
ResStr := ConfigurarResString;
S := PChar(BCE.lpbData);
ResStr := Formato(ResStr
[S]);
StrLen := Longitud(ResStr);
BCE.WriteClient(BCE.ConnID
Puntero(ResStr)
StrLen
0);
Resultado := HSE_STATUS_SUCCESS;
fin;
exportaciones
Obtener versión de extensión
HttpExtensionProc;
comenzar
fin.
Una vez que haya obtenido la información pasada por la variable lpbData del formulario, puede analizar la información o devolvérsela al usuario. Por ejemplo, podrías extraer el número 23 del ejemplo anterior, elevarlo al cuadrado y devolvérselo al usuario. Hacer esto le permite obtener información del usuario, en este caso números, realizar algunas operaciones matemáticas con los números y finalmente devolver el resultado al usuario. Esto significa que puede crear páginas web interactivas directamente en las ondas, ¡que es el aspecto más popular de la programación de Internet en este momento!
El siguiente es un código de programa completo que envía el cuadrado de un número al navegador a través de la red:
biblioteca Isapi3;
{ Este código muestra cómo recibir información del usuario a través de un navegador
analizar esa información
y luego devolver una respuesta al usuario en particular.
el usuario envía un número
este código lo cuadra
y luego envía el resultado al usuario. Aquí está el formulario del navegador que envía la información para su análisis:
}
usos
ventanas
SysUtils
HTTPExt
StrBox;
función GetExtensionVersion (var Ver: THSE_VERSION_INFO):
BOOL; llamada estándar;
comenzar
Ver.dwExtensionVersion := $00010000 // soporte de la versión 1.0
Ver.lpszExtensionDesc := 'ISAPI3.DLL';
Resultado := Verdadero;
fin;
// Analiza lpbData y recupera el número que nos pasó el usuario.
función ParseData(S: cadena): entero;
comenzar
S := TiraÚltimoToken(S
'&');
S := TiraPrimerToken(S
'=');
Resultado := StrToInt(S);
fin;
función SetUpResString: cadena;
comenzar
Resultado := ' +
' +
'
'Respuesta = %d ' +
';
fin;
función HttpExtensionProc (var BCE: TEXTENSION_CONTROL_BLOCK):
DWORD; llamada estándar;
var
ResStr: cadena;
StrLen: entero;
S
S1: cuerda;
Número: Entero;
comenzar
ECB.lpszLogData := 'Registro DLL de Delphi';
BCE.dwHTTPStatusCode := 200;
ResStr := ConfigurarResString;
S := PChar(BCE.lpbData);
Número := ParseData(S);
Núm := Cuadrado(Núm);
ResStr := Formato(ResStr
[Número]);
StrLen := Longitud(ResStr);
BCE.WriteClient(BCE.ConnID
Puntero(ResStr)
StrLen
0);
Resultado := HSE_STATUS_SUCCESS;
fin;
exportaciones
Obtener versión de extensión
HttpExtensionProc;
comenzar
fin.
Este código acepta la siguiente cadena del usuario que presionó el botón confirmar y solicitó el número al cuadrado:
GetCuadrado=5&GetCuadrado=Enviar
Suponiendo una entrada como esta, este código devolverá la siguiente cadena al usuario a través de Internet:
Respuesta = 25
En una oración, el usuario ingresa el número 5 y usted le devuelve el número 25. Si el usuario envía el número 10, usted devuelve el número 100. Esto puede parecer trivial, pero lo que importa aquí es lo que sucede en Internet [Nota: se refiere a páginas web interactivas (traducidas
OMS)]
Analice la función pasada por el usuario de esta manera:
// Analiza lpbData y recupera el número que nos pasó el usuario.
función ParseData(S: cadena): entero;
comenzar
S := TiraÚltimoToken(S
'&');
S := TiraPrimerToken(S
'=');
Resultado := StrToInt(S);
fin;
Estas dos declaraciones se encuentran en la unidad mencionada al principio de este artículo y también están incluidas en mi sitio. [Nota: este documento se puede encontrar en casi todas partes de Internet.
También puedes solicitarlo al traductor (Traductor)][En este artículo
Simplemente quiero hablar mucho de ISAPI. Esto debería ser suficiente para inspirarte a divertirte aprovechando esta gran tecnología. A continuación quiero hablar sobre las dos declaraciones GetServerVariable y ReadClient. Solo he realizado experimentos extremadamente limitados a este respecto. En este artículo, adjunté el archivo HTTPEXT.PAS porque no lo encontrará en ningún otro lugar que no sea este documento crítico.
Declaraciones GetServerVariable y ReadClient
Al igual que solicitar información en su aplicación CGI, puede utilizar declaraciones para obtener información del servidor. A continuación se muestra un ejemplo de cómo llamar a esta declaración:
Len := HseMaxExtDllNameLen;
Establecer longitud (S1
Len);
Dec(Len);
BCE.GetServerVariable(BCE.ConnID
'CONTENIDO_LENGTH'
PCar(S1)
Len);
Primero, este código establece la longitud del búfer que contiene la información recuperada del servidor. Luego llama al servidor y realiza una solicitud; en este caso, solicita el "CONTENT_LENGTH" del mensaje del servidor.
La documentación de Microsoft nos dice que puede pasar la siguiente cadena como segundo parámetro de GetServerVariable:
AUTH_TYPE Contiene el tipo de autorización utilizada. Por ejemplo, si está utilizando una autorización básica, entonces
La cadena es "básica"; si se trata de una respuesta de desafío NT, la cadena es "NTLM". Otras autorizaciones tienen cadenas correspondientes específicas. Debido a que constantemente se agregan nuevos tipos de autorización al servidor, no es factible enumerar todas las cadenas posibles. Si la cadena está vacía, no se utiliza ninguna autorización.
CONTENT_LENGTH El número de bytes que el script espera recuperar del cliente.
CONTENT_TYPE El tipo de contenido de la información proporcionada por el cuerpo del anuncio de solicitud. [Nota: El hermano menor tiene menos talento y menos conocimientos, un
La solicitud POST se traduce temporalmente como "aviso de solicitud", corríjame (traductor)]
PATH_INFO Información de enrutamiento adicional, proporcionada por el cliente. Contiene la ruta a la URL que sigue el nombre del script
Depender de. Si está presente, precede a la cadena de solicitud.
Path_translated Este es el valor de Path_info pero contiene los nombres de todas las rutas virtuales expandidas a un indicador de ruta.
Query_string la información que sigue a la "?"
Remote_addr la dirección IP del cliente solicitante o su agente (por ejemplo, una puerta de enlace o firewall).
Remote_host El nombre de host del cliente solicitante o su agente (por ejemplo, una puerta de enlace o firewall).
Remote_User Esto contiene el nombre de usuario proporcionado por el cliente y autorizado por el servidor. Si se devuelve una cadena vacía, entonces el usuario
a su nombre (pero con autorización).
UNMPEPT_REMOTE_USER Es el nombre de un usuario con las siguientes características: este usuario solicita la cuenta de usuario de NT (esta es su identidad), antes de la cual el filtro de aplicación ISAPI mapeó al usuario.
Request_method es el método de solicitud HTTP.
Script_name El nombre del script ejecutado.
Server_Name El nombre de host o la dirección IP cuando aparece en URL de autorreferencial.
Server_port El puerto TCP/IP que acepta solicitudes.
Server_port_secure una cadena que es 0 o 1. Es 1 cuando la solicitud es manejada por un puerto seguro;
Server_protocol acepta el nombre y la versión de la información del protocolo asociada con esta solicitud. Por lo general, es http/1.0.
Server_software es el nombre y la versión del servidor web donde se ejecuta el programa DLL de aplicación ISAPI. ALL_HTTP La variable anterior no analizó todos los encabezados HTTP. Estas variables se derivan de http_ <nombre del encabezado de campo>. Los encabezados de campo (separados por marcadores de línea) contienen cadenas individuales, que no se terminan.
Http_accept Caso especial del encabezado de campo HTTP. Los valores aceptados son: campos separados por comas (,). Por ejemplo: si
Las siguientes líneas son parte del encabezado HTTP:
Aceptar: */ *, q = 0.1
Luego, la URL (una nueva característica en la versión 2.0) le da su parte básica.
Tenga en cuenta que la pieza de información dada anteriormente se pasa automáticamente por el registro TextensionControlBlock. porque
No necesita llamar a GetServerVariable para esto. Sin embargo, puede llamarlo si realmente lo necesita, especialmente si desea obtener información de ReadClient y necesita saber cuánta información leer.
Muchas veces, no necesita llamar a ReadClient. Sin embargo, el tamaño del mensaje enviado por su navegador es mayor que 48 kb
Tiempo, debe llamar a ReadClient para obtener el resto de la información.