问题标签 [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.
.net - 如何删除从本机代码中的 .NET 函数返回的 SAFEARRAY?
我正在使用以下方法在我的 C++ 程序中托管一个 .NET 库,但不是一个详尽的列表:
并最终调用Invoke()
.
这工作得很好,但是每当 .NET 函数返回一个数组时,我都会泄漏内存,例如:
在这种情况下,函数返回 aVARIANT
类型VT_SAFEARRAY|VT_I4
。我已经尝试过描述符delete
和delete[]
pvData 成员,但这总是失败。我尝试SafeArrayDestroy()
了描述符,它成功但破坏了堆。我可以调用哪个工作正常,但SafeArrayDestroyData()
又会破坏堆。我仍在泄漏数组描述符。variant.parray->pvData
SafeArrayDestroyDescriptor()
那么,我怎样才能解除分配 SAFEARRAY 描述符并堵住这个内存泄漏呢?
c++ - 通过 COM 将自定义接口类型的 SAFEARRAY 返回到 VB6
是否可以将一组已定义的接口对象从 C++ COM 函数 (VC6) 返回到 VB6 客户端?我已经在网上搜索过,但无法找到任何描述我需要做的事情。我见过很多传递 BSTR 和 VARIANT 类型,但我需要一些方法让客户端真正使用我在数组中返回的接口类型。
我假设我需要做
的 - 使用 SAFEARRAY
- 将 SAFEARRAY 与 VT_UNKNOWN 类型一起使用,这反过来意味着我需要将对象作为 IUnknown 对象放入数组中。
从这里开始,我被难住了。是否可以在 VB6 中解释 IUnknown 类型,并以某种方式将其转换为我需要的类型?或者我是以完全错误的方式来解决这个问题......
澄清:
放置在集合中的接口用于模拟结构。我基本上需要传回一个结构数组。
c# - 如何创建一个 SafeArray C#?
我需要创建一个 SafeArray 以传递给 COM 方法。
如何在 C# 中创建/维护/销毁 SafeArray?
我以前从未遇到过 SafeArrays,并且通过快速的谷歌搜索找不到太多,因此非常感谢任何帮助。
编辑:添加示例代码:
COM 方法签名
C#中生成的互操作方法
所以在这种情况下,我必须创建一个 SafeArray 还是可以简单地将一个普通的 .Net 数组传递给 COM 方法 GetTags?
javascript - 如何在 Windows JScript 中创建 SAFEARRAY?
我想在 Windows JScript 中创建一个字节类型的 SAFEARRAY。
你能给我一些示例代码或指出正确的方向吗?
c# - 从 c++ DLL 和 c# 中释放 SAFEARRAY
我有一个获取数据的 c++ 函数,我从 c# 调用它。该函数获取指向 SAFEARRAY 的指针并用字符串填充它(使用 SysAllocString)
一切正常,但程序正在泄漏内存。
我做了一点搜索,发现如果我将此属性添加到方法签名中:
我需要在 C++ 代码中发布它(它被分配的地方),所以我创建了这个函数
在我的 dll 中我写了这段代码
但我有一个例外:
Tester.exe 中发生了“System.AccessViolationException”类型的未处理异常
附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。
怎么了?
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 中传递它们。
任何帮助表示赞赏,在此先感谢
c++ - 如何将自定义结构传递给 C++(非 CLI)中的 _variant_t?
我正在尝试传递一个结构,例如:
到 _variant_t 中,将其存储在 SAFEARRAY 中。我的方法是首先创建一个实例:
然后我通过引用将它放入 _variant_t
并将其存储在 SAFEARRAY 中:
那么我在这里的错误是什么?还有其他方法吗?如果是这样,我应该如何将这些结构的 SAFEARRAY 传递给 SAFEARRAY?有没有通用的方法?或者我错过了像 Recorddescription 这样的东西,因为这样 SAFEARRAY 不包含数据,它包含指向数据的指针。但是如何将数据存储在 SAFEARRAY 中?
问候内姆
com - 使用 JNI 访问变体的 SafeArray
我有一个带有返回 Variant 的函数的 VB6 ActiveX DLL。Variant 包含一个节点变量数组,每个变量包含一个字符串名称和两个数据数组(字符串和双精度)。我正在尝试通过 JNI 将其作为作业对象返回给 Java 程序。
我可以通过调用适当的 VB 函数并将 Variant 结果存储为 SAFEARRAY 来访问外部节点数组。它可以访问维度并获得下限和上限。但是,我无法通过 SafeArrayGetElement() 或 SafeArrayAccessData() 访问每个节点。我总是得到一个无效的参数异常。
1) 我可以将 SAFEARRAY (或 VARIANT) 直接传递或强制转换为作业对象,而无需遍历 C++ 中的节点吗?
2) 我是否使用了错误的参数来获取 SAFEARRAY 数据?是否需要预先分配访问指针(var)的大小?
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 示例中借用了这段代码。那么,有没有人知道发生了什么:
……该怎么办?
c++ - 错误:迭代 CComSafeArray 时 CComVariant::Copy 中的“错误变量类型”
第 (1) 行:fields.GetAt(i)
返回CComVariant
. 当我尝试将此值分配给复制构造函数中CComVariant fld
调用的复制构造函数和方法CComVariant::Copy
时。它引发异常(“错误的变量类型” DISP_E_BADVARTYPE (0x80020008L)
)。同时,第 (2) 行运行良好。第 (1) 行有什么问题,以及如何解决。
编辑:这是get_Field
(填充SAFEARRAY
)的代码。