/**************************************************************************** File: SampDll.c Contains a simple example DLL to illustrate how DLLs are called from the CeSk programming lanaguage *******************************************************************************/ #include "windows.h" #include "windacts.h" #include "sampdll.h" long GetVarSize( union varObj FAR *); void process1array(double FAR *,union varObj FAR *); /* Main entry point for the library - all libraries have this entry point */ /* Input: See Programmers Reference manual for details */ int FAR PASCAL LibMain(hModule, wDataSeg, cbHeapSize, lpszCmdLine) HANDLE hModule; WORD wDataSeg; WORD cbHeapSize; LPSTR lpszCmdLine; { return 1; } /* Main exit routine for a DLL, tidies up any resources etc from DLL */ /* See Programmers reference manual for details and parameters */ int FAR PASCAL WEP (bSystemExit) int bSystemExit; { return(1); } /**************************** Our DLL Code *******************************/ /* our example function for the DLL call, this function has been exported */ /* in the SAMPDLL.DEF file */ /* Input: hData - a handle to a global memory object containing a CeSk data */ /* array */ /* Output: a HGLOBAL containing a CeSk double*/ /* This example adds up all the positive numbers to give a total and */ /* ignores any negative numbers, or non-numeric objects in the input array */ HGLOBAL FAR PASCAL sumofpos(hData) HGLOBAL hData; { DataObj FAR *op1; double total; HGLOBAL result; total=0e0; if (hData) { op1=PtrContent(hData); process1array(&total,op1); GlobalUnlock(hData); }; /* now package the result as a CeSk double */ result=GlobalAlloc(GHND,sizeof(struct t_double)); if (!result) return NULL; op1=(union varObj FAR *)GlobalLock(result); op1->tdouble.vtype=3; /* type double */ op1->tdouble.value=total; GlobalUnlock(result); return result; }; /****************** subsidiary routines used by this DLL *****************/ /* process one CeSk item in the array, this is a reentrant routine */ /* which processes an element, or an array of elements, adding the */ /* positive numbers together and ignoring the rest */ /* Input: ptotal - ptr to the current total */ /* op1 - ptr to the item to process */ /* Output: adjusts the value pointed to by ptotal */ void process1array(ptotal,op1) double FAR *ptotal; union varObj FAR *op1; { short elements,i; double val; if (op1->tint.vtype==11) { /* process an array */ elements=op1->tarray.elements; op1=(union varObj FAR *)(op1->tarray.value); for (i=0; itint.vtype) { case 2: /* CeSk Float */ val=(double)(op1->tfloat.value); break; case 3: /* CeSk double */ val=op1->tdouble.value; break; case 1: /* CeSk integer */ val=(double)(op1->tint.value); break; case 9: /* CeSk Complex Number */ val=op1->tcomplex.realpart; break; default: val=0e0; break; }; if (val>0e0) *ptotal+=val; }; };