3

これは、Excel 2010 64 ビット用の Excel .XLL アドインに変換したい C コードの一部です。問題は、Excel 2010 が 32 ビット アドインを実行できるかどうかではありません。このアドインから 64 ビット JVM を起動する必要があるため、コードは 64 ビットである必要があります。

Visual Studio 2012 でコンパイルすると動作します。このまったく同じコードを mingw64 でコンパイルすると、コンパイルされますが、Excel がクラッシュします (XLCALL32 は Excel 2010 SDK の 64 ビット バージョンです)。

c:\mingw\mingw64_rubenvb\bin\x86_64-w64-mingw32-gcc.exe -m64 -shared -o test.xll test.c -L . -lXLCALL32

長く苛立たしい努力を重ねた結果、Excel4の呼び出しに問題があることがわかりました。

その呼び出しをExcel12 (前述の SDK に付属する XLCALL.CPP ファイルから) に置き換え、明らかに XLOPER12 と XCHAR を使用すると、すべてが機能します。

これがなぜなのか、誰かが洞察を持っていますか?

コードは次のとおりです。

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include "xlcall.h"

#define XL_MAX_STRING_LENGTH 255
#define JAVA_MAX_NUM_JVM_ARGS 20


char *xl_new_string(char *text)
{
    if (!text) return NULL;

    int len = strlen(text);
    if (len == 0) return NULL;
    if (len > XL_MAX_STRING_LENGTH) len = XL_MAX_STRING_LENGTH;

    char *p = (char *) malloc(len + 2);
    memcpy(p + 1, text, len + 1);
    p[0] = (char) len;
    return p;
}

void xl_show_message_box(char *text)
{
    XLOPER xStr, xInt;

    xStr.val.str = xl_new_string(text);
    xStr.xltype = xltypeStr;

    xInt.val.w = 3;
    xInt.xltype = xltypeInt;

    Excel4(xlcAlert, NULL, 2, &xStr, &xInt);
    free(xStr.val.str);
}



__declspec (dllexport) int __stdcall xlAutoOpen()
{
    char message[XL_MAX_STRING_LENGTH];
    strcpy(message, "It's OPEN !");
    xl_show_message_box(message);

    return 0;
}


__declspec (dllexport) int __stdcall xlAutoClose()
{
    return 0;
}
4

0 に答える 0