MS SDK之上的C / C ++开发。

XLL的C ++代码如下:

__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返回短的unicode字符串(即,长度为6的wchar_t)时,XLL和VBA的组合可以正常运行,但是当返回较长的unicode字符串(即,长度为8的wchar_t)时,它将开始崩溃(这种情况是“ OFFICE: ”)。

崩溃的环境是Vista上的Excel 2007或Excel 2010。但是,XLL和VBA的这种组合在XP上的另一台计算机Excel 2007上完全没有问题。

我试图在XLL插件函数中放入try catch块。没有异常被捕获。我还尝试在VBA代码中放入ON ERROR语句,它也无法捕获任何内容。看起来崩溃发生在XLL返回语句和excel VBA Application.Run语句之间。崩溃时,我尝试检查正在运行的堆栈。如下:


NTDLL.DLL(崩溃点,由于写入内存0X000000000)
Kernal32.dll
XLL插件DLL
Excel.exe


有人有任何线索吗?

最佳答案

如果要使VBA脱颖而出,请使用http://nxll.codeplex.com。 xll / utility / strings.h中有用于将宽字符串转换为MBCS字符串的包装器。

07-24 20:28