这是一些 C 代码,我想将其转换为 Excel 2010 64 位的 Excel .XLL 插件。问题不是 Excel 2010 是否可以运行 32 位插件,代码必须是 64 位,因为我需要从此插件启动 64 位 JVM。
当我使用 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;
}