RSS


[ Pobierz całość w formacie PDF ]
.Dokładne instrukcje na ten temat znajdziesz w Uwadze Technicznej MFC nr 63.Debuggowanie części VB jest jeszcze gorsze.Najprostszym sposobem jest przyprawienie kodu VB wieloma tymczasowymi poleceniami WriteLine, aby wiedzieć co się dzieje w strumieniu HTML.Nie jest to idealne, ale działa.Na szczęście, CBISAPI samo zgłosi wszelkie wyjątki, więc musisz jedynie troszczyć się o błędy logiczne.Inna niewygoda polega na tym, że zwykle trzeba zamknąć IIS, abyś mógł skopiować (lub przebudować) swoje pliki.Możesz ustawić klucz Rejestru HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/W3SV C/Parameters/CacheExtensions na zero, co spowoduje, że IIS będzie szybciej zwalniał pliki.Oprócz tego, za każdym razem, gdy ponownie tworzysz serwer VB, musisz zarejestrować go na komputerze IIS.Dalsze kierunkiIstnieje wiele ulepszeń, jakie możesz wprowadzić do DLL-a C++, CBISAPI.Jedną z oczekiwanych zmian byłaby automatyczna analiza łańcucha zapytań i treści.Mógłbyś stworzyć sparametryzowaną właściwość o nazwie ParsedQueryString.Mogłaby ak­ceptować nazwę zmiennej zapytania i zwracać jej wartość, na przykład tak:Dim s as Strings=server.ParsedQueryString("HI")Oprócz tego, bawiłem się nieco dodaniem trybu debuggowania, który mógłbyś włączyć przy pomocy opcji w łańcuchu zapytań.Innym pomysłem byłoby stworzenie wersji CBISAPI.DLL dla debuggera (może CBISAPID.DLL).Ta wersja drukowałaby informacje debuggera do strumienia HTML.W związku z tym powstają dwa problemy.Po pierwsze, jeśli pisane przez ciebie rozszerzenie chce ustawiać nagłówki, musi to robić przed wy­słaniem czegokolwiek (włącznie z informacjami debuggera).Po drugie, co zrobić, jeśli rozszerzenie zapisuje coś innego niż plik HTML (na przykład plik GIF)?Na koniec, prawdopodobnie dobrym pomysłem byłoby ograniczenie zdalnemu użyt­kownikowi możliwości tworzenia serwerów ActiveX na Twoim komputerze.Oczywiście, ryzyko jest minimalne, ponieważ serwer ActiveX musiałby mieć punkt wejścia, który oczekiwałby pojedynczego obiektu.Nie byłoby jednak trudno sprawić, aby CBISAPI odczytywał plik konfiguracyjny na serwerze, definiujący nazwy symboliczne serwerów ActiveX.Jeśli w żądaniu zostałaby podana nazwa nie występująca na liście, CBISPAI odrzucałby polecenie.Tradycyjny ISAPI MFCBardziej tradycyjne rozszerzenie ISAPI MFC znajdziesz na listingu 9.8.Możesz łatwo wygenerować program tego typu, używając kreatora MFC ISAPI Wizard (rys.9.3).Ten kreator tworzy DLL-a zawierającego funkcje, które mogą być wywołane przez formularz lub dokument HTML.MFC automatyzuje cały proces, do wydzielania zmiennych z danych używając mapy parsera.Ta mapa wygląda podobnie jak mapa komunikatów lub mapa danych, lecz ClassWizard jej nie obsługuje.W związku z tym, pozycje mapy parsera musisz dodawać samodzielnie.Listing 9.8.Rozszerzenie ISAPI stworzone w oparciu o MFC// ISAPIMFC.CPP - Implementation file for your Internet Server// Example Form Extension#include "stdafx.h"#include "isapimfc.h"///////////////////////////////////////////////////////////////////////// The one and only CWinApp object// NOTE: You may remove this object if you alter your project to no// longer use MFC in a DLL.CWinApp theApp;///////////////////////////////////////////////////////////////////////// command-parsing mapBEGIN_PARSE_MAP(CExtension, CHttpServer)// TODO: insert your ON_PARSE_COMMAND() and// ON_PARSE_COMMAND_PARAMS() here to hook up your commands.// For example:ON_PARSE_COMMAND(Default, CExtension, ITS_EMPTY)ON_PARSE_COMMAND(Greet,CExtension,ITS_PSTR)ON_PARSE_COMMAND_PARAMS("name=~")DEFAULT_PARSE_COMMAND(Default, CExtension)END_PARSE_MAP(CExtension)///////////////////////////////////////////////////////////////////////// The one and only CExtension objectCExtension theExtension;///////////////////////////////////////////////////////////////////////// CExtension implementationCExtension::CExtension(){}CExtension::~CExtension(){}BOOL CExtension::GetExtensionVersion(HSE_VERSION_INFO* pVer){// Call default implementation for initializationCHttpServer::GetExtensionVersion(pVer);// Load description stringTCHAR sz[HSE_MAX_EXT_DLL_NAME_LEN+1];ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),IDS_SERVER, sz, HSE_MAX_EXT_DLL_NAME_LEN));_tcscpy(pVer->lpszExtensionDesc, sz);return TRUE;}///////////////////////////////////////////////////////////////////////// CExtension command handlersvoid CExtension::Default(CHttpServerContext* pCtxt){StartContent(pCtxt);WriteTitle(pCtxt);*pCtxt ExternalAddRef();Zwróć uwagę na użycie X w nazwie klasy (tak jak w XII) w deklaracji funkcji i brak użycia X w makrze METHOD_PROLOGUE (gdzie użyto po prostu II).To makro pozwala na dostęp do zewnętrznej klasy (myobject) przy pomocy predefmiowanego wskaźnika pThis.Zagnieżdżonych klas nie pisze się bezpośrednio.Zamiast tego w pliku nagłówkowym używa się makr BEGIN_INTERFACE_PART oraz END_INTERFACE_PART.Używając tych makr powinieneś pominąć X w nazwach zagnieżdżonych klas.Pomiędzy tymi dwoma makrami powinny znaleźć się nazwy funkcji udostępnianych przez interfejs (nazwy trójki funkcji interfejsu lUnknown - AddRef, Release i Querylnterface - po­jawiają się automatycznie, gdy użyjesz tych makr).Definicja obiektu myobject mogłaby wyglądać następująco:class myobject : public CCmdTarget{DECLARE_DYNCREATE(myobject,CCmdTarget); // fabryka klasDECLARE_OLECREATE(myobject); myobject(); DECLARE_MESSAGE_MAP() BEGIN_INTERFACE_PART(myobject,II)STDMETHOD (f 1) ( ) ,-END_INTERFACE_PART(II) BEGIN_INTERFACE_PART(myobject,12)STDMETHOD (f2)(); END_INTERFACE_PART(12)MFC wspiera OLE głównie przy pomocy makr (takich jak BEGIN_INTERFACE_ PART).Oto najważniejsze z nich:· DECLARE_INTERFACE_MAP - To makro pojawia się w pliku nagłów­kowym twojej klasy.Tworzy mapę interfejsu, która wyznacza zagnieżdżone klasy odnoszące się do konkretnego interfejsu COM.· BEGIN_INTERFACE_MAP - To makro tworzy mapę interfejsu w pliku CPP klasy.· INTERFACE_PART - Użyj tego makra po makrze BEGIN_INTERFACE_ MAP w celu zdefiniowania konkretnych pozycji mapy.Makro wymaga podania trzech argumentów: nazwy głównej klasy, identyfikatora IID interfejsu oraz nazwy zagnieżdżonej klasy (bez początkowej litery X).· END_INTERFACE_MAP - To makro kończy mapę interfejsu.· DECLARE_OLECREATE - Użyj tego makra w swoim pliku nagłówkowym w celu zadeklarowania fabryki klas.· IMPLEMENT_OŁECREATE - To makro dopełnia makro DECLARE_ OLECREATE, ale występuje w pliku CPP.Wymaga podania nazwy klasy, nazwy zewnętrznej oraz identyfikatora CLSID obiektu.· STDMETHOD - Deklaruje funkcję interfejsu COM zwracającą wartość HRESULT.· STDMETHODIMP - Używane do zaimplementowania funkcji COM zwra­cającej wartość HRESULT.· STDMETHOD_ - Deklaruje funkcję interfejsu COM zwracającą wartość innego typu niż HRESULT.· STDMETHODIMP_ - Używane do zaimplementowania funkcji COM zwracającej wartość innego typu niż HRESULT.Przykład użycia tego makra znajdziesz zaglądając do kodu funkcji AddRef w sekcji “Wsparcie COM w MFC."· METHOD_PROLOGUE - To makro pojawia się w funkcjach składowych zagnieżdżonych klas implementujących każdy z interfejsów.Tworzy zmienną, pThis, będącą wskaźnikiem do głównej klasy [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvs.xlx.pl