0

の開発は、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 (...) {
        ;
    }

}

Application.Run 行で Excel VBA がクラッシュします。

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

XLL と VBA の組み合わせは、XLL が短い Unicode 文字列 (つまり、長さ 6 の wchar_t) を返す場合は正常に動作しますが、長い Unicode 文字列 (つまり、長さ 8 の wchar_t) が返されるとクラッシュし始めます (そのようなケースの 1 つは "OFFICE : 」)。

クラッシュする環境は、Vista 上の Excel 2007 または Excel 2010 です。ただし、この XLL と VBA の組み合わせは、XP 上の別のマシン Excel 2007 ではまったく問題なく動作します。

XLL アドイン関数に try catch ブロックを入れようとしました。キャッチされる例外はありません。また、VBAコードにON ERRORステートメントを入れようとしましたが、何もキャッチしません。XLL return ステートメントと Excel VBA Application.Run ステートメントの間でクラッシュが発生したようです。クラッシュ時に実行中のスタックを確認しようとしました。それは次のとおりです。

  1. NTDLL.DLL (メモリ 0X000000000 への書き込みによるクラッシュ ポイント)
  2. Kernal32.dll
  3. XLL アドイン DLL
  4. Excel.exe

誰にも手がかりはありますか?

4

1 に答える 1

1

VBAを画像から除外したい場合は、http://nxll.codeplex.comを使用してください。xll / ユーティリティ/strings.hには、ワイドをMBCS文字列に変換するためのラッパーがあります。

于 2011-09-30T22:51:50.530 に答える