xpfCppPluginInvoke
FUNCTION xpfCppPluginInvoke (DllPath : STRING; DllName : STRING; FunctionName : STRING; Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10 : GENERIC; Arg11,Arg12,Arg13,Arg14,Arg15,Arg16,Arg17,Arg18,Arg19,Arg20 : GENERIC; Arg21,Arg22,Arg23,Arg24,Arg25,Arg26,Arg27,Arg28,Arg29,Arg30 : GENERIC) Result : GENERIC;
This function invokes a C++ method implemented in a .dll/.so file. The C++ plugin MUST contain the four methods:
- extern "C" EDMLONG DLL_EXPORT dll_main(char *methodName, tSdaiSelect *inputParameters, EDMINT nOfParameters, tSdaiSelect *returnValue)
- extern "C" EDMLONG DLL_EXPORT dll_version()
- extern "C" void DLL_EXPORT *dll_malloc(void *threadObject, EDMLONG bufSize)
- extern "C" EDMLONG DLL_EXPORT dll_freeAll(void *threadObject)
Arguments
Type | Name | Comment |
STRING | DllPath | Specifies the file path for the .dll/.so file relative to the default folder of the EDM application server. |
STRING | DllName | Specifies the name of the .dll/.so file. |
STRING | FunctionName | The name of the function in the dll |
GENERIC | Arg1 - Arg30 | Optional, input parameters to the C++ method. |
Return Value
Type | Name | Comment |
GENERIC | activatedModelId | returned value from the C++ method |
Example
Calling the QEX methods
-- ------------------------------------------------------------------------ -- Author : Olav Liestøl, EPM Technology A/S -- Description : Test -- ------------------------------------------------------------------------ QUERY_SCHEMA test_cpp_plugin FOR ap209_multidisciplinary_analysis_and_design_mim_lf; GLOBAL DECLARE src INSTANCE OF ap209_multidisciplinary_analysis_and_design_mim_lf; END_GLOBAL; VIEW_ENTITY result_value; elementId: STRING; varableName: STRING; fieldVarId: INTEGER; END_VIEW_ENTITY; VIEW_ENTITY query_results; status: STRING; variable_values : LIST OF result_value; END_VIEW_ENTITY; VIEW_ENTITY variable_def; selectName: STRING; variableName: STRING; END_VIEW_ENTITY; VIEW_ENTITY variable_definitions; status: STRING; definitions : LIST OF variable_def; END_VIEW_ENTITY; QUERY_FUNCTION GetFemResults (repositoryName, modelName, loadCase : STRING; variables : LIST OF STRING) : STRING; LOCAL vars : LIST OF INTEGER; rk : STRING; result : query_results; END_LOCAL; vars ++ 29; vars ++ 30; vars ++ 31; vars ++ 32; result := xpfCppPluginInvoke('AP209queriesBin', 'AP209qexQueries.dll', 'getFemResults', 'InitialRepository', 'AP209_2', vars, vars, '*', 0, 10); Return (result.status); END_QUERY_FUNCTION; QUERY_FUNCTION GetVariableDefinitions : LIST OF STRING; LOCAL result : variable_definitions; output : LIST OF STRING; o : STRING; END_LOCAL; result := xpfCppPluginInvoke('AP209queriesBin', 'AP209qexQueries.dll', 'getVariableDefinitions'); REPEAT i:=1 TO xpfSizeOf(result.definitions); o := result.definitions[i].variableName; output ++ o; END_REPEAT; Return (output); END_QUERY_FUNCTION; END_QUERY_SCHEMA;
Calling the C++ plugins
#include "stdafx.h" #include "AP209queries.h" #include "AP209qexQueries.h" /*===================================================================================================================*/ AP209qexQueries::AP209qexQueries(Database *_db, Repository *_rep, AP209model *_m) /*===================================================================================================================*/ { dllMa = new CMemoryAllocator(0x100000); resultMa = NULL; db = _db; rep = _rep; m = _m; } /*===================================================================================================================*/ AP209qexQueries::~AP209qexQueries() /*===================================================================================================================*/ { if (resultMa) delete resultMa; delete dllMa; } /*===================================================================================================================*/ void AP209qexQueries::openModel(char *repName, char *modelName) /*===================================================================================================================*/ { rep->init(db, repName); m->open(modelName, sdaiRO); } /*===================================================================================================================*/ EDMLONG AP209qexQueries::getFemResults(char *rep, char *model, char *parameterString, SdaiAggr variableIds, tSdaiSelect *returnValue, int maxNoOfResultsReturned, int firstResultReturned) /*===================================================================================================================*/ { EdmiError rstat = OK; Container<EDMULONG> varTypes(m->getMemoryAllocator()); InstanceId resId, qresId; SdaiAggr vvAggrId; ADB myADB; openModel(rep, model); AP209queries query(m); Iterator<EDMULONG, ap209::entityType> varTypeIter(variableIds, m); for (EDMULONG var=varTypeIter.first(); varTypeIter.moreElems(); var=varTypeIter.next()) { varTypes.add(var); } Container<femResult> *results = query.getResults(parameterString, &varTypes, maxNoOfResultsReturned, firstResultReturned) ; CHECK(vmCreateInstanceBN ("ap209_multidisciplinary_analysis_and_design_mim_lf", "test_cpp_plugin", "query_results", &qresId)); myADB.type = sdaiSTRING; myADB.value.stringVal = "OK"; myADB.value_set = true; CHECK(vmPutAttrBN(qresId, "status", &myADB)); returnValue->type = sdaiINSTANCE; returnValue->value.instVal = qresId; returnValue->nTypes = 0; CHECK(vmCreateAggrBN (qresId, "variable_values", &vvAggrId)); for (femResult *res = results->firstp(); res; res = results->nextp()) { CHECK(vmCreateInstanceBN ("ap209_multidisciplinary_analysis_and_design_mim_lf", "test_cpp_plugin", "result_value", &resId)); myADB.type = sdaiINSTANCE; myADB.value.instVal = resId; myADB.value_set = true; CHECK(vmAddToAggr(vvAggrId, &myADB)); } return rstat; } /*===================================================================================================================*/ EDMLONG AP209qexQueries::getVariableDefinitions(tSdaiSelect *returnValue) /*===================================================================================================================*/ { EdmiError rstat = OK; int nOfVars; AP209queries query(m); InstanceId vardefId, defsId; SdaiAggr defsAggrId; ADB myADB; FieldVariableDescriptor *fvDescriptors = query.getTheFieldVariableDescriptors(&nOfVars); CHECK(vmCreateInstanceBN ("ap209_multidisciplinary_analysis_and_design_mim_lf", "test_cpp_plugin", "variable_definitions", &defsId)); myADB.type = sdaiSTRING; myADB.value.stringVal = "OK"; myADB.value_set = true; CHECK(vmPutAttrBN(defsId, "status", &myADB)); returnValue->type = sdaiINSTANCE; returnValue->value.instVal = defsId; returnValue->nTypes = 0; CHECK(vmCreateAggrBN (defsId, "definitions", &defsAggrId)); for (int i=0; i < nOfVars; i++) { CHECK(vmCreateInstanceBN ("ap209_multidisciplinary_analysis_and_design_mim_lf", "test_cpp_plugin", "variable_def", &vardefId)); myADB.type = sdaiINSTANCE; myADB.value.instVal = vardefId; myADB.value_set = true; CHECK(vmAddToAggr(defsAggrId, &myADB)); myADB.type = sdaiSTRING; myADB.value.stringVal = fvDescriptors[i].selectName; CHECK(vmPutAttrBN(vardefId, "selectName", &myADB)); myADB.value.stringVal = fvDescriptors[i].variableName; CHECK(vmPutAttrBN(vardefId, "variableName", &myADB)); } return rstat; } /*================================================================================================*/ void myExceptionHandler(EDMLONG errcode, char *message, char *file, int lineNo) /*================================================================================================*/ { throw new CedmError(errcode,message,file, lineNo); } /*===================================================================================================================*/ extern "C" EDMLONG DLL_EXPORT dll_main(char *methodName, tSdaiSelect *inputParameters, EDMINT nOfParameters, tSdaiSelect *returnValue) /*===================================================================================================================*/ { EdmiError rstat = OK; try { defineExceptionHandler(&myExceptionHandler); CMemoryAllocator the_ma(0x100000); Database the_db("", "", ""); Repository the_rep(&the_db, ""); AP209model the_model(&the_ma, &the_rep);elementelement AP209qexQueries queryEngine(&the_db, &the_rep, &the_model); if (strEQL(methodName, "getFemResults")) { rstat = queryEngine.getFemResults(inputParameters[0].value.stringVal, inputParameters[1].value.stringVal, inputParameters[4].value.stringVal, inputParameters[2].value.aggrVal, returnValue, inputParameters[4].value.intVal, inputParameters[5].value.intVal); } else if (strEQL(methodName, "getVariableDefinitions")) { rstat = queryEngine.getVariableDefinitions(returnValue); } } catch (CedmError *e) { rstat = e->rstat; delete e; } catch (...) { rstat = sdaiESYSTEM; } return rstat; } extern "C" EDMLONG DLL_EXPORT dll_version() { return 1; } extern "C" void DLL_EXPORT *dll_malloc(void *threadObject, EDMLONG bufSize) { AP209qexQueries *plugin = (AP209qexQueries*)threadObject; if (plugin) { return plugin->alloc(bufSize); } else { return NULL; } } extern "C" EDMLONG DLL_EXPORT dll_freeAll(void *threadObject) { AP209qexQueries *plugin = (AP209qexQueries*)threadObject; delete plugin; return OK; }
See also
Filter by label
There are no items with the selected labels at this time.