2013-07-27 1 views
1

Я ищу писать Excel 2007/2010 XLL с помощью Excel 2007 XLL SDK в VS 2010. Моя функция может возвращать Varios строки:Возвращение юникод строки из функции 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; 
} 

Когда строковые значения возврата для преуспевания это значение - 'Ошибка диапазона параме' - не вся первая строка. Но я рассказываю длину строки os с «\ 027» в начале строки. Где я ошибаюсь?

Edit 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");} 

Но у меня есть это:

enter image description here Что вы думаете о?

Edit 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  
     } 
+0

Кто голосует - комментарий для чего? – amaranth

ответ

0

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

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

+0

Ну, когда я делаю xResult.val.str = L "\ 031Ошибка диапазона параметров" Я беру в Excel: 'Ошибка диапазона параметр'. Может быть, для русских символов еще один счет? – amaranth

+0

Римские символы - 4 байта, кириллический юникод - 8 байт. См. Обновленный ответ! – CuberChase

+0

Ну, это исправлено только для строки: "\ 031Ошибка диапазона параметров". Но когда функция должна возвращать - xResult.val.str = L "\ 008Вода" - ячейка пуста. Я смущен ... – amaranth

0

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

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

__declspec (dllexport) LPXLOPER12 XLLMemoryE (интермедиат 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;