问题标签 [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 回答
970 浏览

.net - 如何删除从本机代码中的 .NET 函数返回的 SAFEARRAY?

我正在使用以下方法在我的 C++ 程序中托管一个 .NET 库,但不是一个详尽的列表:

并最终调用Invoke().

这工作得很好,但是每当 .NET 函数返回一个数组时,我都会泄漏内存,例如:

在这种情况下,函数返回 aVARIANT类型VT_SAFEARRAY|VT_I4。我已经尝试过描述符deletedelete[]pvData 成员,但这总是失败。我尝试SafeArrayDestroy()了描述符,它成功但破坏了堆。我可以调用哪个工作正常,但SafeArrayDestroyData()又会破坏堆。我仍在泄漏数组描述符。variant.parray->pvDataSafeArrayDestroyDescriptor()

那么,我怎样才能解除分配 SAFEARRAY 描述符并堵住这个内存泄漏呢?

0 投票
3 回答
2139 浏览

c++ - 通过 COM 将自定义接口类型的 SAFEARRAY 返回到 VB6

是否可以将一组已定义的接口对象从 C++ COM 函数 (VC6) 返回到 VB6 客户端?我已经在网上搜索过,但无法找到任何描述我需要做的事情。我见过很多传递 BSTR 和 VARIANT 类型,但我需要一些方法让客户端真正使用我在数组中返回的接口类型。

我假设我需要做
的 - 使用 SAFEARRAY
- 将 SAFEARRAY 与 VT_UNKNOWN 类型一起使用,这反过来意味着我需要将对象作为 IUnknown 对象放入数组中。

从这里开始,我被难住了。是否可以在 VB6 中解释 IUnknown 类型,并以某种方式将其转换为我需要的类型?或者我是以完全错误的方式来解决这个问题......

澄清:
放置在集合中的接口用于模拟结构。我基本上需要传回一个结构数组。

0 投票
1 回答
10444 浏览

c# - 如何创建一个 SafeArray C#?

我需要创建一个 SafeArray 以传递给 COM 方法。
如何在 C# 中创建/维护/销毁 SafeArray?

我以前从未遇到过 SafeArrays,并且通过快速的谷歌搜索找不到太多,因此非常感谢任何帮助。

编辑:添加示例代码:

COM 方法签名

C#中生成的互操作方法

所以在这种情况下,我必须创建一个 SafeArray 还是可以简单地将一个普通的 .Net 数组传递给 COM 方法 GetTags?

0 投票
2 回答
2499 浏览

javascript - 如何在 Windows JScript 中创建 SAFEARRAY?

我想在 Windows JScript 中创建一个字节类型的 SAFEARRAY。
你能给我一些示例代码或指出正确的方向吗?

0 投票
1 回答
3110 浏览

c# - 从 c++ DLL 和 c# 中释放 SAFEARRAY

我有一个获取数据的 c++ 函数,我从 c# 调用它。该函数获取指向 SAFEARRAY 的指针并用字符串填充它(使用 SysAllocString)

一切正常,但程序正在泄漏内存。

我做了一点搜索,发现如果我将此属性添加到方法签名中:

我需要在 C++ 代码中发布它(它被分配的地方),所以我创建了这个函数

在我的 dll 中我写了这段代码

但我有一个例外:

Tester.exe 中发生了“System.AccessViolationException”类型的未处理异常

附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。

怎么了?

0 投票
2 回答
2299 浏览

c# - GUID 的 COM SAFEARRAY 从 C++ 返回到 C#

我目前遇到了需要将 SAFEARRAY(GUID) 作为返回值从 C++ 传递到 C# 的问题。

目前,C# 端正在使用从 Tlbimp.exe(类型库导入器)生成的 Interop dll。

IDL 是:

我也试过 [out, retval]

函数签名是:

如果我使用SafeArrayCreate()or SafeArrayCreateVector()

我得到一个 NULLSAFEARRAY指针,它应该指示E_OUTOFMEMORY哪个不正确。

我确实发现这VT_CLSID仅适用于 Ole 属性集而不是 SAFEARRAY 的: http://poi.apache.org/apidocs/org/apache/poi/hpsf/Variant.html它表明 CLSID 是

我还尝试了使用: SafeArrayAllocDescriptor()和构建安全数组的替代方法SafeArrayAllocData()

这让我可以创建数组,但是在填充它时,SafeArrayPutElement()我得到一个 0x80070057 的 HRESULT(参数不正确)。这可能是因为它也需要VT_CLSID参数

我可以手动填充它SafeArrayAccessData()

但我从 C# 端收到一个错误:“该值不在预期范围内”

我不确定如何通过 retval 或 out 参数完成将 SAFEARRAY(GUID) 返回到 C# 的所需功能。

看起来应该很简单——在 IDL 中有很多区域我已经在传递 GUID 而没有任何 UDT 或编组。一切正常,直到我需要在 SAFEARRAY 中传递它们。

任何帮助表示赞赏,在此先感谢

0 投票
2 回答
2306 浏览

c++ - 如何将自定义结构传递给 C++(非 CLI)中的 _variant_t?

我正在尝试传递一个结构,例如:

到 _variant_t 中,将其存储在 SAFEARRAY 中。我的方法是首先创建一个实例:

然后我通过引用将它放入 _variant_t

并将其存储在 SAFEARRAY 中:

那么我在这里的错误是什么?还有其他方法吗?如果是这样,我应该如何将这些结构的 SAFEARRAY 传递给 SAFEARRAY?有没有通用的方法?或者我错过了像 Recorddescription 这样的东西,因为这样 SAFEARRAY 不包含数据,它包含指向数据的指针。但是如何将数据存储在 SAFEARRAY 中?

问候内姆

0 投票
1 回答
976 浏览

com - 使用 JNI 访问变体的 SafeArray

我有一个带有返回 Variant 的函数的 VB6 ActiveX DLL。Variant 包含一个节点变量数组,每个变量包含一个字符串名称和两个数据数组(字符串和双精度)。我正在尝试通过 JNI 将其作为作业对象返回给 Java 程序。

我可以通过调用适当的 VB 函数并将 Variant 结果存储为 SAFEARRAY 来访问外部节点数组。它可以访问维度并获得下限和上限。但是,我无法通过 SafeArrayGetElement() 或 SafeArrayAccessData() 访问每个节点。我总是得到一个无效的参数异常。

1) 我可以将 SAFEARRAY (或 VARIANT) 直接传递或强制转换为作业对象,而无需遍历 C++ 中的节点吗?

2) 我是否使用了错误的参数来获取 SAFEARRAY 数据?是否需要预先分配访问指针(var)的大小?

0 投票
1 回答
2978 浏览

c++ - 带有 ccomobjects 安全数组的 ATL C++ 内存泄漏

我发现自己需要帮助。现在,我对 C++ 并不是那么陌生,但是将它与 ATL 结合起来会带来全新的混乱。无论如何,我的问题:我(最终)设法将我的 COM 方法中的对象数组返回给 C# 调用者。但是在“测试”(多次重复运行所述功能)时,我发现了一个的内存泄漏。

IDL 摘录:

标题摘录:

代码:

我实例化 CDISNet 对象并将一些数据放入其中(Convert())。我把它们放在我的安全阵列中并释放。据我了解,销毁它们的责任转移到了安全阵列。之后,我将数组放入一个 VARIANT 中,这样我就可以填写我的 [out, retval] 参数。因为它是一个输出参数,所以销毁的责任应该转移给调用者(在我的例子中是 C#,即它的 GarbageCollector)。我处置了我的动态数组“netz”并销毁了 safearray 包装器。

那么我错过了什么?剩下什么分配?(这个项目真的让我很欣赏 .net 的所有便利)。

帮助。请。

编辑:进一步的调试告诉我问题肯定出在我的 CComObject 对象中。他们没有被释放。如果我delete net;在每次迭代中,数组也会丢失数据。我不确定如何纠正...

EDIT2:好的,我在这段代码周围看了一会儿,当我注释掉变体装箱时,泄漏似乎消失了。问题是我从 safearrays 上的 Visual Studio 示例中借用了这段代码。那么,有没有人知道发生了什么:

……该怎么办?

0 投票
2 回答
2371 浏览

c++ - 错误:迭代 CComSafeArray 时 CComVariant::Copy 中的“错误变量类型”

第 (1) 行:fields.GetAt(i)返回CComVariant. 当我尝试将此值分配给复制构造函数中CComVariant fld调用的复制构造函数和方法CComVariant::Copy时。它引发异常(“错误的变量类型” DISP_E_BADVARTYPE (0x80020008L))。同时,第 (2) 行运行良好。第 (1) 行有什么问题,以及如何解决。

编辑:这是get_Field(填充SAFEARRAY)的代码。