- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个要从 Excel VBA 访问的 C++ DLL(它只完成数学方程式,不需要从工作表访问)。 DLL 旨在替换当前的 VBA 代码,我想用 C/C++ 编写它以提高性能。
由于我正在使用现有代码并且只是想用新的 DLL 替换当前的 VBA 函数,所以我必须使用包含单个 vector 数组的 VBA 变体。以下是 VBA 调用代码的缩略示例:
Sub VBACaller()
Dim InputR0(1 To 5) As Variant, vResult As Variant
InputR0(1) = 26.8
InputR0(2) = 27.8
InputR0(3) = 28.8
InputR0(4) = 29.8
vResult = ReadArrayVBA(InputR0)
End Sub
我可以将这个 Variant 数组作为 VARIANT
数据类型传递给我的 C++ 函数 ByVal
或 ByRef
并且它似乎被正确接收.在使用 SafeArrayAccessData
将数组转换为 SAFEARRAY
后尝试读取数组的内容时,出现了我的问题。 SAFEARRAY
转换似乎有效,但数组的内容不正确。以下是我的 C++ 代码:
VARIANT __stdcall ReadArrayByRef(VARIANT *input0)
{
//Variable to assign value from Array
double d_m = 0;
//Check if this is a variant type or not
if (V_VT(input0) & VT_ARRAY)
{
SAFEARRAY* pSafeArrayInput0 = NULL;
pSafeArrayInput0 = V_ARRAY(input0);
double* pVals;
HRESULT hr = SafeArrayAccessData(pSafeArrayInput0, (void **)&pVals); // direct access to SA memory
if (SUCCEEDED(hr))
{
long lLBound = -1, lUBound = 1; // get array bounds
SafeArrayGetLBound(pSafeArrayInput0, 1, &lLBound);
SafeArrayGetUBound(pSafeArrayInput0, 1, &lUBound);
if (lLBound > -1 && lUBound > -1)
{
d_m = pVals[1];
}
SafeArrayUnaccessData(pSafeArrayInput0);
}
}
//Output
VARIANT v;
VariantInit(&v);
v.vt = VT_R8;
v.dblVal = d_m;
return v;
}
我发现的例子似乎表明 .parray
应该保存数据,但是 input0
的检查表明它在 .pparray
。如果我尝试分配 pSafeArrayInput0 = input0.pparray
它会出错。 d_m
返回的值与 1.05319234616515E-307
一致。
如果我将输入更改为 ByVal
,那么我可以使用以下 C++ 代码正确访问数组的元素(唯一的区别是 SAFEARRAY 正在访问 input0 的地址
。
VARIANT __stdcall ReadArrayByVal(VARIANT input0)
{
//Variable to assign value from Array
double d_m = 0;
//Check if this is a variant type or not
if (V_VT(&input0) & VT_ARRAY)
{
SAFEARRAY* pSafeArrayInput0 = NULL;
pSafeArrayInput0 = V_ARRAY(&input0);
double* pVals;
HRESULT hr = SafeArrayAccessData(pSafeArrayInput0, (void **)&pVals); // direct access to SA memory
if (SUCCEEDED(hr))
{
long lLBound = -1, lUBound = 1; // get array bounds
SafeArrayGetLBound(pSafeArrayInput0, 1, &lLBound);
SafeArrayGetUBound(pSafeArrayInput0, 1, &lUBound);
if (lLBound > -1 && lUBound > -1)
{
d_m = pVals[1];
}
SafeArrayUnaccessData(pSafeArrayInput0);
}
}
VARIANT v;
VariantInit(&v);
v.vt = VT_R8;
v.dblVal = d_m;
return v;
}
我发现的所有示例都表明,通过指针传递 VARIANT
输入应该按照我的 ReadArrayByRef 函数(即 http://support.microsoft.com/kb/167668 略有不同,但在我之后)。
我的 ByRef 函数做错了什么?
最佳答案
您应该检查 VT_BYREF
标志,如果已设置,则取消引用指针以访问数组,如下所示:
pSafeArrayInput0 = *V_ARRAYREF(input0);
关于c++ - 无法将 ByRef VARIANT 数组转换为 SAFEARRAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17882690/
我正在创建一个用户表单,它将不同的信息集收集到不同的字典中进行处理。 字典在用户窗体模块级别声明,并在激活用户窗体时在另一个过程中初始化。 为了简化我的代码,我有一个将项目插入适当字典的子例程。 我已
输入 =Test2(5)将代码放入模块后放入 Excel。为什么这会给我一个 Byref argument type mismatch错误? 如果在 Test2 的开头我做了一行来创建我的数组: Di
我在这里做错了什么? Sub Main() Dim patients() As String ' Some code to populate the patients array, works fin
最初在我的主代码部分中,我有一个丑陋的 if 语句 - 尽管它会运行丑陋。我决定将其设为我要调用的函数,这导致我收到错误“编译错误:ByRef 参数类型不匹配”。我的假设是该函数需要正确引用,尽管我一
鉴于被调用的过程实际上设置了传递的 Range 对象 ByRef,我希望该对象引用在调用过程中可用。但仍然什么都没有。 解决办法是什么? 调用 Private Sub Specs_TryGetRang
我需要分配一个 byref 参数,但是,在 Windows 8x64 机器上使用 F# 4.0 和 .NET 4.5.2,我不断收到关于 This value is not mutable. 的投诉。
我是 Python 的新手(而且对编程了解不多),但我记得读过 python 通常不复制值,因此任何语句 a = b 都会使 b 指向 a。如果我跑 a = 1 b = a a = 2 print(b
假设我有一个采用整数值 ByRef 的函数,如下所示: Function myFunc(ByRef funcVal As Integer) funcVal = funcVal + 1 End Fu
我想检查是否存在具有特定名称的工作表,所以我在下面生成 shtexist 函数。 但是,对于 shtexist 中的第二个参数。当我首先通过 byref 时, shtexist(name,thiswo
我在 Excel 2016 中编写脚本,遇到了一些奇怪的行为,具体取决于我定义变量的方式。我在下面创建了一些示例代码来重现错误。 我想知道这是一个已知的 VBA 错误还是我做错了什么? Sub IWo
我正在尝试这段代码,但无法摆脱错误“ByRef 参数类型不匹配”。 我已将 i 和 j 声明为整数,并将 ByRef 放入 DisplayTreeHelp 函数中,以保留在完成执行 DisplayTr
这是代码 Dim Comp_Str, Comp_Val As String Call Populate(Comp_Str, Comp_Val) Sub Populate(Str As String,
我正在尝试编写一个程序来捕获何时选择单元格并简单地返回单元格列和行。我收到“ByRef 参数类型不匹配”错误,但这没有意义。见下面的截图: 问题似乎与 iRow 变量有关。据我所知,它是一个整数,并且
我试图检测是否传递了操作参数,但由于某种原因,所有常用函数(IsMissing()/IsEmpty()/IsNull())总是返回 false。 这就是我正在尝试的: Public Sub SetVa
我试图通过使用 for 循环传递 i 值来在 VBA 中有一个子程序来调用另一个子程序。问题是当您运行 forLoop() 子程序时,出现错误 ByRef 类型不匹配。我只是在尝试这个示例方法,看看它
我创建了一个实现 INotifyPropertyChanged 的基类界面。该类还包含一个通用函数 SetProperty设置任何属性的值并提高 PropertyChanged事件,如有必要。 Pub
在我使用 VB6 的 10 多年里,我时不时地收到一个“ByRef 参数类型不匹配”错误,我根本找不到不匹配的地方。在挣扎了一段时间后,我总是以一种或另一种方式强制输入,但这次我想我会问。我包括了所有
我刚刚安装了Visual Studio 2010 Service Pack(在Windows Update上提出),并且可以在“智能”上看到一个新功能,这意味着当我在VB.NET中编写Function
我在 Access 2013 中使用 VBA。 在常规模块中有 2 个过程,RunProc() 和 PopulateCollection() 当执行RunProc时,它会调用PopulateColle
我正在使用一个正在运行的程序。我制作了一个副本来测试使我的代码更加模块化。下面是循环内的一个子运行,通过调用第一个变为两个子运行。 Sub Trendline() Dim eqn, name As S
我是一名优秀的程序员,十分优秀!