如何编写一个Excel C加载项函数,在不泄漏内存的情况下向Excel返回字符串

How to write a Excel C add-in function that return a string to Excel without memory leak?

本文关键字:Excel 泄漏 内存 字符串 返回 情况下 函数 何编写 加载项 一个      更新时间:2023-10-16

我正在使用C++编写一个Excel XLL插件,我希望我的函数使用预定义的XLOPER12将字符串返回到Excel。

据我所知,Excel要求函数返回一个指向内存的指针,然后它制作一个浅拷贝,然后在不清除函数中分配的内存的情况下离开。所以如果我写这样的东西:

extern "C" LPXLOPER12 WINAPI strgen() {
    XLOPER12 res;
    res.xltype = xltypeString;
    res.val.str = (XCHAR*)malloc(2*sizeof(XCHAR));
    res.val.str[0] = (XCHAR)1;
    res.val.str[1] = L"X";
    return (LPXLOPER12)&xRes;
}

但显然这会导致内存泄漏。有人建议我可以将res声明为静态变量,但我真的不知道如何初始化它

欢迎所有建议。

最佳

省去一些麻烦并使用https://xll.codeplex.com.注册和定义功能的完整代码是

static AddIn12 xai_strgen(
    L"?strgen", L"STRGEN",
    XLL_LPOPER12, L"");
LPOPER12 WINAPI strgen() 
{
#pragma XLLEXPORT
    static XLOPER12 xRes(L"X");
    return &xRes;
}

您可以尝试声明静态数组并返回其地址

XCHAR s_res[3] = {0};
XLOPER12 res;
extern "C" LPXLOPER12 WINAPI strgen() {

res.xltype = xltypeString;
res.val.str = (XCHAR*)s_res;
res.val.str[0] = (XCHAR)1;
res.val.str[1] = L"X";
return (LPXLOPER12)&res;
}

请注意,您不应该在函数内移动s_res,因为它将有一个堆栈存储,当函数返回

时,该存储将被清除