Excel 64位C插件编译问题
这里有一些C代码,我想变成Excel 2010 64位的Excel .XLL插件。 问题是,如果Excel 2010可以运行32位插件,代码HAS是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文件)replace掉那个调用,显然使用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; }