Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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++ 如何将XLOPER(Excel变量)直接从c+返回到VBA+;动态链接库?_C++_Vba_Vsto_Xll - Fatal编程技术网

C++ 如何将XLOPER(Excel变量)直接从c+返回到VBA+;动态链接库?

C++ 如何将XLOPER(Excel变量)直接从c+返回到VBA+;动态链接库?,c++,vba,vsto,xll,C++,Vba,Vsto,Xll,我不知道如何在VBA中处理XLOPER类型的变量。有很多网页解释了XLopor变量、C++ DLL 和 XLL Advin之间的关系,但是我需要在DLL中直接调用C++函数来将XLopor直接返回到VBA而不使用XLL框架。(不需要用户定义的函数,因为dll中的函数将由VBA代码调用,而不是由Excel用户调用) 确实,我正在编写一个Excel VSTO,我需要从它调用C++代码。我发现xloper变量对XLL非常有用,所以我想直接在VBA/VB.Net中使用这种变量类型。那有可能吗 我猜xl

我不知道如何在VBA中处理XLOPER类型的变量。有很多网页解释了XLopor变量、C++ DLL <强>和 XLL Advin之间的关系,但是我需要在DLL中直接调用C++函数来将XLopor直接返回到VBA而不使用XLL框架。(不需要用户定义的函数,因为dll中的函数将由VBA代码调用,而不是由Excel用户调用)

确实,我正在编写一个Excel VSTO,我需要从它调用C++代码。我发现xloper变量对XLL非常有用,所以我想直接在VBA/VB.Net中使用这种变量类型。那有可能吗

  • 我猜xloper可以使用variant类型处理,但我不知道如何处理。 我发现了这个帖子:但是没有明确的答案
编辑:

对不起,如果我不清楚,所以我举例说,这个C++函数从Excel中接收一个int,并将相同的值加上5作为XLopor变量到Excel。

  _declspec(dllexport) xloper  _stdcall returnInt( int iVal)
 {
 xloper pxlval_ret;
 int a ;
 a =5 + iVal;

 pxlval_ret->xltype = xltypeInt;
 pxlval_ret->val.w =  a ;

 return pxlval_ret;
}

<>但是我不知道如何调用VBA,返回变量是一个变种吗?< /P> < P>最后我仔细阅读了《Steve Dalton C/C++第二版中的EXCEL ADIN开发》一书。它回答了这个问题并提供了源代码。如果你想执行这个操作,你需要创建一个XLopter包装器,XLPropyTosiv函数是前面提到的书的XLPop.CPP的函数来完成这个任务。由于版权问题,我不能在这里发布全部代码,只能发布一些代码行;我认为它可以提供一些有用的见解:

bool xloper_to_vt(const xloper *p_op, VARIANT &var, bool convert_array)
{
VariantInit(&var); // type is set to VT_EMPTY

switch(p_op->xltype)
{
case xltypeNum:
    var.vt = VT_R8;
    var.dblVal = p_op->val.num;
    break;

case xltypeInt:
    var.vt = VT_I2;
    var.iVal = p_op->val.w;
    break;

case xltypeBool:
   // see in the book

case xltypeStr:
    // see in the book

case xltypeErr:
    // see in the book

case xltypeMulti:
    if(convert_array)
    {
        VARIANT temp_vt;
        SAFEARRAYBOUND bound[2];
        long elt_index[2];

        // see in the book

        xloper *p_op_temp = p_op->val.array.lparray;

        for(WORD r = 0; r < p_op->val.array.rows; r++)
        {
            for(WORD c = 0; c < p_op->val.array.columns;)
            {
            // see in the book
            }
        }
        break;
    }
    // else, fall through to default option

default: // type not converted
    return false;
}
return true;
}
bool xloper_to_vt(const xloper*p_op,VARIANT&var,bool convert_数组)
{
VariantInit(&var);//类型设置为VT_EMPTY
开关(p_op->xltype)
{
案例xltypeNum:
变量vt=vt_R8;
var.dblVal=p_op->val.num;
打破
案例xltypeInt:
var.vt=vt_I2;
var.iVal=p_op->val.w;
打破
案例xltypeBool:
//在书中看到
案例xltypeStr:
//在书中看到
案例xltypeErr:
//在书中看到
案例xltypeMulti:
if(转换数组)
{
变型温度;
安全排列绑定[2];
长elt_指数[2];
//在书中看到
xloper*p_op_temp=p_op->val.array.lparray;
for(单词r=0;rval.array.rows;r++)
{
对于(单词c=0;cval.array.columns;)
{
//在书中看到
}
}
打破
}
//否则,采用默认选项
默认://类型未转换
返回false;
}
返回true;
}

我已经阅读了Steve Dalton在C/C++第二版中使用Excel Advin开发的财务应用程序,但没有简单的例子,所以我完全丢失了。你不能从电子表格中的函数调用XLopor,VBA不能直接调用它们。因此,你必须在其他问题中回答包装问题PS:如果有人知道有一个库在做这项工作,请告诉我们,然后我将把问题作为答案。Grebe这是另一个问题的重复:(基本上是XLOPER将数据从Excel函数传递到DLL-因为VBA对DLL有不同的调用或使用Visual Studio工具。(您提到的书中的示例可能显示了使用它们的最佳方式)注意,我发现用C编写所有代码比使用VBA更容易,但现在我将介绍VSTO