2

我正在使用 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 声明为静态变量,但我真的不知道如何初始化它。

欢迎所有建议。

最好的

4

2 回答 2

2

为自己省点麻烦并使用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;
}
于 2013-07-09T03:49:58.370 回答
0

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

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在函数内部移动,因为它会有一个堆栈存储,当函数返回时将被清除

于 2013-02-04T03:53:15.653 回答