io devo realizzare una dll che gestisca un DB, creando una pagina html, allora io creo una classe ManDB
#if !defined(AFX_MANDB_H__1AB2A1A3_80A0_4A2A_B26C_71B4 96FB3D2D__INCLUDED_)
#define AFX_MANDB_H__1AB2A1A3_80A0_4A2A_B26C_71B496FB3D2D_ _INCLUDED_
#include "resource.h"
class CManDBExtension : public CHttpServer
{
public:
CManDBExtension();
~CManDBExtension();
public:
virtual BOOL GetExtensionVersion(HSE_VERSION_INFO* pVer);
virtual BOOL TerminateExtension(DWORD dwFlags);
void Default(CHttpServerContext* pCtxt);
DECLARE_PARSE_MAP()
BOOL recInsert();
void dbRead(CHttpServerContext*, EXTENSION_CONTROL_BLOCK *);
void dbRDDelete(CHttpServerContext*, EXTENSION_CONTROL_BLOCK *);
void dbRDUpdate(CHttpServerContext*, EXTENSION_CONTROL_BLOCK *);
BOOL recDelete();
BOOL recUpdate();
};
#endif // !defined(AFX_MANDB_H__1AB2A1A3_80A0_4A2A_B26C_71B4 96FB3D2D__INCLUDED)
questa viene definita nel file mandb.cpp
#include "stdafx.h"
#include "ManDB.h"
#import "c:\programmi\file comuni\system\ado\msado15.dll" no_namespace rename("EOF", "EndOfFile")
VOID OutputString(EXTENSION_CONTROL_BLOCK *pECB, LPCSTR szBuffer);
CWinApp theApp;
const PCSTR Conn = "dsn=caio;uid=;pwd=;";
BEGIN_PARSE_MAP(CManDBExtension, CHttpServer)
ON_PARSE_COMMAND(Default, CManDBExtension, ITS_EMPTY)
ON_PARSE_COMMAND(dbRead, CManDBExtension, ITS_EMPTY)
ON_PARSE_COMMAND(dbRDDelete, CManDBExtension, ITS_EMPTY)
ON_PARSE_COMMAND(dbRDUpdate, CManDBExtension, ITS_EMPTY)
ON_PARSE_COMMAND(recInsert, CManDBExtension, ITS_EMPTY)
ON_PARSE_COMMAND(recDelete, CManDBExtension, ITS_I4)
ON_PARSE_COMMAND(recUpdate, CManDBExtension, ITS_I4)
DEFAULT_PARSE_COMMAND(Default, CManDBExtension)
DEFAULT_PARSE_COMMAND(dbRead, CManDBExtension)
DEFAULT_PARSE_COMMAND(dbRDDelete, CManDBExtension)
DEFAULT_PARSE_COMMAND(dbRDUpdate, CManDBExtension)
DEFAULT_PARSE_COMMAND(recInsert, CManDBExtension)
DEFAULT_PARSE_COMMAND(recDelete, CManDBExtension)
DEFAULT_PARSE_COMMAND(recUpdate, CManDBExtension)*/
END_PARSE_MAP(CManDBExtension)
CManDBExtension theExtension;
CManDBExtension::CManDBExtension()
{
}
CManDBExtension::~CManDBExtension()
{
}
BOOL CManDBExtension::GetExtensionVersion(HSE_VERSION_I NFO* pVer)
{
// Call default implementation for initialization
CHttpServer::GetExtensionVersion(pVer);
// Load description string
TCHAR 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;
}
BOOL CManDBExtension::TerminateExtension(DWORD dwFlags)
{
// extension is being terminated
//TODO: Clean up any per-instance resources
return TRUE;
}
void CManDBExtension:efault(CHttpServerContext* pCtxt)
{
StartContent(pCtxt);
WriteTitle(pCtxt);
*pCtxt << _T("This default message was produced by the Internet");
*pCtxt << _T(" Server DLL Wizard. Edit your CManDBExtension:efault()");
*pCtxt << _T(" implementation to change it.\r\n");
EndContent(pCtxt);
}
VOID OutputString(EXTENSION_CONTROL_BLOCK *pECB, LPCSTR szBuffer)
{
DWORD dwBuffer = strlen(szBuffer);
pECB->WriteClient(pECB->ConnID, (PVOID) szBuffer, &dwBuffer, 0);
}
/*
BOOL CManDBExtension::recInsert()
{
}*/
/*
Funzione per la lettura di un Database Generico
SE Layout = 'D'
ALLORA lettura di default
ALTRIMENTI
SE Layout='E'
ALLORA lettura con aggiunta di un link ke chiami metodo di delete
ALTRIMENTI
SE Layout='U'
ALLORA lettura con aggiunta di un link che chiami metodo Update
*/
void CManDBExtension::dbRead(CHttpServerContext* pCtxt, EXTENSION_CONTROL_BLOCK *pECB)
{
_RecordsetPtr rs = NULL;
rs.CreateInstance("ADODB.Recordset.1.5");
char sql[]="SELECT * FROM schedario;";
rs->Open(sql, Conn, adOpenForwardOnly, adLockReadOnly, adCmdTable);
/*
if rs==NULL
OutputString(pECB, "<h1>ERROR not open recordset</h1>");
*/
long NumField=rs->Fields->Count;
FieldPtr *rgflds = new FieldPtr[NumField];
for (long i = 0; i < NumField; i++)
rgflds[i] = rs->Fields->GetItem(i);
StartContent(pCtxt);
OutputString(pECB, "<TITLE>Lettura di un DB</TITLE>");
OutputString(pECB, "<BODY>");
//creazione tabella
OutputString(pECB, "<TABLE>");
//creazione testata Tabella
OutputString(pECB, "<TR>");
for (i=0; i<NumField;i++)
{
OutputString(pECB, "<TH>");
OutputString(pECB, (PCSTR)(_bstr_t)rgflds[i]->Name);
OutputString(pECB, "</TH>");
}
OutputString(pECB, "</TR>");
//aggiunta della tabella con tutti i dati
while (VARIANT_FALSE == rs->EndOfFile)
{
OutputString(pECB, "<TR>");
for (i=0; i<NumField; i++)
OutputString(pECB, "<TD>Autore</TD>");
OutputString(pECB, "</TR>");
rs->MoveNext();
}
OutputString(pECB, "</TABLE>");
OutputString(pECB, "</BODY>");
EndContent(pCtxt);
}
/*
BOOL CManDBExtension::recDelete()
{
}
BOOL CManDBExtension::recUpdate()
{
}*/
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CManDBExtension, CHttpServer)
//{{AFX_MSG_MAP(CManDBExtension)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif
questo in teoria dovrebbe funzionare, ma nn mi crea la pagina
il sistema funziona così
mandb.dll?<nome_funzione>, digitando il nome della funzione il server esegue la funzione e ritorna una pagina HTML, ad esempio se nella dll viene chiamata la dbRead, la teoria vuole che venga visualizzata una tabella che contenga i dati presenti nel DB specificato.