我有在Excel插件(XLL)的特定功能。 该插件是专有的,我们没有访问源代码。然而我们需要调用包含在插件内的某些功能,我们想从C#程序调用它。

目前,想到写C ++接口调用带有xlopers Excel的功能,则调用此C ++接口从C#的。

有谁谁拥有这种问题的以往的经验知道什么是最好的解决办法?

安东尼

有帮助吗?

解决方案

你需要创建一个假xlcall32.dll 后,把它放在同一目录下XLL(不要把Excel的自己xlcall32.dll在PATH)。下面是一些代码:

# include <windows.h>

typedef void* LPXLOPER;

extern "C" void __declspec(dllexport) XLCallVer ( ) {}

extern "C" int __declspec(dllexport) Excel4 (int xlfn, LPXLOPER operRes, int count,... ) { return 0; }

extern "C" int __declspec(dllexport) Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER far opers[]) {return 0;}

现在假设我有一个名为XLL XLL-dll.xll一个叫(使用“带的Depends.exe”找出的导出函数的名称)xlAdd功能以及添加了两个双打: 外部的 “C” __declspec(dllexport)的XLOPER * __cdecl xlAdd(XLOPER * pA的XLOPER * PB);

下面的代码调用它:


# include <windows.h>
# include <iostream>

// your own header that defines XLOPERs
# include <parser/xll/xloper.hpp>

// pointer to function taking 2 XLOPERS
typedef XLOPER * (__cdecl *xl2args) (XLOPER* , XLOPER* ) ;

void test(){
/// get the XLL address
HINSTANCE h = LoadLibrary("xll-dll.xll");
if (h != NULL){
xl2args myfunc;
/// get my xll-dll.xll function address
myfunc = (xl2args) GetProcAddress(h, "xlAdd");
if (!myfunc) { // handle the error
FreeLibrary(h); }
else { /// build some XLOPERS, call the remote function
XLOPER a,b, *c;
a.xltype = 1; a.val.num = 1. ;
b.xltype = 1; b.val.num = 2. ;
c = (*myfunc)(&a,&b);
std::cout << " call of xll " << c->val.num << std::endl; }
FreeLibrary(h); }
}

int main()
{test();}

我的EXE实际工作(我自己都感到惊讶),并如预期输出3。你必须有一个什么样的实际XLL预计,参数的一些知识。如果它分配一些内存,你必须检查的#define xlbitDLLFree 0x4000的 设置你的XLOPER C->类型,并回拨“xlAutoFree”。

其他提示

您可能想尝试XLL此外 http://www.planatechsolutions.com/xllplus/ Default.htm的。这是一个有点贵,但  XLL包装库功能正是你要找的:

“有时候,它能够从其他环境中,如命令行程序或交互式应用程序,用C语言编写打电话给你的Excel插件功能++,Java和C#或Visual Basic。该XLL包装工具包中包含的工具是有用的中,运行时库,示例和文档,以帮助的COM模块和.NET组件,其包裹的Excel XLL插件“的发展

这是Excel加载DLL可能被写在C#。如果是这样,那么你也许可以完全绕过Excel中。可能需要一个包装虽然。

检查装配是否是在你安装plguin程序文件可用, 参考该组件直接到C#项目 - 检查对象浏览器为你的类,方法或对象

您应该能够使用反射来访问您的插件。尝试使用的反射来看看有什么可用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top