이 문서에서는 DELPHI와 인터넷을 함께 작동시키는 방법을 주로 설명합니다. 이 문서에서는 두 가지 전문 기술에 대해 자세히 설명합니다.
WININET: FTP, HTTP 및 Gopher 클라이언트 프로그램 구축 ISAPI: 인터넷 정보 서비스를 확장합니다. 예를 들어 서버에서 정보를 얻어 브라우저에 표시합니다.
오늘날의 컴퓨터 세계는 마이크로소프트의 인터넷 전략으로 인해 거대한 발전 추세가 시작되었습니다. 만드는 사람들
가장 기본적인 인터넷 도구에 대한 CGI(Common Gateway Interface) 및 타사 도구의 시대는 마침내 지나갔습니다. 정교한 타사 도구가 항상 필요하지만 이제 프로그래머는 운영 체제에 내장된 데 필요한 다양한 인터넷 도구를 찾을 수 있습니다. 즉, 추가 투자 없이 무료 DELPHI 리소스를 사용할 수 있습니다.
*웹 브라우저 개발
*두 개의 DELPHI 애플리케이션 또는 DELPHI 애플리케이션과 TCP 간에 FTP, HTTP 및 Gopher를 실행합니다.
(Transmission Control Protocol) 서버 간 TCP를 운영합니다.
DELPHI는 Windows API를 쉽게 호출할 수 있고 OCX/ActiveX를 지원하기 때문에 Microsoft의 새로운 전략
그 전략은 우리 계획과 완벽하게 들어맞았습니다. Microsoft는 도구를 생산하고 DELPHI 프로그래머는 보상을 받습니다!
이 기사의 내용은 무엇입니까?
이 기사에는 세 가지 주요 주제와 함께 세 가지 주요 부분과 일부 작은 부분이 포함되어 있습니다.
*자료 찾기: 이 기사에 언급된 기술 문서는 여기에서 구할 수 있으며 이 기사에서 코드를 실행하는 데 필요한 하드웨어 및 소프트웨어에 대한 간략한 설명이 포함되어 있습니다.
*ISAPI: ISAPI 사용 방법
*WININET: 위니넷 사용법
대부분의 경우 이 문서의 ISAPI 및 WININET 섹션은 완전히 독립적이며 읽는 순서를 자유롭게 선택할 수 있습니다.
정보, 하드웨어 및 소프트웨어 요구 사항 찾기
인터넷 정보 서비스 설명서와 함께 Microsoft Windows NT 3.51 Server 또는 NT 4.0 Server의 복사본이 필요합니다. 왜냐하면 여기에 언급된 기술을 이해해야 하기 때문입니다. 이 문서는 NT Server4.0에 포함되어야 하며, NT 3.51 사용자는 Microsoft 웹사이트에서 다운로드할 수 있습니다. Windows NT를 실행하려면 시스템의 최소 구성이 486 호환 가능하고 메모리가 20MB 이상이어야 합니다.
웹 브라우저가 설치된 다른 컴퓨터가 있어야 합니다. 이 기사의 ISAPI 부분을 원활하게 실행하기 위해 두 번째
머신은 웹 브라우저를 지원하는 모든 소프트웨어를 실행할 수 있어야 합니다. 컴퓨터가 Windows 95 또는 Windows NT를 실행하는 경우
그러면 이 문서의 WININET 코드 조각이 가장 잘 실행됩니다. 이 기술 환경에서는 모든 적격 웹 브라우저를 사용할 수 있습니다.
1996년 6월 이후 출시된 Delphi 2.0 이상의 버전에는 Delphi를 인터넷에 연결하는 데 필요한 도구가 있습니다.
거의 모든 자원.
최신 Delphi 버전이 없다면 [참고: 저자는 버전 2.0(번역자)을 참조함] 이 문서가 필요합니다.
파일에 언급된 특수 파일은 모두 World Wide Web에서 거의 무료로 제공됩니다. [참고: Delphi2.0 이상을 사용하는 경우 (번역기)를 고려할 수 없습니다.] 이 기사에서 언급된 모든 기술은 Delphi2.0 환경에서 원활하게 작동할 수 있지만 16비트 Delphi 환경에서는 원활하게 작동하지 않을 수 있습니다.
World Wide Web에서 정보를 다운로드해야 하는 경우 링크는 다음과 같습니다: http://www.borland.com/TechInfo/delphi/i
index.html
[참고: 더 이상 존재하지 않습니다! :-(( (번역자)]
Delphi2.0의 새 버전에는 WININET.PAS 문서가 포함되어 있습니다.
World Wide Web Node가 이를 제공할 수 있습니다. WININET.PAS에는 Microsoft Windows 인터넷을 확장하도록 설계된 변수, 함수, 유형 및 속성 목록이 포함되어 있습니다. 이는 귀하의 애플리케이션에 FTP, HTTP 및 Gopher 지원을 쉽게 추가할 수 있음을 의미합니다. Microsoft의 WININET.DLL은 무료로 배포됩니다. Windows/System 또는 Windows/System32 디렉터리에 없으면 Microsoft에서 구할 수 있습니다. 다음은 WININET.H 창 도움말 파일을 사용할 수 있는 World Wide Web 노드입니다.
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [참고: 더 이상 사용할 수 없는 것 같습니다! : -( (번역자)]
일반적으로 Microsoft 인터넷 개발자의 온라인 홈은 Microsoft 노드의 INTDEV 부분입니다.
WININET과 ICP 외에도 Delphi가 지원하는 또 다른 핵심 기술은 ISAP입니다. Microsoft의 기업 문서에 명시된 바와 같이
설명된 대로 이 기술을 사용하면 서버측 스크립트와 필터 스크립트를 "작성"하여 Microsoft 인터넷 정보 서비스 및 기타 ISAPI 웹 서비스를 확장할 수 있습니다.
ISAPI에 대한 설명을 찾으려면 다음 사이트로 이동하세요.
http://www.microsoft.com/intdev/sdk/servapi.htm [참고: 신의 축복이 있기를! ;-) (번역자)]
이 기사의 마지막 부분에는 HTTPEXT.PAS라는 주요 ISAPI 문서의 사본이 첨부되어 있습니다.
Microsoft에서 무료로 출시한 ICP(Internet Control Pack)는 Delphi에서 사용할 수 있는 OCX/ActiveX 컨트롤 세트입니다.
이를 응용 프로그램에 끌어다 놓습니다(Delphi 2.0에는 이러한 컨트롤이 포함되어 있습니다). 이들은 Delphi 애플리케이션 작성을 위한 즉각적인 지원을 제공하며 웹 검색 방법, FTP, WINSOCK 및 기타 인터넷 기술 사용 방법을 알고 있습니다. 귀하의 Delphi 사본에 이러한 컨트롤이 포함되어 있지 않은 경우, 해당 문서를 사용하기 전에 Delphi가 위치한 디렉토리의 Lib 디렉토리에 해당 문서를 추가해야 합니다. 문서는 위에서 언급한 링크의 Borland INDEX.HTML 사이트에 있습니다. 이 기사에서는 ICP 컨트롤을 언급하지 않았지만 이 기술에 관심이 있는 사람이라면 누구든지 자신이 이러한 컨트롤을 가지고 있는지 확실히 확인해야 합니다.
컨트롤의 복사본입니다.
내 사이트에서 내 Pascal 응용 프로그램 파일을 다운로드할 수 있으며 해당 파일의 이름은 STRBOX.PAS 및 MATHBOX.PAS입니다.
이 기사에 언급된 정보에 대한 업데이트가 있는지 이 사이트를 자주 확인하는 것이 좋습니다.
여기서는 독자가 Delphi와 Object Pascal에 익숙하고 인터넷, HTML,
브라우저와 World Wide Web 서버에 대한 기본적인 이해가 있어야 합니다.
ISAPI
ISAPI는 인터넷 정보 서비스의 기능을 확장할 수 있는 사용하기 쉬우면서도 강력한 기술입니다.
이 기술은 Windows NT 4.0과 함께 제공되며 서버에 WEB, FTP 및 GOPHER 사이트를 만들 수 있습니다. 동시에 이 기술은 WindowsNT3.51 Server와 호환됩니다. [참고: 서버 버전을 나타내며 다른 버전은 워크스테이션 버전(번역기)입니다].
과거에는 웹 서버를 확장하는 가장 좋은 방법은 CGI 애플리케이션을 구축하는 것이었습니다. 그것들은 강력한 도구이기는 하지만 또한
실행 형식에 따라 제한됩니다[참고: 예를 들어 PERL은 해석되고 실행됩니다(번역기)]. 브라우저에서 서버에 CGI 기반 요청을 하면 CGI 응용 프로그램이 먼저 메모리에 강제로 들어가게 되어 많은 시간이 소모됩니다. 더욱이 어떤 상황에서는 CGI 기술을 사용하기가 조금 더 어려워지는 것처럼 보입니다.
ISAPI는 DLL을 작성하여 CGI 응용 프로그램을 대체하는 방법입니다[참고: 동적 링크 프로그램(번역기)]. 당신은 또한 할 수 있습니다
ISAPI를 통해 필터링된 텍스트를 작성할 수 있지만 이 기사에서는 이 기술에 대해 언급하지 않겠습니다. CGI에 비해 ISAPI는 사용하기 쉽고 빠르며 시스템 리소스를 더 잘 활용합니다. 다음에서는 ISAPI DLL이 CGI 응용 프로그램보다 나은 이유를 자세히 설명하겠습니다.
ISAPI DLL은 HTTP 서비스와 동일한 주소에 있으므로 서버에서 직접 HTTP 서비스에 액세스할 수 있습니다. CGI 응용 프로그램과 비교하여 서버에서 요청할 때 메모리에 더 빠르게 로드할 수 있으며 일시 중지 시간이 더 짧습니다. [참고: 요청을 하고 서버(번역기)에서 응답을 받는 사이의 시간을 나타냅니다.] 많이 있습니다. 이는 서버의 부하가 높을 때 더욱 중요합니다.
DLL이 로드되고 언로드되는 시기를 제어할 수 있습니다. 예를 들어 다음과 같은 경우 첫 번째 요청에서 DLL을 미리 로드할 수 있습니다.
사용하지 않는 ISAPI 응용 프로그램 DLL을 언로드하여 시스템 리소스를 확보합니다.
앞서 언급했듯이 ISAPI를 사용하여 필터링된 텍스트를 작성할 수 있습니다. [참고: 일반적으로 C/S 구조(번역기)의 스크립트를 나타냅니다.]
Microsoft 설명서에 따르면 ISAPI를 통해 텍스트를 필터링하여 다음을 수행할 수 있습니다.
사용자 인증 체계
압축
암호화
로그인
트래픽 분석 또는 기타 요청 분석(예: "....etcpassWord"에서 요청 검색)
이 기사에서는 데이터 세트를 반환하는 DLL을 작성하는 방법이나 브라우저를 실행하는 사용자와 상호 작용하는 방법에 중점을 둘 것입니다.
간단한 연락을 해보세요.
ISAPI 기본
HTTPEXT.PAS 파일에는 ISAPI 사용을 위한 주요 명령문이 포함되어 있습니다. 이 문서는
델파이 버전이 배포되었습니다. 또한 이 기사의 ISAPI 섹션에 첨부된 Borland 사이트에서도 찾을 수 있습니다. 이는 NT 기술을 기반으로 하기 때문에 이 기술을 적용하려면 Delphi2.0 이상을 사용해야 합니다. 16비트 편집기에서는 이 기능을 사용할 수 없습니다.
HTTPEXT.PAS에는 Microsoft에서 만든 ISAPI 기술의 인터페이스가 포함되어 있습니다. [참고: Delphi 인터페이스를 나타내며 ISAPI는 C++로 컴파일됩니다.
글쓰기 (번역자)]. Delphi를 작성할 때 제공되는 ISAPI 사용자 인터페이스는 없으며 Microsoft의 기존 기술을 사용하는 방법만 설명하겠습니다. 그러나 ISAPI는 사용하기가 너무 쉽고 대부분의 사용자에게는 사용자 버전의 Delphi 개체가 필요하지 않습니다.
ISAPI DLL에 대한 입구로 사용할 수 있는 세 가지 기능이 있습니다. 처음 두 개는 필수이고 세 번째는 선택 사항입니다.
GetExtensionVersion: 최소 버전 확인
HttpExtensionPROc: 이는 Delphi 애플리케이션의 시작...끝 블록과 마찬가지로 DLL의 진입점입니다.
TerminateExtension: 이는 다른 메모리 할당을 정리하기 위해 스레드로 사용할 수 있는 선택적 프로그램입니다.
ISAPI DLL을 생성할 때 위에 나열된 세 가지 함수 중 처음 두 개를 참조해야 합니다.
두 가지 기능이 모든 ISAPI 프로그래밍의 핵심입니다.
세 문 모두 ISAPI DLL이 인터넷 정보 서비스를 확장하기 때문에 사용되는 용어인 "단어 출력"을 포함합니다.
장치. (Internet Information Server는 Microsoft Server를 의미합니다. NT 서버를 물리적 웹 서버로 사용하려는 경우 이것이 바로 필요한 도구입니다. ISAPI DLL은 NT4.0과 함께 배포되며 운영 체제를 설치할 때 설치됩니다. .가 자동으로 설치됩니다.)
ISAPI는 프로덕션 서버가 따를 수 있는 표준을 제공합니다. 예를 들어 Netscape의 복잡한 NSAPI 인터페이스를 사용할 수 있습니다.
NSAPI 인터페이스를 작동하기 위해 관련 간결하고 아름다운 ISAPI로 압축되었습니다.
다음은 이 두 가지 중요한 함수의 선언입니다.
함수 GetExtensionVersion(var 버전: THSE_VERSION_INFO): BOOL;
함수 HttpExtensionProc(var ECB: TExtensionControlBlock): DWORD;
GetExtensionVersion을 DLL에 붙여넣기만 하면 완료됩니다. ISAPI가 새 버전을 공개할 때 약간만 변경하면 됩니다.
함수 GetExtensionVersion(var 버전: THSE_VERSION_INFO):
BOOL;
시작하다
Ver.dwExtensionVersion := $00010000; // 1.0 지원
Ver.lpszExtensionDesc := '델파이 2.0 ISAPI DLL' // 설명
결과 := 참;
끝;
이 함수에 전달된 매개변수는 HTTPEXT.PAS에서 다음과 같이 선언됩니다.
관련 매개변수는 HTTPEXT.PAS에 다음과 같이 선언됩니다.
PHSE_VERSION_INFO = ^THSE_VERSION_INFO;
THSE_VERSION_INFO = 압축된 레코드
dwExtensionVersion: DWORD;
lpszExtensionDesc: Char의 배열[0..HseMaxExtDLLNameLen-1];
끝;
선언에서 상수 HseMaxExtDllNameLen의 값은 256입니다. 레코드의 두 변수는 "자체 선언"입니다. 전자는 ISAPI 버전 번호[참고: 변수 dwExtensionVersion(번역기)]를 포함하고 후자는 DLL을 설명하는 데 사용되는 사용자 정의 문자열을 나타냅니다.
GetExtensionVersion 문을 참조할 때 DLL 프로그램의 DPR 파일 섹션에 입력을 추가해야 합니다.
아웃 부분. 이 진술을 작성할 때 다음 사항도 작성해야 합니다.
수출
확장 버전 가져오기
HttpExtensionProc;
이는 두 가지 중요한 ISAPI DLL에 대한 기능을 설정할 때 수행하는 작업입니다. HttpExtensionProc을 사용하는 다음 단계는 조금 더 복잡하므로 별도의 섹션으로 남겨두겠습니다.
HttpExtensionProc 작업
HttpExtensionProc 문은 DLL의 진입점입니다. 그 기능은 C 언어의 main() 문과 같습니다.
델파이의 시작...끝 부분
다음은 GetExtensionVersion 문을 사용하는 간단한 예입니다.
함수 HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD;
var
ResStr: 문자열;
StrLen: 정수;
시작하다
ECB.lpszLogData := '델파이 DLL 로그';
ECB.dwHTTPStatusCode := 200;
ResStr := ' +
'
'ISAPI에서 안녕하세요.
' +
';
ResStr := 형식(
'HTTP/1.0 200 OK'#13#10+
'콘텐츠 유형: text/html'#13#10+
'콘텐츠 길이: %d'#13#10+
'내용:'#13#10#13#10'%s'
[길이(ResStr)
ResStr]);
StrLen := 길이(ResStr);
ECB.WriteClient(ECB.ConnID
포인터(ResStr)
강도
0);
결과 := HSE_STATUS_SUCCESS;
끝;
검색하는 동안 이 DLL에 요청하면 다음과 같은 응답을 받게 됩니다.
테스트 서버 결과
ISAPI에서 안녕하세요.
함수 본문 내의 대부분의 필드는 기본 정보를 제공하는 간단한 HTML 코드와 밀접하게 관련되어 있습니다. 또한 아래와 같이 TExtensionControlBlock의 일부 필드를 채워야 합니다.
이 레코드에는 WriteClient라는 함수 포인터가 있습니다. 이 함수를 참조하여 정보를 전달할 수 있습니다.
브라우저로 다시 보냅니다. 이 함수를 호출할 때 아래에 언급된 TExtensionControl 블록의 ConnID 필드를 사용합니다. 함수가 호출되면 ConnID가 자동으로 채워집니다.
함수의 코드를 보기 전에 위에서 언급한 모든 HttpExtensionProc 함수를 보여드리겠습니다.
ISAPI DLL의 전체 프로그램
라이브러리 Isapi1;
라이브러리 Isapi1;
용도
윈도우
SysUtils
HTTPExt;
함수 GetExtensionVersion( var 버전: THSE_VERSION_INFO ): BOOL;
시작하다
Ver.dwExtensionVersion := $00010000; // 버전 1.0 지원을 기대하고 있습니다.
Ver.lpszExtensionDesc := '델파이 2.0에서 작성됨';
결과 := 참;
끝;
함수 HttpExtensionProc( var ECB: TEXTENSION_Control_BLOCK ): DWORD;
표준 호출;
var
ResStr: 문자열;
StrLen: 정수;
시작하다
ECB.lpszLogData := '델파이 DLL 로그';
ECB.dwHTTPStatusCode := 200;
ResStr := '
' +
'
테스트 서버 결과
' +
'
Isapi가 DevRel에게 인사합니다.
';
ResStr := 형식(
'HTTP/1.0 200 OK'#13#10+
'콘텐츠 유형: text/html'#13#10+
'콘텐츠 길이: %d'#13#10+
'내용:'#13#10#13#10'%s'
[길이(ResStr)
ResStr]);
StrLen := 길이(ResStr);
ECB.WriteClient(ECB.ConnID
포인터(ResStr)
강도
0);
결과 := HSE_STATUS_SUCCESS;
끝;
수출
확장 버전 가져오기
HttpExtensionProc;
시작하다
끝.
이 DLL 프로그램을 실행하려면 이를 NT 서버 아래의 scripts 디렉터리에 복사해야 합니다. 내 NT4.0 컴퓨터에서
다음과 같이 진행됩니다.
c:winntsystem32inetsrvscriptsmystuffisapi1.dll
이 예에서는 "mystuff"라는 디렉터리를 만들었습니다.
내가 만든 것을 저장하는 데 사용됩니다.
ISAPI DLL. 물론 귀하의 디렉토리는 "inetsrv" 디렉토리의 위치와 기타 요인에 따라 내 컴퓨터에 있는 디렉토리와 정확히 동일하지는 않습니다.
이 DLL을 성공적으로 호출하려면 HTML 페이지에 다음 하이퍼링크를 추가해야 합니다.
ISAPI 원
사용자가 이 하이퍼링크를 클릭하면 ISAPI1 Dll이 호출되고 "Hello from ISAPI"라는 문자열이 표시됩니다.
사용자의 브라우저에 표시됩니다. mystuff 디렉토리에 ISAPI.DLL을 넣지 않은 경우 위의 HTML 코드를 수정하여 상황에 맞게 조정해야 합니다. 디렉터리는 inetsrv 디렉터리에 상대적이어야 하며 전체 DLL이 있는 디렉터리를 포함해서는 안 되며 포함할 수도 없습니다.
호출의 전체 HTML 스크립트는 다음과 같습니다.
이것은 내 집 컴퓨터의 홈 페이지입니다.
ISAPI 원
ISAPI1.DLL 프로그램을 mystuff 디렉토리에 여러 번 복사하는 경우 다음을 수행해야 합니다.
웹 서버의 World Wide Web 포트를 닫습니다. 이 DLL을 처음 복사할 때는 제한이 없지만 이후에는 서버에 속하게 되기 때문입니다. 따라서 첫 번째 복사본의 업데이트된 버전을 복사할 때는 World Wide Web 서비스를 꺼야 합니다. 네트워크 관리 프로그램을 사용하여 World Wide Web 서비스를 끌 수 있습니다. 이 프로그램은 Microsoft Internet Server 그룹에 있어야 하며 네트워크 정보 서비스를 설치할 때 탐색기/프로그램 관리자 아래에 설치되어야 합니다.
TExtensionControlBlock과 함께 작동
이 기사의 이 시점을 통해 첫 번째 ISAPI DLL을 빌드하고 두 번째 컴퓨터에서 온라인으로 실행할 수 있습니다.
웹 브라우저가 그것을 호출합니다.
ISAPI의 나머지 부분은 이 기사에서 더 자세히 설명합니다.
다음은 HttpExtensionProc 매개변수의 더 복잡한 부분입니다.
PExtensionControlBlock = ^TExtensionControlBlock;
TExtensionControlBlock = 압축된 레코드
cbSize: DWORD; // = sizeof(TExtensionControlBlock)
dwVersion: DWORD; // 이 사양의 버전 정보
ConnID: HCONN; // 컨텍스트 수정하지 마세요!
dwHttpStatusCode: DWORD; // HTTP 상태 코드;
// 이 확장 DLL과 관련된 null로 끝나는 로그 정보
lpszLogData: Char의 배열 [0..HSE_LOG_BUFFER_LEN-1];
lpszMethod: PChar; // REQUEST_METHOD;
lpszQueryString: PChar; // QUERY_STRING;
lpszPathInfo: PChar; // PATH_INFO;
lpszPathTranslated: PChar; // PATH_TRANSLATED;
cbTotalBytes: DWORD; // 클라이언트의 총 바이트 수
cbAvailable: DWORD; // 사용 가능한 바이트 수
lpbData: 포인터; // cbAvailable 바이트에 대한 포인터
lpszContentType: PChar; // 클라이언트 데이터의 콘텐츠 유형
GetServerVariable: TGetServerVariableProc;
WriteClient: TWriteClientProc;
ReadClient: TReadClientProc;
ServerSupportFunction: TServerSupportFunctionProc;
끝;
이 레코드에는 위에서 언급한 ConnID 필드가 포함되어 있으며 첫 번째 매개 변수를 WriteClient에 전달합니다.
이 레코드의 첫 번째 매개변수는 버전 제어를 위한 것입니다. 지정된 TExtensionControlBlock의 크기여야 합니다. Microsoft가 구조를 변경하는 경우 레코드 크기를 확인하여 처리 중인 구조의 버전을 확인할 수 있습니다. 이 레코드의 처음 세 필드는 필요하지 않습니다. 해당 필드는 이미 ISAPI로 채워져 있으며 프로그램에서 액세스만 가능하고 변경할 수는 없습니다.
아마도 이 레코드에서 가장 중요한 필드는 서버의 요청을 포함하는 lpszQueryString일 것입니다.
정보. 예를 들어 ISAPI1.Dll이라는 파일을 만들었다고 가정합니다. 이 DLL을 호출하려면 브라우저의 페이지에 다음과 같은 HREF를 생성합니다. [참고: HTML 언어 형식(번역기)]
테스트 1
이 DLL에 응답하려면 위 줄을 다음과 같이 변경해야 합니다.
테스트 1
HTML 코드 조각에 위 두 줄 중 두 번째 줄이 포함되어 있으면 DLL에는 lpszQueryString 매개 변수가 있습니다.
"MyQuery" 문자열을 가져오려면 요청 문자열 다음에 오는 요청 플래그 사용에 특히 주의하세요.
물론 요청 문자열을 원하는 대로 변경할 수 있습니다. 예를 들어 다음과 같이 작성할 수 있습니다.
테스트 1
이 요청에서 이 DLL은 서버 이름으로 응답합니다. 이 매개변수를 전달할 때 어떤 제한도 적용되지 않습니다. 너
원하는 것은 무엇이든 전달할 수 있으며 DLL의 정보를 분석하는 방법은 사용자에게 달려 있습니다.
서버에서 브라우저로 정보를 반환할 때 이 레코드의 "WriteClient" 함수 포인터를 사용합니다.
. 이 포인터를 초기화할 때 아무 것도 할 필요가 없습니다. 네트워크 정보 서버에 의해 자동으로 전달됩니다.
CGI 애플리케이션 작성자는 요청 문자열을 전달하는 구문이 매우 익숙하다는 점을 알게 될 것입니다. 실제로 ISAPI는 CGI를 따랐습니다.
대부분의 규칙과 마찬가지로 TExtensionControlBlock의 대부분 필드는 CGI 기술을 통해 간단히 빌릴 수 있습니다.
TExtensionControlBlock의 또 다른 핵심 필드는 lpbData이며, 여기에는 탐색을 통해 업로드된 추가 정보가 포함되어 있습니다.
예를 들어, 여러 필드가 있는 HTML 양식이 있는 경우 이러한 필드에 포함된 정보는 "
lpData" 포인터. 이 문서의 다음 주제인 "'확인' 버튼에서 정보 얻기"에서는 이 상황을 처리하는 방법에 중점을 둘 것입니다.
지금까지 TExtensionControlBlock의 네 가지 주요 필드를 소개했습니다.
WriteClient: 형식이 지정된 HTML 데이터를 브라우저에 전달할 수 있는 포인터입니다. 이 기능이 사용됩니다
TExtensionControlBlock의 ConnID 필드입니다.
lpszQueryString: 브라우저에서 오는 요청입니다.
lpbData: 브라우저에서 귀하에게 업로드된 추가 데이터입니다. 일반적으로 HTML 양식의 모든 필드 내용
. 이에 대해서는 "확인 버튼" 섹션에서 자세히 설명하겠습니다.
TExtensionControlBlock의 다른 필드가 어떻게 작동하는지 감을 얻으려면 가장 좋은 방법은 다음을 수행하는 것입니다.
찾아보고 비교해 보세요. 즉, 사용자가 클라이언트의 ISAPI DLL을 호출할 수 있는 HTML 페이지를 생성하려고 합니다. 이 ISAPI DLL의 목적은 단순히 TExtensionControlBlock의 각 필드를 HTML로 형식화한 다음 브라우저에 다시 전달하는 것입니다. 이렇게 하면 브라우저가 TExtensionControlBlock의 모든 필드를 표시하는 다소 무서운 디버거로 변합니다.
다음은 이 작업을 수행하는 Borland의 Danny Thorpe가 작성한 프로그램입니다.
라이브러리 테스트1;
용도
윈도우
SysUtils
HTTPExt;
함수 GetExtensionVersion( var 버전: THSE_VERSION_INFO ): BOOL;
시작하다
Ver.dwExtensionVersion := $00010000; // 1.0 지원
Ver.lpszExtensionDesc := 'Delphi 2.0으로 작성된 테스트 DLL';
결과 := 참;
끝;
함수 HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: 문자열;
StrLen: 정수;
Buf: Char 배열 [0..1024];
시작하다
ECB.lpszLogData := '델파이 DLL 로그';
ECB.dwHTTPStatusCode := 200;
ResStr := 형식(
' +
'
'크기 = %d
'+
'버전 = %.8x
'+
'콘ID = %.8x
'+
'방법 = %s
' +
'쿼리 = %s
' +
'PathInfo = %s
'+
'PathTranslated = %s
'+
'총 바이트 = %d
'+
'사용 가능한 바이트 = %d
'+
'컨텐츠 유형 = %s
'+
'
[ECB.cb크기
ECB.dw버전
ECB.ConnID
ECB.lpsz방법
ECB.lpszQueryString
ECB.lpszPathInfo
ECB.lpszPath번역됨
ECB.cbTotalBytes
ECB.cb사용 가능
ECB.lpszContentType]);
ECB와 함께
시작하다
StrLen := Sizeof(Buf);
GetServer변수(ConnID
'REMOTE_ADDR'
@Buf
StrLen);
ResStr := ResStr + 'REMOTE_ADDR = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServer변수(ConnID
'REMOTE_HOST'
@Buf
StrLen);
ResStr := ResStr + 'Remote_Host = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServer변수(ConnID
'REMOTE_USER'
@Buf
StrLen);
ResStr := ResStr + 'Remote_User = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServer변수(ConnID
'SERVER_NAME'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_NAME = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServer변수(ConnID
'SERVER_PORT'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PORT = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServer변수(ConnID
'SERVER_PROTOCOL'
@Buf
StrLen);
ResStr := ResStr + 'SERVER_PROTOCOL = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServer변수(ConnID
'서버_소프트웨어'
@Buf
StrLen);
ResStr := Format('%sSERVER_SOFTWARE = %s
'+
'스레드ID = %.8x
'
[ResStr
부프
GetCurrentThreadID]);
끝;
ResStr := ResStr + ';
ResStr := 형식(
'HTTP/1.0 200 OK'#13#10+
'콘텐츠 유형: text/html'#13#10+
'콘텐츠 길이: %d'#13#10+
'내용:'#13#10#13#10'%s'
[길이(ResStr)
ResStr]);
StrLen := 길이(ResStr);
ECB.WriteClient(ECB.ConnID
포인터(ResStr)
강도
0);
결과 := HSE_STATUS_SUCCESS;
끝;
엑스포트
확장 버전 가져오기
HttpExtensionProc;
에긴
끝.
이 DLL을 호출하려면 다음 줄을 포함하는 HRML 스크립트를 생성해야 합니다.
테스트 1
"확인" 버튼으로 정보 얻기
일반적으로 정보를 보내는 HTML 양식에는 확인 버튼이 있습니다. 정보량이 49KB 미만이면 가능합니다.
TExetensionControlBlock의 lpbData 필드를 사용할 수 있다고 생각하세요. 방법은 다음과 같습니다.
대부분의 경우 이 필드에 대한 포인터가 보낸 정보는 다음과 같습니다.
var
S: 문자열;
시작하다
…
S := PChar(ECB.lpbData);
…
끝;
이 필드에서 나오는 정보가 48KB보다 큰 경우 ReadClient를 호출하여 나머지 정보를 가져와야 합니다.
lpbData 필드에서 사용할 수 있는 정보가 무엇인지 정확히 알고 싶다면 다음 두 가지 기능을 사용하여 데이터를 웹 브라우저로 다시 전달할 수 있습니다.
함수 SetUpResString: 문자열;
시작하다
결과 := ' +
' +
'
'lpb데이터 = %s ' +
';
끝;
함수 HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD;
var
ResStr: 문자열;
StrLen: 정수;
에스
S1: 문자열;
시작하다
ECB.lpszLogData := '델파이 DLL 로그';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := 형식(ResStr
[에스]);
StrLen := 길이(ResStr);
ECB.WriteClient(ECB.ConnID
포인터(ResStr)
강도
0);
결과 := HSE_STATUS_SUCCESS;
끝;
다음 코드가 첨부된 HTML 양식이 이미 있다고 가정합니다.
이 코드는 숫자를 입력할 수 있는 텍스트 영역과 "GetSquare"라는 "제출" 버튼이 있는 양식을 생성합니다. 이 양식이 있는 경우 사용자가 양식의 텍스트 영역에 숫자 23을 입력한다고 가정하면 위의 두 프로그램이 다음 문자열을 반환할 것으로 예상할 수 있습니다.
lpbData = GetSquare=23&GetSquare=제출
이때 무슨 일이 일어나는지 이해하기 위해서는 위 함수에서 발췌한 HTML 문장의 주요 부분을 주목해 보세요. 문장의 이 부분은 서버에 상주하며 다음과 같이 반영됩니다.
'lpb데이터 = %s ' +
위 HttpExtensionProc 함수의 코드를 연구하면 이 문장 바로 앞에서 ECB.lpbData의 값 대신 Format 문의 %s 매개 변수를 사용한다는 것을 알 수 있습니다. (문 형식이 어떻게 작동하는지 모르시는 경우 관련 델파이 문서를 참고하시기 바랍니다.) [참고: 저자의 Delphi2 프로그래밍 백과사전(Delphi2
Unleashed(번역기) 3장 "문자열 및 텍스트 파일"에 자세한 지침이 있습니다.]
위에 표시된 형식에서 사용자가 "확인" 버튼을 누를 때 lpbData가 ISAPI DLL에 전달한 값은 다음과 같다고 가정합니다.
GetSquare=23&GetSquare=제출
명확한 아이디어를 제공하기 위해 위의 두 명령문에 의해 브라우저에 다시 전달된 정보는 이미 본 다음 문자열이라는 점을 반복하겠습니다.
lpbData = GetSquare=23&GetSquare=제출
이 프로세스를 확인하는 가장 좋은 방법은 아래 나열된 ISAPI2 프로그램을 테스트 실행하는 것입니다. ISAPI2는 ISAPI1과 유사하지만 위에 표시된 새로운 HttpExtensionProc 함수와 SetUpResString 유틸리티 함수도 포함합니다.
라이브러리 Isapi2;
용도
윈도우
SysUtils
HTTPExt;
함수 GetExtensionVersion(var 버전: THSE_VERSION_INFO):
BOOL;
시작하다
Ver.dwExtensionVersion := $00010000; // 1.0 지원
Ver.lpszExtensionDesc := '델파이 2.0으로 작성된 DLL';
결과 := 참;
끝;
함수 SetUpResString: 문자열;
시작하다
결과 := ' +
' +
'
'lpb데이터 = %s ' +
';
끝;
함수 HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: 문자열;
StrLen: 정수;
에스
S1: 문자열;
렌: 정수;
시작하다
ECB.lpszLogData := '델파이 DLL 로그';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := 형식(ResStr
[에스]);
StrLen := 길이(ResStr);
ECB.WriteClient(ECB.ConnID
포인터(ResStr)
강도
0);
결과 := HSE_STATUS_SUCCESS;
끝;
수출
확장 버전 가져오기
HttpExtensionProc;
시작하다
끝.
양식에서 lpbData 변수에 의해 전달된 정보를 얻은 후에는 정보를 구문 분석하거나 사용자에게 반환할 수 있습니다. 예를 들어, 위의 예에서 숫자 23을 추출하고 이를 제곱하여 사용자에게 반환할 수 있습니다. 이렇게 하면 사용자로부터 정보(이 경우 숫자)를 얻고, 숫자에 대해 몇 가지 수학적 연산을 수행하고, 최종적으로 결과를 사용자에게 반환할 수 있습니다. 이는 현재 인터넷 프로그래밍의 가장 인기 있는 측면인 전파에서 바로 대화형 웹 페이지를 만들 수 있다는 것을 의미합니다!
다음은 네트워크를 통해 브라우저에 숫자의 제곱을 제출하는 완전한 프로그램 코드입니다.
라이브러리 Isapi3;
{ 이 코드는 브라우저를 통해 사용자로부터 입력을 받는 방법을 보여줍니다.
그 정보를 분석해 보세요
그런 다음 사용자에게 답변을 반환합니다.
사용자가 번호를 제출
이 코드는 그것을 제곱합니다
그런 다음 결과를 사용자에게 다시 보냅니다. 다음은 구문 분석을 위해 정보를 제출하는 브라우저의 양식입니다.
}
용도
윈도우
SysUtils
HTTPExt
StrBox;
함수 GetExtensionVersion(var 버전: THSE_VERSION_INFO):
BOOL;
시작하다
Ver.dwExtensionVersion := $00010000; // 버전 1.0 지원
Ver.lpszExtensionDesc := 'ISAPI3.DLL';
결과 := 참;
끝;
// lpbData를 구문 분석하고 사용자가 우리에게 전달한 번호를 검색합니다.
function ParseData(S: 문자열): 정수;
시작하다
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
결과 := StrToInt(S);
끝;
함수 SetUpResString: 문자열;
시작하다
결과 := ' +
' +
'
'답변 = %d' +
';
끝;
함수 HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
var
ResStr: 문자열;
StrLen: 정수;
에스
S1: 문자열;
숫자: 정수;
시작하다
ECB.lpszLogData := '델파이 DLL 로그';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
Num := ParseData(S);
수 := Sqr(수);
ResStr := 형식(ResStr
[번호]);
StrLen := 길이(ResStr);
ECB.WriteClient(ECB.ConnID
포인터(ResStr)
강도
0);
결과 := HSE_STATUS_SUCCESS;
끝;
수출
확장 버전 가져오기
HttpExtensionProc;
시작하다
끝.
이 코드는 확인 버튼을 누르고 제곱수를 요청한 사용자로부터 다음 문자열을 받아들입니다.
GetSquare=5&GetSquare=제출
이와 같은 입력을 가정하면 이 코드는 인터넷을 통해 사용자에게 다음 문자열을 반환합니다.
답 = 25
한 문장에서 사용자는 숫자 5를 입력하고 사용자에게 숫자 25를 반환합니다. 사용자가 숫자 10을 제출하면 숫자 100이 반환됩니다. 사소해 보일 수도 있지만 여기서 중요한 것은 인터넷에서 일어나는 일입니다. [참고: 대화형 웹 페이지(번역됨)
WHO)]
다음과 같이 사용자가 전달한 함수를 분석합니다.
// lpbData를 구문 분석하고 사용자가 우리에게 전달한 번호를 검색합니다.
function ParseData(S: 문자열): 정수;
시작하다
S := StripLastToken(S
'&');
S := StripFirstToken(S
'=');
결과 := StrToInt(S);
끝;
이 두 진술은 이 기사의 시작 부분에 언급된 단원에 있으며 내 사이트에도 포함되어 있습니다. [참고: 이 문서는 인터넷의 거의 모든 곳에서 찾을 수 있습니다.
번역가(Translator)에게 요청할 수도 있습니다.][이 글에서는
저는 ISAPI에 대해 너무 많이 이야기하고 싶습니다. 이는 여러분이 이 훌륭한 기술을 활용하는 즐거움을 느끼기에 충분할 것입니다. 다음으로 저는 GetServerVariable과 ReadClient라는 두 가지 명령문에 대해 이야기하고 싶습니다. 이와 관련하여 저는 극히 제한적인 실험만 수행했습니다. 이 문서에서는 HTTPEXT.PAS 파일을 첨부했습니다. 왜냐하면 이 중요한 문서 외에는 찾을 수 없기 때문입니다.
GetServerVariable 및 ReadClient 문
CGI 애플리케이션에서 정보를 요청하는 것과 마찬가지로 명령문을 사용하여 서버에서 정보를 얻을 수 있습니다. 다음은 이 명령문을 호출하는 예입니다.
렌 := HseMaxExtDllNameLen;
길이설정(S1
렌);
12월(렌);
ECB.GetServerVariable(ECB.ConnID
'CONTENT_LENGTH'
PChar(S1)
렌);
첫째, 이 코드는 서버에서 검색된 정보를 보유하는 버퍼의 길이를 설정합니다. 그런 다음 서버를 호출하고 요청합니다. 이 경우 서버에서 메시지의 "CONTENT_LENGTH"를 요청합니다.
Microsoft 문서에는 다음 문자열을 GetServerVariable의 두 번째 매개변수로 전달할 수 있다고 나와 있습니다.
AUTH_TYPE 사용된 인증 유형을 포함합니다. 예를 들어 기본 인증을 사용하는 경우
문자열은 "basic"입니다. NT 챌린지 응답인 경우 문자열은 "NTLM"입니다. 다른 승인에는 특정한 해당 문자열이 있습니다. 새로운 인증 유형이 서버에 지속적으로 추가되기 때문에 가능한 모든 문자열을 나열하는 것은 불가능합니다. 문자열이 비어 있으면 인증이 사용되지 않습니다.
CONTENT_LENGTH 스크립트가 클라이언트에서 회수할 것으로 예상하는 바이트 수입니다.
CONTENT_TYPE 요청 광고 본문에서 제공하는 정보의 콘텐츠 유형입니다. [참고: 남동생은 재능이 적고 지식도 적습니다.
POST 요청이 일시적으로 "요청 공지"로 번역되었습니다. 정정해 주세요(번역자)]
PATH_INFO 클라이언트가 제공하는 추가 라우팅 정보입니다. 스크립트 이름 뒤에 URL 경로가 포함되어 있습니다.
의지하십시오. 존재하는 경우 요청 문자열 앞에 옵니다.
PATH_TRANSLATED 이것은 PATH_INFO의 값이지만 PATH 플래그로 확장 된 모든 가상 경로의 이름을 포함합니다.
Query_String "?"
Remote_addr 요청 클라이언트 또는 해당 에이전트의 IP 주소 (예 : 게이트웨이 또는 방화벽).
Remote_host 요청 클라이언트 또는 해당 에이전트의 호스트 이름 (예 : 게이트웨이 또는 방화벽).
remote_user 여기에는 클라이언트가 제공하고 서버가 승인 한 사용자 이름이 포함되어 있습니다. 빈 문자열이 반환되면 사용자를 사용합니다
귀하의 이름으로 (그러나 권한 부여).
Unmapped_remote_user 다음 특성을 가진 사용자의 이름입니다.이 사용자는 NT 사용자 계정 (이 신원)에 요청을합니다.
request_method는 HTTP 요청 방법입니다.
script_name 실행 된 스크립트의 이름입니다.
server_name 자체 참조 URL에 나타날 때 호스트 이름 또는 IP 주소입니다.
Server_port 요청을 받아들이는 TCP/IP 포트입니다.
Server_port_secure 0 또는 1 인 문자열입니다. 요청이 보안 포트로 처리되는 경우 1입니다.
Server_Protocol 은이 요청과 관련된 프로토콜 정보의 이름과 버전을 허용합니다. 일반적으로 HTTP/1.0입니다.
Server_Software는 ISAPI 응용 프로그램 DLL 프로그램이 실행되는 웹 서버의 이름과 버전입니다. ALL_HTTP 이전 변수는 모든 HTTP 헤더를 구문 분석하지 않았습니다. 이 변수는 http_ <필드 헤더 이름>에서 파생됩니다. 필드 헤더 (라인 마커로 분리)에는 종료되지 않은 개별 문자열이 포함되어 있습니다.
http_accept HTTP 필드 헤더의 특수 사례. 허용 값은 다음과 같습니다. 쉼표로 분리 된 필드 (,). 예 : if
다음 줄은 HTTP 헤더의 일부입니다.
수락 : */ *, q = 0.1
그런 다음 URL (버전 2.0의 새로운 기능)은 기본 부분을 제공합니다.
위에 주어진 정보는 TellectionControlBlock 레코드에 의해 자동으로 전달됩니다. 왜냐하면
이를 위해 GetServarible에 전화 할 필요가 없습니다. 그러나 실제로 필요한 경우, 특히 ReadClient에서 정보를 얻고 읽을 정보를 알아야하는 경우 특히 전화 할 수 있습니다.
여러 번, 당신은 readclient를 호출 할 필요가 없습니다. 그러나 브라우저에서 보낸 메시지의 크기는 48KB보다 큽니다.
시간, 나머지 정보를 얻으려면 ReadClient에 전화해야합니다.