Additional Functions
The function names need to be added to the EXAMPLE.DEF file.
ReturnString
This function returns a text string.
This function take 2 parameters, both numbers.
Excel12f(xlfRegister, 0, 4,
(LPXLOPER12)&xDLL,
(LPXLOPER12)TempStr12(L"XL_ReturnString"),
(LPXLOPER12)TempStr12(L"UBB"),
(LPXLOPER12)TempStr12(L"XL_ReturnString"));
__declspec(dllexport) LPXLOPER12 WINAPI XL_ReturnString(double P, double T)
{
static XLOPER12 xResult;
xResult.xltype = xltypeStr;
xResult.val.str = L"\023BetterSolutions.com";
return(LPXLOPER12)&xResult;
}
ReturnArray
This function returns a (1 x 2) array containing two values.
This function has no parameters.
Excel12f(xlfRegister, 0, 4,
(LPXLOPER12)&xDLL,
(LPXLOPER12)TempStr12(L"XL_ReturnArray"),
(LPXLOPER12)TempStr12(L"Q"),
(LPXLOPER12)TempStr12(L"XL_ReturnArray"));
__declspec(dllexport) LPXLOPER12 WINAPI XL_ReturnArray(void)
{
static XLOPER12 xlArray; // not thread safe because it is static
XLOPER12 xlValues[2];
xlValues[0].xltype = xltypeNum;
xlValues[1].xltype = xltypeNum;
xlValues[0].val.num = 123;
xlValues[1].val.num = 456;
xlArray.xltype = xltypeMulti;
xlArray.val.array.rows = 1;
xlArray.val.array.columns = 2;
xlArray.val.array.lparray = &xlValues;
return (LPXLOPER12)&xlArray;
}
ReturnArrayDimensions
This function returns an array with a given size containing random numbers.
This function takes 2 parameters, to specify the number of rows and columns.
Excel12f(xlfRegister, 0, 4,
(LPXLOPER12)&xDLL,
(LPXLOPER12)TempStr12(L"XL_ReturnArrayDimensions"),
(LPXLOPER12)TempStr12(L"QJJ"),
(LPXLOPER12)TempStr12(L"XL_ReturnArrayDimensions"));
__declspec(dllexport) LPXLOPER12 WINAPI XL_ReturnArrayDimensions(int columns, int rows)
{
static XLOPER12 xlArray;
int totalcells;
totalcells = columns * rows;
LPXLOPER12 xlValues3 = (LPXLOPER12)malloc(totalcells * sizeof(XLOPER12));
if (xlValues3 != NULL){
for (int c = 0; c < totalcells; c++)
{
xlValues3[c].xltype = xltypeNum;
xlValues3[c].val.num = rand(); // built-in C function
}
// Free the memory
//free(xlValues3);
//xlValues2 = NULL; // optional but recommended to avoid dangling pointer
xlArray.xltype = xltypeMulti;
xlArray.val.array.columns = columns;
xlArray.val.array.rows = rows;
xlArray.val.array.lparray = xlValues3;
}
return (LPXLOPER12)&xlArray;
From the Book
Page 124
The xlAutoFree12 function is an XLL interface function that will be automatically called to release memory.
This function will be called automatically when functions return pointers back to Excel.
Assume all string elements were allocated using malloc, and need to be freed using free. Then free the array itself.
__declspec(dllexport) void WINAPI xlAutoFree12(LPXLOPER12 pxFree)
{
if(pxFree->xltype & xltypeMulti)
{
int size = pxFree->val.array.rows * pxFree->val.array.columns;
LPXLOPER12 p = pxFree->val.array.lparray;
for(; size-- > 0; p++) // check elements for strings
{
if((p->xltype & ~(xlbitDLLFree | xlbitXLFree)) == xltypeStr)
{
if(p->xltype & xlbitDLLFree)
{
free(p->val.str);
}
else if(p->xltype & xlbitXLFree)
{
Excel12(xlFree, 0, 1, p);
}
}
}
free(pxFree->val.array.lparray);
}
else if(pxFree->xltype == (xltypeStr | xlbitDLLFree))
{
free(pxFree->val.str);
}
else if(pxFree->xltype == (xltypeRef | xlbitDLLFree))
{
free(pxFree->val.mref.lpmref);
}
// Assume pxFree was itself dynamically allocated using malloc.
free(pxFree);
}
© 2025 Better Solutions Limited. All Rights Reserved. © 2025 Better Solutions Limited TopPrevNext