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 &param);
  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 */
}