Hi Mark, many thanks for your help. I tried your code in my program and it worked.
I would like to understand what the code is doing and I have some questions to it. > Are you passing in these values, or are they being returned? To me the > depth of the pointer references implies numVars, varNames, and varTypes > are out parameters. I'll assume that for now. If they are in/out > parameters let me know. Your exactly right: the parameters numVars, varNames and VarTypes are out paramters. > I mocked up a DLL to test returning values of these types. I used VS2008 > and compiled with "cl /LD func.c": > > --- func.c ------------------------------- > #include <stdlib.h> > #define FUNCDLL > #include "func.h" > > static char* g_data[] = {"one","two","three"}; > static int g_types[] = {1,2,3}; > > FUNCAPI int func (int handle, int *numVars, char ***varNames, int > **varTypes) > { > *numVars = _countof(g_data); > *varNames = g_data; > *varTypes = g_types; > return handle + 1; > } What does the signature FUNCAPI do in this context? > > > --- func.h ------------------------------- > #ifdef FUNCDLL > # define FUNCAPI __declspec(dllexport) > #else > # define FUNCAPI __declspec(dllimport) > #endif > > FUNCAPI int func (int handle, int *numVars, char ***varNames, int > **varTypes); > Do I need to wrap the compiled DLL file this way? I can load the DLL with the CDLL method, make calls to simple functions, e.g. no parameters, returning stirng and get the right values. I added all the code from your func.py module to the code I already had. And -- it works fine and delivers the expected results. > --- func.py ------------------------------- ... cut ... > > # int func (int handle, int *numVars, char ***varNames, int **varTypes) > func = c.CDLL('func').func > func.restype = INT > func.argtypes = [INT,PINT,PPPCHAR,PPINT] I added this part to my program. > # allocate storage for the out parameters > numVars = INT() > varNames = PPCHAR() > varTypes = PINT() I added this part also. > print func(5,c.byref(numVars),c.byref(varNames),c.byref(varTypes)) I called the library routine. > # numVars contains size of returned arrays. Recast to access. > varNamesArray = c.cast(varNames,c.POINTER(PCHAR * numVars.value)) > varTypesArray = c.cast(varTypes,c.POINTER(INT * numVars.value)) What does this cast? How do I know how I have to cast the objects returned from the library function? What kind of objects do I get? I learned that the values of objects created by the ctypes module are accessed using object.value? Best regards Georg -- http://mail.python.org/mailman/listinfo/python-list