Возвращение строки Юникода из функции XLL

Я пишу Excel 2007/2010 XLL, используя Excel 2007 XLL SDK в VS 2010. Моя функция может возвращать строки переменных:

 __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, это значение — «Ошибка диапазона параме» — не вся первая строка. Но я говорю длину строки с «\ 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

Решение

При указании длины строки для строки широких символов первый широкий символ содержит длину строки. Если это чисто кириллический юникод, то это 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

1

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

Я использовал char * для возврата строки. Кто найдет решение с XLOPER12 — добро пожаловать!

0

Насколько я вижу, проблема в том, что длины строк, которые вы указали, на самом деле не являются октальными.

Я взял ваш код и создал упрощенный пример с правильной длиной в восьмеричной системе, и он работает просто отлично ..

__declspec (dllexport) LPXLOPER12 XLLMemoryE (int Reg) // РЕГИСТРАЦИЯ Тип 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;

}

0
По вопросам рекламы [email protected]