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