从 XLL 函数返回 unicode 字符串
Posted
技术标签:
【中文标题】从 XLL 函数返回 unicode 字符串【英文标题】:Returning unicode string from XLL function 【发布时间】:2013-07-27 11:21:15 【问题描述】:我在 VS 2010 中使用 Excel 2007 XLL SDK 编写 Excel 2007/2010 XLL。我的函数可以返回各种字符串:
__declspec(dllexport) LPXLOPER12 WINAPI PTstate (double P, double T)
static XLOPER12 xResult;
xResult.xltype = xltypeStr;
debugPrintf("P = %d\n", P);
debugPrintf("T = %d\n", T);
Calculate(P, T);
Reg = GetRegion(DV.p, DV.t);
xResult.val.str = L"";
if (Reg == 0) xResult.val.str = L"\027Ошибка диапазона параметров";debugPrintf("Reg = 0");
if (Reg == 1) xResult.val.str = L"\004Вода";debugPrintf("Reg = 1");
if (Reg == 2) xResult.val.str = L"\014Перегретый пар";debugPrintf("Reg = 2");
if (Reg == 3) xResult.val.str = L"\017Критическая смесь";debugPrintf("Reg = 3");
if (Reg == 4) xResult.val.str = L"\014Насыщенный пар";debugPrintf("Reg = 4");
if (Reg == 5) xResult.val.str = L"\019Сверхперегретый пар";debugPrintf("Reg = 5");
if (Reg != 0) MathVater();
return(LPXLOPER12) &xResult;
当字符串值返回 excel 时,它的值 - 'Ошибка диапазона параме' - 不是所有第一个字符串。但我告诉长度 os 字符串,字符串开头带有“\027”。我哪里搞错了?
编辑 1:
I've changed code to:
if (Reg == 0) xResult.val.str = L"\035Ошибка диапазона параметров";debugPrintf("Reg = 0");
if (Reg == 1) xResult.val.str = L"\012Вода";debugPrintf("Reg = 1");
if (Reg == 2) xResult.val.str = L"\022Перегретый пар";debugPrintf("Reg = 2");
if (Reg == 3) xResult.val.str = L"\025Критическая смесь";debugPrintf("Reg = 3");
if (Reg == 4) xResult.val.str = L"\022Насыщенный пар";debugPrintf("Reg = 4");
if (Reg == 5) xResult.val.str = L"\027Сверхперегретый пар";debugPrintf("Reg = 5");
但我有这个:
你怎么看?
编辑 2: 我的函数签名类型:
L"PTstate", // Function name/ordinal
L"UBB", // Func signature type
L"PTstate", // Func name in Func wizard
L"P, T", // Arg name in Func wizard
L"1", // Function type
L"SimpleXll2007", // Category in Func wizard
L"", // Shortcut (commands only)
L"", // Help topic
L"", // Func help in Func wizard
L"", // Arg help in Func wizard
L"" // Arg help in Func wizard
【问题讨论】:
谁投反对票 - 评论什么? 【参考方案1】:当为宽字符串指定字符串长度时,第一个宽字符保存字符串的长度。如果是纯西里尔 unicode,则为 8 个字节,对于罗马字符,则为 4 个字节。
所以这应该有效:
if (Reg == 0) xResult.val.str = L"\035Ошибка диапазона параметров";debugPrintf("Reg = 0");
在此处查看更多信息(参见表 2):http://msdn.microsoft.com/en-us/library/office/aa730920%28v=office.12%29.aspx
【讨论】:
好吧,当我执行 xResult.val.str = L"\031Ошибка диапазона параметров" 我在 Excel 中输入:'Ошибка диапазона параметр'。可能是俄罗斯符号的另一个计数? 罗马字符为 4 个字节,西里尔文 unicode 为 8 个字节。查看更新的答案! 好吧,它只适用于字符串:“\031Ошибка диапазона параметров”。但是当函数必须返回时 - xResult.val.str = L"\008Вода" - 单元格是空的。我很困惑... 真的吗?如果我将 8 加到所有这些上,它们就可以正常工作。试试L"\035Ошибка диапазона параметров"
、L"\012Вода"
等
奇怪,我玩过输入,现在我又遇到了同样的问题。我会多看的。【参考方案2】:
我使用 char* 来返回字符串。谁找到了 XLOPER12 的解决方案 - 欢迎!
【讨论】:
【参考方案3】:据我所知,问题在于您指定的字符串长度实际上不是八进制。
我已经采用了您的代码并创建了一个简化的示例,具有正确的八进制长度,它工作得很好。
__declspec(dllexport) LPXLOPER12 XLLMemoryE (int Reg) // REGISTRATION Type UH
static XLOPER12 xResult;
xResult.xltype = xltypeStr;
if (Reg == 0) xResult.val.str = L"\034Ошибка диапазона параметров";
if (Reg == 1) xResult.val.str = L"\004Вода";
if (Reg == 2) xResult.val.str = L"\015Перегретый пар";
if (Reg == 3) xResult.val.str = L"\021Критическая смесь";
if (Reg == 4) xResult.val.str = L"\015Насыщенный пар";
if (Reg == 5) xResult.val.str = L"\023Сверхперегретый пар";
return &xResult;
【讨论】:
以上是关于从 XLL 函数返回 unicode 字符串的主要内容,如果未能解决你的问题,请参考以下文章