问题标签 [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 投票
3 回答
1342 浏览

variant - 如何使用 EuCOM 在 Euphoria 中创建 BSTR 的变体数组?

到目前为止,我已经弄清楚了如何使用 Typelib 将 Unicode 字符串 bSTR 传入和传出 Euphoria DLL。到目前为止,我无法弄清楚的是如何创建和传回 BSTR 数组。

到目前为止我拥有的代码(以及include用于 EuCOM 本身和部分 Win32lib 的 s):

类型库的一部分是:

VB6中的测试代码是:

到目前为止,我设法得到的只是来自 DLL 的错误“0”。有任何想法吗?任何人?

0 投票
3 回答
4044 浏览

com - 将 CComSafeArray 传递给期望 SAFEARRAY 的方法时,正确的语法是什么**

这很可能有一个非常简单的答案,但我无法弄清楚。

我正在尝试重构一些看起来像这样的代码:

我想将代码更改为:

但是当我执行这个时, sa 包含垃圾。发生了什么,为什么?什么是正确的语法?

0 投票
1 回答
4229 浏览

c# - 将自定义类型的 Safearray 从 C++ 传递到 C#

如何使用 aSafearray将一组自定义类型(仅包含属性的类)从 C++ 传递到 C#?使用VT_RECORD类型是正确的方法吗?

我正在尝试以下方式,但SafeArrayPutElement在尝试填充安全数组时返回错误,对类数组的引用作为 NULL 获取到托管代码。

我在托管世界中有以下内容:

非托管世界:

请注意,我可以使用SafeArray传递其他数组,BSTR这两个应用程序之间没有问题。所以这是传递结构所特有的。

斯特凡诺

0 投票
2 回答
2657 浏览

c# - 使用 SafeArrayGetElement 正确访问 VT_UNKNOWN 的 SafeArray

我们有一个 COM 组件,它的实现和接口定义存在于托管代码中,但由本机组件驱动。托管组件SafeArray通过以下方法声明返回到本机代码。

生成的本机签名正确地将其作为SafeArray.

在代码审查期间,尽管我们提出了一些关于使用 SafeArrayGetElement 调用结果数组的问题。问题是 SafeArrayGetElement 是否返回 AddRef 的IUnknown实例。本质上归结为以下哪一项是正确的

示例 1:

示例 2:

关于这个主题的文档非常薄。它仅包括以下行。

如果数据元素是字符串、对象或变量,则函数以正确的方式复制元素。

正确的定义有点模棱两可。

0 投票
1 回答
779 浏览

.net - 如何通过 COM 方法返回 .NET 对象数组

我有一个 .NET 程序集。它恰好是用 C++/CLI 编写的。我正在通过 COM 公开一些对象。一切正常,但我一生无法弄清楚如何从方法中返回我自己的对象数组。每次我这样做时,都会在运行时收到类型不匹配错误。我可以很好地返回一个整数或字符串数​​组。

这是我的主要课程

这是我要返回的课程

这是我调用它的(本机)C++ 代码:

调用 GetStuff() 会得到一个 _com_error 0x80020005 (DISP_E_TYPEMISMATCH)。我可以告诉我的方法被正确调用了,只是当 .NET/COM 去编组返回时,它会窒息。正如我所说,它适用于整数或字符串数​​组。我必须对我的班级做些什么才能让它在数组中返回?

碰巧的是,我的类将只包含几个字符串和一个 int(无方法),如果这样更容易的话。显然我已经尝试返回一个非空数组和实际包含一些数据的类,这只是说明问题的最简单的情况。

0 投票
3 回答
4692 浏览

c++ - 如何将本地 CComSafeArray 返回到 LPSAFEARRAY 输出参数?

我有一个 COM 函数,它应该通过LPSAFEARRAY*out 参数返回一个 SafeArray。CComSafeArray该函数使用 ATL 的模板类创建 SafeArray 。我的幼稚实现使用CComSafeArray<T>::Detach()为了将所有权从局部变量转移到输出参数:

问题是CComSafeArray::Detach()执行一个Unlock操作,以便当 SafeArray 的新所有者(sa在这种情况下为 main)被破坏时,锁不为零并且Destroy无法解锁 SafeArray E_UNEXPECTED(这会导致内存泄漏,因为 SafeArray 不是解除分配)。

通过 COM 方法边界在 CComSafeArrays 之间转移所有权的正确方法是什么?


编辑:从目前的单一答案看来,错误出在客户端(main)而不是服务器端(foo),但我很难相信这CComSafeArray不是为这个琐碎的用例设计的,必须有将 SafeArray 从 COM 方法转换为CComSafeArray.

0 投票
2 回答
14015 浏览

c++ - 如何构建指向 VARIANT 的 SAFEARRAY 指针?

我正在尝试通过以下方法使用 COM 组件:

如何在 C/C++ 中创建 paramValues 数组?

0 投票
1 回答
816 浏览

c++ - 将文本文件读入 Safearray

我需要读取一个文本文件并将数据存储到一个 Safearray 中。

我用这个功能试了一下:

问题是文件的大小大于读取的字节......

怎么了?

问候骆驼

0 投票
1 回答
2079 浏览

c# - 如何从 C# 将 UDT 的 SAFEARRAY 传递给未映射的代码

我还使用了 VT_RECORD。但是没有成功通过 UDT 的安全数组。

如果我在没有第一个参数的情况下与我的非托管代码进行通信,那么将“guids”参数传递给非托管代码就没有错误。

我还能够将在非托管端获得的 SAFEARRAY 元素转换为 GUID 类型。但是,如果我尝试使用 SAFEARRAY 将我的 UDT 类 MY_CLASS 传递给非托管代码,那么它在托管代码上会失败。(如上面的代码片段)

它显示异常“myapp.exe 中发生‘System.Runtime.InteropServices.SafeArrayTypeMismatchException’类型的未处理异常”“附加信息:指定的数组不是预期的类型。”

请在这种情况下帮助我将 UDT 的 SAFEARRAY 传递给未加密的代码。

0 投票
1 回答
2107 浏览

com - 如何将结构数组(包含 std:string 或 BSTR)从 ATL 传递到 C#。安全阵列?变种?

我有一个从 C# 使用的 ATL COM 对象。目前界面如下:

也就是说,它是一个非常简单的界面。我也有一些事件要发回。现在,我想在界面中添加一些内容。在 ATL 中,我有一些结果,它们当前是结构,看起来像 struct REPORT_LINE { string creationDate; 字符串标识;字符串摘要;}; 结构的所有成员都是st​​d::string。我有一个数组,我需要回到 C#。最好的方法是什么?

我怀疑有人会说,“嘿,你不能像那样通过 COM 发送 std::string。如果是这样,很好,但是修改结构的最佳方法是什么?将 std::string 更改为 BSTR?然后我该怎么做,1)设置 IDL 以传递结构数组(带有 BSTR 或 std::string 的结构) 2)如果我必须使用 SAFEARRAYS,我如何用结构填充 SAFEARRAYS。

除了使用简单类型外,我不熟悉 COM。