问题标签 [safearray]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1662 浏览

c++ - COM:传递对 SAFEARRAY 的引用

介绍

我想用 Qt 查询一个 COM 函数。我有一个文档,但适用于 VB。尽管如此,这个文档说:

The DataArray structure must be declared in the application that is controlling PULSE and the size of the array must be equal to the number of x-axis entries. In Visual Basic, use the DIM (or corresponding) statement to declare the variable and allocate storage space. In other languages use a safearray of strings (VT_BSTR) or reals (VT_R8 for double or VT_R4 for float/single).


步骤1

首先,我使用OLEVIEW来查看函数原型的真实外观。

我得到了:void Frequencies(VARIANT* FrequencyArray)

所以我试着用Qt来做:

注意:我使用了此处QList<QVariant>所示的 a 。

但我收到以下消息Type Mismatch in Parameter. Pass an array of type string or real.


第2步

所以我尝试了一个字符串数组:

没有更多的错误,但返回的值是初始化期间设置的值(我尝试了几个,不仅是 0.0)。


第 3 步

之后,我尝试了很多组合,但都没有成功。所以我要求开发人员(很难联系)提供一个例子。他们给我发了以下代码(Visual-C++):


问题

这段代码如何在 QtCreator 中使用?

我意识到COleSafeArray特定于 VisualStudio ......

我很抱歉这篇文章的长度,但这是我试图解决这个问题但没有成功的一段时间。


编辑

以下是有关如何使用 WIN32 API 执行此操作的线索:

但是该Invoke方法返回一个DISP_E_EXCEPTION: Type Mismatch in Parameter. Pass an array of type string or real.

0 投票
1 回答
3487 浏览

c++ - 何时使用 SafeArrayAccessData 锁定 SAFEARRAY

我有一个关于何时需要使用 SafeArrayAccessData 来锁定由托管代码传递的 SAFEARRAY 的问题。这是我们的代码。VARIANT 由托管代码传递,带有一个字符串数组。在代码审查期间,有人建议使用 SafeArrayAccessData/SafeArrayUnAccessData。但他不确定为什么以及有什么好处。你能分享一些你的经验吗?谢谢!

0 投票
1 回答
1220 浏览

delphi - delphi中的二维Safearray?

我需要对 COM 方法进行单元测试,因此我需要创建一个字符串类型的二维 Safearray。

怎么做?

0 投票
1 回答
3538 浏览

c++ - 无法将 ByRef VARIANT 数组转换为 SAFEARRAY

我正在编写一个可以从 Excel VBA 访问的 C++ DLL(它只是完成数学方程式,不需要从工作表中访问)。该 DLL 旨在替换当前的 VBA 代码,我想用 C/C++ 编写它以提高性能。

由于我使用的是现有代码并且只是想用新的 DLL 替换当前的 VBA 函数,因此我必须使用包含单个向量数组的 VBA 变体。以下是 VBA 调用代码的简略示例:

我可以将此 Variant 数组传递给我的 C++ 函数,也可以ByVal作为ByRef数据VARIANT类型传递,并且它似乎被正确接收。SAFEARRAY当我将数组转换为using后尝试读取数组的内容时,会出现我的问题SafeArrayAccessDataSAFEARRAY转换似乎有效,但数组的内容不正确。以下是我的 C++ 代码:

我发现的示例似乎表明.parray应该保存数据,但是检查input0表明它在.pparray. 如果我尝试分配pSafeArrayInput0 = input0.pparray它会出错。返回的值d_m类似于1.05319234616515E-307.

如果我将输入更改为,ByVal那么我可以使用以下 C++ 代码正确访问数组的元素(唯一的区别是 input0 的地址正在由SAFEARRAY.

我发现的所有示例都表明,通过VARIANT指针传递输入应该适用于我的 ReadArrayByRef 函数(即http://support.microsoft.com/kb/167668,它略有不同但在我之后的点相同)。

我在 ByRef 函数中做错了什么?

0 投票
0 回答
662 浏览

c++ - 对象的安全数组

我想将 SafeArray 传递给 C++ COM 中的函数。

我有一个已初始化的 MetadataListEntity 类的对象

我想创建一个 MetadataListEntity 对象数组并将其传递给一个接受 SafeArray 的函数。

我该怎么做?

谢谢,加根

0 投票
1 回答
1496 浏览

c++ - 如何从 CComSafeArray 获取底层 SAFEARRAY?

我尝试了GetSafeArrayPtr()返回 LPSAFEARRAY* 的方法,typedef 定义为:

我以为我可以直接将其分配给 SAFEARRAY* 变量,但编译器给出了这个错误:

错误 C2440:“=”:无法从“LPSAFEARRAY *”转换为“SAFEARRAY *”

我觉得这很奇怪。我在这里做错了什么?

PS:我在 C++/CLI dll 中执行此操作(如果有任何相关性)。

0 投票
1 回答
304 浏览

c# - COM Interop 中内存释放的责任

我正在开发一个使用 .NET dll 提供的服务的 C++ 代码,我通过 COM Interop 访问它。我正在编写 C++ 和 C# 方面。

由 dll 公开并从 C++ 调用的方法之一要求 dll 返回包含一些信息的已分配字节数组。在我的 C# 代码中创建该方法后,.tlb 生成器将其公开如下:

测试表明,当我按要求发送指针时,我确实获得了分配的缓冲区并填充了我需要的信息,但我不明白在这种情况下,释放此内存的责任是谁(C#\C++)以及如何。

有什么建议吗?谢谢你。

0 投票
0 回答
183 浏览

c# - Python -COMMETHOD ,没有得到返回值

我对 COM 编程很陌生,我们的项目需要 Python 脚本与用 C# 编写的 COM dll 进行通信。

Python中生成的COM签名如下

相同的 C# 代码在哪里

注意:以上是我为解释问题而创建的虚拟函数

现在,当我尝试从 Python 调用 COM 方法时,我只获取通过引用方法 (sweepValuesX) 作为返回值而不是实际返回值(必须为真/假)传递的值

我的函数调用如下

输出为 ((0.0, 0.5),)

注意:由于我无法找到从 Python 传递最后一个参数的方法,我只是省略了最后一个参数以供试用

高度赞赏为什么会发生这种情况的任何提示,或者具体来说我有两个问题

  1. 我如何通过 Python (POINTER(_midlSAFEARRAY(c_double))) 传递要通过引用传递的参数
  2. 我怎样才能得到实际的返回值(真/假)

桑杰

0 投票
4 回答
1506 浏览

com - SAFEARRAY var 类型存储在哪里?

我想了解 SAFEARRAY 的实施。

在我看来,SAFEARRAY 结构中没有用于存储元素类型信息的字段,例如 VT_I4(3) 或 VT_R4(4),但 SafeArrayGetVartype 函数返回正确的类型。

有人在下面的MSDN页面上评论说,高位字cLocks持有类型信息:MSDN上的SAFEARRAY结构

但是当我通过类型库将 Long 和 Single 数组从 VBA 传递给 DLL 函数时,这些数组的 fFeatures 都是 0x80,cLocks 都是 0,并且 stll SafeArrayGetVartype 可以告诉 VT_I4(3) 和 VT_R4(4)。

0 投票
1 回答
67 浏览

c++ - COM 方法仅在以暂停间隔调用时才返回正确的值

我有 COM 对象,我立即对其进行初始化:

接下来我有一个函数,这个 COM 对象的调用方法:

问题是方法:

返回正确的值或零。但是如果我用暂停间隔调用函数,那么一切正常。我不知道,可能这是异步方法,我必须使用一些机制,等到方法完成?

例如: