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 に答える