参数帮助字符串在函数向导 (C++ XLL) 中丢失最后一个字符

Parameter help string loses last character in Function Wizard (C++ XLL)

我在注册我的 XLL 函数时遇到了一个有点奇怪的问题(尽管不是最终问题)。我像往常一样使用 xlfRegister 调用和参数列表,但有两个问题:

  1. 函数描述和参数帮助字符串都附加了一个句号(“.”);
  2. 我似乎丢失了最终帮助字符串中的最后一个(也许是最后两个)字符。

还有其他人遇到过这种情况吗? 我担心在构造临时字节计数字符串时会发生意外情况。现在这不是一个大问题,如果后来发现我没有正确传递字符串,它可能会产生一些意想不到的后果。我正在使用 64 位 Excel,并编译 64 位 xll(使用 /D“_MBCS”编译器标志)。我在后台使用 Excel4v() 调用与 LPXLOPER,而不是 Excel12v 与 LPXLOPER12s。

这是我的注册电话:

    Excel(xlfRegister, 0, 15, pDll,TempStr2("myUDF"),
       TempStr2("PCCPPP"),
       TempStr2("myUDF"),
       TempStr2("Param1,Param2,Param3,Param4,Param5"),
       TempStr2("1"),
       TempStr2("My UDF functions"),
       TempStr2(""), 
       TempStr2(""),
       TempStr2("Returns a secret"),
       TempStr2("Function Parameter 1"),
       TempStr2("Function Parameter 2"),
       TempStr2("Function Parameter 3"),
       TempStr2("Function Parameter 4"),
       TempStr2("Function Parameter 5"));

使用 TempStr2 函数(取自 SDK 中修改后的 framewrk.cpp)实现为:

LPXLOPER TempStr2(LPSTR lpstr)
{
    LPXLOPER lpx;

    lpx = (LPXLOPER)GetTempMemory(sizeof(XLOPER));

    int len = __min(255, lstrlen(lpstr));
    lpx->xltype = xltypeStr;
    lpx->val.str = GetTempMemory(len + 1);

    strncpy(lpx->val.str + 1, lpstr, len);
    lpx->val.str[0] = (BYTE)len;
    return lpx;
}

UDF 工作正常,但是很迂腐,函数向导中出现的是这样的:

前四个参数字符串附加了句点 (.),原始字符串中没有。没有太大的困难(这可能是设计使然……如果我在琴弦上加上自己的句号,则不会出现第二个句号)。如果我查看向导中的其他函数,所有参数帮助字符串似乎都以句号结尾,所以这可能是故意的。

最后一个字符串“Function Parameter 5”丢失了最后一个字符 ('5') 并且没有得到额外句号的尊严,这表明我可能丢失了两个字符。

我很想听听有关可能发生的事情的任何建议?

啊哈...我在已知 SDK 问题列表中找到了这个:

“函数向导中的参数说明字符串截断

xlfRegister 函数的pxArgumentHelp1 参数和所有后续参数都是可选字符串,对应于XLL 函数的参数。函数向导显示这些以在参数构造对话框中提供帮助。有时 Excel 会在对话框中显示与最终参数对应的字符串时将其截断一两个字符。您可以通过添加一个额外的“空字符串”作为函数注册的最后一个“参数帮助”参数来避免这种情况。”

所以,我会继续前进。