Как написать надстройку Excel C, которая возвращает строку в Excel без утечки памяти?

Я пишу надстройку 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 как статическую переменную, но я не знаю, как ее инициализировать.

Все предложения приветствуются.

Лучший

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;
}
2

Другие решения

Вы можете попытаться объявить статический массив и вернуть его адрес

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 внутри функции, потому что у нее будет хранилище стека, которое будет очищено, когда функция вернется

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector