Я пишу надстройку Excel XLL, используя C ++, где я хочу, чтобы моя функция возвращала строку в Excel, используя предопределенный XLOPER12.
Как я понял, в 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
внутри функции, потому что у нее будет хранилище стека, которое будет очищено, когда функция вернется