在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語句之間發生崩潰。我試圖在崩潰時檢查正在運行的堆棧。它如下所示:
- NTDLL.DLL(崩潰點,由於寫入存儲器0X000000000)
- Kernal32.dll
- XLL插件DLL
- EXCEL.EXE
任何人有什麼線索?
當你用Excel註冊這個函數時,你使用了什麼type_text?你是否嘗試用VBA中的Declare Function語句直接調用XLL? – AnotherParker