Introduction
This article shows how to create one ATL COM component using the WinInet functions, how to use it in ASP programs and how to test it from the Visual Basic client. It also shows how to use multithreading support in this component.
This component can be used in the same way in Visual Basic, Delphi, Access or Microsoft SQL.
Overview
This application uses ATL, MFC, ASP, Visual Basic and WinInet functions. The application have an ATL project who provide some HTTP functions. It will demonstrate how to use this component in your ASP and Visual Basic projects.
The article is based on the Uwe Keim's article �Calling scripts within scripts� � many thanks to him for his good idea. Of course you will ask what is new in my component. The reason that made me build this component was the variable time delay at a HTTP request.
My solution was an asynchronous retrieve, which give the user the possibilities to check more often whether the page is completed or not.
The article also contains a Visual Basic client who tests the functionality of the component.
I assume the reader knows or at least has a fair idea about COM programming using ATL.
Details
The component consists of two parts:
One standard WinInet retrieve module.
- Retrieve method.
Retrieve(BSTR newVal, BSTR *parOut)
- GetPage function.
bool GetPage(CString sURL, CString& sBody)
The Retrieve
method just calls the GetPage
function with the sURL
parameter. Inside the function, there are the calls to WinInet API:
HINTERNET internet=InternetOpen("Daemon", INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, NULL);
HINTERNET file_handle=InternetOpenUrl(internet, sURL, NULL, 0,
INTERNET_FLAG_RELOAD, 0);
InternetReadFile(file_handle, pagina, 100000, &bytes_read);
InternetCloseHandle(internet);
The
asp source code is very simple (full source code are in attachment file):
url="http://www.codeproject.com"
Set myORetrieve = CreateObject("RetrievePage.RetrievePage.1")
ret = myORetrieve.Retrieve(url)
Response.Write ret
One asynchronous retrieve module.
- RetrieveAsync method.
RetrieveAsync(BSTR newVal, BSTR *parOut)
- RetrieveAsyncCompleted method.
RetrieveAsyncCompleted(BSTR newVal, BSTR *parOut)
- RetrieveAsyncPage method.
RetrieveAsyncPage(BSTR newVal, BSTR *parOut)
- MyThreadGetPage function.
UINT MyThreadGetPage(LPVOID pParam)
The client must use first the RetrieveAsync
method with the desired URL parameter. This method launch one child thread that will retrieve the page in a separate thread. In this way the program will go to the next instruction and will not wait for the method to finish the request.
The program must implement one timer (or at the user's actions) who verify at some intervals if the RetrieveAsyncCompleted
method return true (the requested page was retrieved). Only then the RetrieveAsyncPage
method will provide the requested page.
While the RetrieveAsyncCompleted
method return false you could send to the console a message such as �Please wait. Data is loading��
AfxBeginThread( MyThreadGetPage , this, THREAD_PRIORITY_NORMAL )
pObject->m_MapStringToHTTPpage[sKey] = oHTTPpage;
m_MapStringToHTTPpage.Lookup(sURL, oHTTPpage)
The
Visual Basic source code is very simple (full source code are in attachment file, in RetrieveVBClient director):
str = myORetrieve.RetrieveAsync(URL.Text)
lRetrieveAsyncCompleted = myORetrieve.RetrieveAsyncCompleted(URL.Text)
str = myORetrieve.RetrieveAsyncPage(URL.Text)
If you want to see how
to build an ATL component, take a look at the
Build an ATL Crypt component article.
Installation
- Copy the DLL into a directory with system execute privilege and register it with regsvr32 command or put it on the MTS. To put it on the MTS is better because if we want to modify the component and register it again, this is possible without restarting the computer � in case when using the regsvr32 command who �blocks� your dll file.
- Use directly the visual basic dialog console. Input some string on the URL edit box and click on the button!
- Copy the director with asp pages on the Web server � and just try it !