2011-09-26 30 views
0

在MS SDK上開發C/C++。Excel從xll插件返回的較長unicode字符串崩潰

的C++片XLL的如下:

__declspec(dllexport) LPWSTR WINAPI xlGetLang(LPSTR in_key) { 

    try { 

    static XLOPER12 lang; 
    static size_t buffer_size = 0; 
    static wchar_t * buffer = NULL; 

    std::wstring unicode_str; 

    // This step get the unicode string assigned to unicode_str 
    // with the key in_key from internal dictionary. 
    pms::get_instance()->get_lang(in_key, unicode_str); 
    // over 

    size_t msg_len = unicode_str.length(); 

    // This step checks whether we need to incraese the buffer 
    // for the unicode string to be returned. 
    if (buffer_size == 0) { 
     buffer = (LPWSTR) malloc(sizeof(wchar_t) * (msg_len + 1)); 
     buffer_size = msg_len; 
    } else if (buffer_size < msg_len) { 
     buffer = (LPWSTR) realloc(buffer, sizeof(wchar_t) * (msg_len + 1)); 
     buffer_size = msg_len; 
    } 
    // over 

    wcsncpy(buffer, unicode_str.c_str(), msg_len); 
    buffer[msg_len] = 0; 

    return buffer; 

    } 

    catch (...) { 
     ; 
    } 

} 

Excel的VBA崩潰在Application.Run行:

Dim var As String 
var = Application.Run("xGetLang", key) 

XLL & VBA的組合運行正常時XLL返回短unicode字符串(即與長度爲6的wchar_t),但會在返回更長的unicode字符串(即,帶有長度爲8的wchar_t)時開始崩潰(一種情況是「OFFICE:」)。

崩潰的環境是Vista上的Excel 2007或Excel 2010。但是,XLL & VBA的這種組合在XP上的另一臺計算機Excel 2007上完全沒有問題。

我試圖把一個try catch塊放在XLL插件函數中。沒有發現異常。我也嘗試在VBA代碼中放置一個ON ERROR語句,它也沒有捕獲任何東西。它看起來像在XLL return語句和excel VBA Application.Run語句之間發生崩潰。我試圖在崩潰時檢查正在運行的堆棧。它如下所示:

  1. NTDLL.DLL(崩潰點,由於寫入存儲器0X000000000)
  2. Kernal32.dll
  3. XLL插件DLL
  4. EXCEL.EXE

任何人有什麼線索?

+0

當你用Excel註冊這個函數時,你使用了什麼type_text?你是否嘗試用VBA中的Declare Function語句直接調用XLL? – AnotherParker

回答

1

如果你想讓VBA脫離圖片使用http://nxll.codeplex.com。在xll/utility/strings.h中有用於將寬轉換爲MBCS字符串的包裝器。