Implementierung der CtrlExtension
Die CTRLExtension besteht aus einer Klasse, die von BaseExternHdl abgeleitet wird, und einer Funktion mit dem Namen newExternHdl.
Implementierung einer ADO-Schnittstelle
class ADOExternHdl : public BaseExternHdl
{
public:
ADOExternHdl(BaseExternHdl *nextHdl,
PVSSulong funcCount,
FunctionListRec fnList[]): BaseExternHdl(nextHdl, funcCount, fnList) {}
virtual const Variable *execute(ExecuteParamRec ¶m);
protected:
private:
};
CTRL_EXTENSION(ADOExternHdl, fnList)
Die Funktion newExternHdl hat eine fixe Schnittstelle und muss exportiert werden, damit sie vom WinCC OA Manager aufgerufen werden kann. Dies wird in einem Makro mit dem Schlüsselwort '_declspec(dllexport)' durchgeführt. Das Makro implementiert auch ein ADO-Beispiel.
Die Funktion newExternHdl muss ein Objekt der Klasse allocieren und den Pointer darauf zurückgeben.
Die vollständige Implementierung von newExternHdl für das ADO-Beispiel
BaseExternHdl *newExternHdl(BaseExternHdl *nextHdl)
{
// simply fill this list with the prototype of each
//function you want to implement
static FunctionListRec fnList[] =
{
//Return-Value function name parameter list true ==
//thread-save
//----------------------------------------------------
{INTEGER_VAR, "dbOpenConnection", "(string conn, dbConnect& conn)", true},
{INTEGER_VAR, "dbCloseConnection", "(dbConnect conn)", true},
{INTEGER_VAR, "dbBeginTransaction", "(dbConnect conn)", true},
{INTEGER_VAR, "dbCommitTransaction", "(dbConnect conn)", true},
{INTEGER_VAR, "dbRollbackTransaction","(dbConnect conn)", true},
{INTEGER_VAR, "dbFinishCommand", "(dbCommand cmd)", true},
{INTEGER_VAR, "dbExecuteCommand", "(dbCommand cmd)", true},
{INTEGER_VAR, "dbCloseRecordset", "(dbRecordset rs)", true},
{BIT_VAR, "dbEOF", "(dbRecordset rs)", true},
{INTEGER_VAR, "dbMoveFirst", "(dbRecordset rs)", true},
{INTEGER_VAR, "dbMovePrevious", "(dbRecordset rs)", true},
{INTEGER_VAR, "dbMoveNext", "(dbRecordset rs)", true},
{INTEGER_VAR, "dbMoveLast", "(dbRecordset rs)", true},
{INTEGER_VAR, "dbMove", "(dbRecordset rs, long index)", true},
{INTEGER_VAR, "dbRequery", "(dbRecordset rs)", true},
{INTEGER_VAR, "dbAddNew", "(dbRecordset rs)", true},
{INTEGER_VAR, "dbDelete", "(dbRecordset rs)", true},
{INTEGER_VAR, "dbUpdate", "(dbRecordset rs)", true},
};
CTRL_EXTENSION(ADOExternHdl, fnList)
/* The macro also counts the number of the functions, you want to implement */
}