Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C调用Excel/DLL/XLL函数#_C#_C++_Excel_Xll - Fatal编程技术网

C# 从C调用Excel/DLL/XLL函数#

C# 从C调用Excel/DLL/XLL函数#,c#,c++,excel,xll,C#,C++,Excel,Xll,我在Excel加载项(xll)中有一个特定的函数。 加载项是专有的,我们无法访问源代码。但是,我们需要调用addin中包含的一些函数,我们希望从C#程序调用它 目前,我在考虑用XLopops编写一个C++接口调用Excel函数,然后调用C++中的C++接口。 有这方面经验的人知道什么是最好的解决方案吗 AnthonyExcel加载项DLL可能是用C#编写的。如果是这样,那么您可能完全可以绕过Excel。但可能需要一个包装器。检查安装plguin的程序文件中是否有程序集, 将该程序集直接引用到您的

我在Excel加载项(xll)中有一个特定的函数。 加载项是专有的,我们无法访问源代码。但是,我们需要调用addin中包含的一些函数,我们希望从C#程序调用它

目前,我在考虑用XLopops编写一个C++接口调用Excel函数,然后调用C++中的C++接口。 有这方面经验的人知道什么是最好的解决方案吗


Anthony

Excel加载项DLL可能是用C#编写的。如果是这样,那么您可能完全可以绕过Excel。但可能需要一个包装器。

检查安装plguin的程序文件中是否有程序集,
将该程序集直接引用到您的c#项目-检查对象浏览器中的类、方法或对象

您应该能够使用反射来访问加载项。请尝试使用以查看可用内容。

您可能希望尝试XLL Plus。有点贵,但是 XLL包装库功能正是您想要的:

“有时,调用来自其他环境的Excel外接程序功能是有用的,例如命令行程序或交互式应用程序,这些代码用C++、爪哇、C或Visual Basic编写。Xll Wrapper toolkit包含工具、运行库、示例和文档,可帮助开发包装Excel Xll加载项的COM模块和.NET程序集“

您需要创建一个假xlcall32.dll,将其放在与Xll相同的目录中(不要将Excel自己的xlcall32.dll放在路径中)。以下是一些代码:
#包括
typedef void*LPXLOPER;
外部“C”void uu declspec(dllexport)XLCallVer(){}
外部“C”int_uudeclspec(dllexport)Excel4(int-xlfn,LPXLOPER-operRes,int-count,…{返回0;}
外部“C”int_uudeclspec(dllexport)Excel4v(int-xlfn,LPXLOPER-opers,int-count,LPXLOPER-far-opers[]){返回0;}

现在假设我有一个名为XLL-dll.XLL的XLL,其中有一个名为(使用“depends.exe”查找导出函数的名称)xlAdd的函数,该函数可以添加两个双精度: 外部“C”uu declspec(dllexport)XLOPER*uuu cdecl xlAdd(XLOPER*pA,XLOPER*pB)

下面的代码调用它:


#包括
#包括
//您自己定义xloper的头
#包括
//指向使用2个xloper的函数的指针
typedef XLOPER*(uu cdecl*xl2args)(XLOPER*,XLOPER*);
无效测试(){
///获取XLL地址
HINSTANCE h=LoadLibrary(“xll dll.xll”);
如果(h!=NULL){
xl2args myfunc;
///获取我的xll-dll.xll函数地址
myfunc=(xl2args)GetProcAddress(h,“xlAdd”);
如果(!myfunc){//处理错误
免费图书馆(h);}
否则{///构建一些xloper,调用远程函数
XLOPERA,b,*c;
a、 xltype=1;a.val.num=1;
b、 xltype=1;b.val.num=2;
c=(*myfunc)(&a和&b);

std::cout在这种情况下,我得到的加载项是原样。它不是由我们开发的,我们不访问源代码,但我们想用其他语言使用XLL中包含的一些函数。我将编辑我的帖子来提及这一事实。这可能是一个愚蠢的问题,但你试过将XLL作为普通dll使用吗?(xll只是一个带有Excel额外接口的dll。)或者问题是,您要调用的函数在调用Excel时使用Excel提供的参数,而您在调用时遇到了问题?目前,我已经或多或少地完成了您所说的。我使用xlopers作为参数将xll称为dll(我需要的函数是在C++中使用XLopopes作为参数),然后我将C层转换为XLopeS并调用C++函数。我只是想知道是否有人有更简单的解决方案。
# 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;}
# 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();}