Introduction
This article presents a way to build HTML pages in ISAPI using OLE DB database access. The sample database is an Access database.
Functionality
When you open the page in a client browser (WriteLayout.dll in the URL), the default page is opened:
Here are 2 links, WritePageDB2Web
and WritePageDemo
. Both links load the same HTML page.
The first link loads the page using dynamic data from an Access database and piece of data from HTML resource. The second link loads the page using an HTML string
resource. The advantages are clear: the entire HTML page will be fastest loaded because the only dynamic data will be coming from the Database using the CAdoDatabase
and CAdoRecordset
classes. Large HTML parts of the page are hard coded in resource strings and will be loaded only on the first call.
Developing the pieces of HTML code inside of Visual Studio project are very easy. The HTML string
resources from a C++ project will be linked exactly to the correspondent external files. If you will work with Macromedia or InterDev on that HTML's files, just recompile the C++ project and the changes will be updated !
To link the external HTML files to HTML resources strings, follow these steps:
Open the Resource tab of the project. Right click inside this tab and choose Import, like in the picture.
After the previous step, you will see the Import Resource control dialog. Choose an appropriate directory for your project directory where you work on those HTML files. In this example, we have the C++ project under the /MFC/WriteForm and the HTML hard coded files under /MFC/Web/HTML.
After this step, we will obtain a new tag in our resources, called HTML.
Under that tag, we will see the new added HTML file with a resource ID such as IDR_HTML1
. Right click on IDR_HTML1
, click properties and change the ID to your custom name (like in the picture). It is very important to change the properties the FileName
location and check the ExternalFile
(see the picture). In that way, your resource inside the c
project will be linked exactly to the external file ("..\web\HTML\Form.html").
You now have the HTML file in your C++ project! To see it, just double click the imported resource.
Double click the resource in the right panel to open the HTML file with syntax coloring. Right click on the right panel to obtain an option with browser preview of that resource HTML file.
Using the HTML Resources in Your Project
How do you use these string
resources into your Visual Studio project? Just use the LoadLongResource
private
function:
BOOL CWriteLayoutExtension::LoadLongResource(CString& str, UINT nID)
{
HRSRC hRes;
HINSTANCE hInst = AfxGetResourceHandle();
BOOL bResult = FALSE;
hRes = FindResource(hInst, MAKEINTRESOURCE(nID), RT_HTML);
if (hRes == NULL)
ISAPITRACE1("Error: Resource %d could not be found\r\n", nID);
else
{
DWORD dwSize = SizeofResource(hInst, hRes);
if (dwSize == 0)
{ str.Empty();
bResult = TRUE;
}
else
{
LPTSTR pszStorage = str.GetBufferSetLength(dwSize);
HGLOBAL hGlob = LoadResource(hInst, hRes);
if (hGlob != NULL)
{
LPVOID lpData = LockResource(hGlob);
if (lpData != NULL)
{
memcpy(pszStorage, lpData, dwSize);
bResult = TRUE;
}
FreeResource(hGlob);
}
}
}
return bResult;
}
Coding
The WritePageDB2Web
method builds the entire page. The HTML page is constructed from 4 pieces of hard coded HTML data inter correlated with dynamic string
data.
The hard coded string
s are loaded from resources using the LoadLongResource
private
function.
LoadLongResource(strPagePart1, IDR_HTML_PAGE_PART1);
The dynamic HTML string
parts are loaded from the database using customized functions.
*pCtxt << strPagePart1 + GetArticlesFeature +
strPagePart2 + GetArticlesTopRated +
strPagePart3 + GetArticlesLast10 +
strPagePart4.
Outputting the mix of hardcoded and dynamic HTML to the page is done as follows:
*pCtxt << strPagePart1;
if ( ! GetArticlesFeature(AdoDB, &bstrOutput, &bstrError) )
{
*pCtxt << bstrError;
return;
}
*pCtxt << bstrOutput;
The dynamic data is built in private
functions using the CAdoRecordset
and CAdoDatabase
classes. The connection string
is hosted in the CWriteLayoutExtension
() constructor string. I chose an Access database for database support. It is possible to use a direct connection string
:
m_bstrConnectionString = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Projects\\DB\\Db2Isapi.mdb";
or a file connection string
(double click the udl file to link it to access DB):
m_bstrConnectionString = L"File Name=C:\\DataLinks\\ConnectionArticleDB2Isapi.udl";
The database is accessed very easily:
_bstr_t bstrSTMT(L"SELECT * from tblArticles where type=1");
MACRO_BEGIN
_bstr_t bstrValue_link, bstrValue_title,
bstrValue_author, bstrValue_headline;
while ( !AdoRS->IsEof() )
{
AdoRS->GetFieldValue("link", &bstrValue_link );
AdoRS->GetFieldValue("title", &bstrValue_title );
AdoRS->GetFieldValue("author", &bstrValue_author );
AdoRS->GetFieldValue("headline",&bstrValue_headline );
wsprintf(wcOut, "TR"\
"TD width=100%% FONT class=links size=1 A href=%s %s/A BR "\
"by B%s/B BR"\
"FONT color=black%s/FONT"\
"/TD"\
"/TR",
(LPCTSTR)bstrValue_link, (LPCTSTR)bstrValue_title,
(LPCTSTR)bstrValue_author, (LPCTSTR)bstrValue_headline
);
AdoRS->MoveNext();
*bstrOutput = (LPCTSTR)wcOut;
}
MACRO_END
To Install
- Copy the folder Web under your web site.
- Provide "Scripts and Executables" Execute Permission to the Web application. This will allow the IIS web server to execute the WriteLayout.dll.
License
This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.
A list of licenses authors might use can be found here.