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

c# - 将字符串数组从 COM 传递到 C#

我需要通过类似 COM 的接口访问 COM dll 中的 C# 方法。其中一种方法需要将字符串数组作为输入传递。

我正在创建一个 SAFEARRAY 并将其传递给 COM Interop。但是,这似乎不起作用,因为我在互操作层中看到了一个异常。(System.Runtime.InteropServices.SafeArrayTypeMismatchException)。

显然,预期的类型似乎有所不同。

在此处粘贴代码:

要调用的 C# 方法:

调用相同的 C++ 代码:

欢迎任何想法/建议。

0 投票
1 回答
1665 浏览

c# - 在 C# 中初始化 SAFEARRAY 引用(来自 VB 的端口?)

我正在使用第三方 COM 组件(即没有它的代码)。有问题的方法具有以下概述:

我试图将 ref 传递给固定大小的数组 ((Array)string[6]) 和 List.ToArray(),但它一直在我身上崩溃。例如

更具体地说:我已经尝试了任何大小的值(正确的值应该是 44)。对 List<> 的容量进行了同样的尝试,但这也无济于事。我也尝试了不同的类型,但它不接受除 int 之外的任何类型。

我不知道为什么它总是因为该 COM 组件的一般错误而崩溃(基本上表明出了点问题,但没有说到底是什么),因为我可以确认以下 VB 代码有效:

有谁知道为什么会发生这种情况?或者,任何人都可以为我提供将该 VB 代码移植到 C# 的端口吗?我曾尝试用谷歌搜索教程,但他们所说的只是“只允许使用固定大小的数组”。我想知道那个代码是如何工作的,因为没有指定大小。

感恩节

0 投票
3 回答
6109 浏览

delphi - 如何使用 BSTR 的 SAFEARRAY 显示来自 VARIANT 的值

我正在研究一个带有函数的 COM 对象库,该函数返回 a和VARIANTa SAFEARRAYBSTR如何显示此VARIANT实例中的值并将其保存在TStringList? 我试图在没有明确答案的情况下搜索网络。

我尝试了以下但没有成功:

0 投票
2 回答
4306 浏览

c++ - CComSafeArray 使用

我有一个 Com 功能:

我有以下代码:

我必须更改它,删除 ppData,并删除 Attach 命令。

它应该是这样的:

但这不起作用。CComArray 的发布可能存在问题。

我该怎么做?

0 投票
3 回答
8458 浏览

c++ - 通过 COM 发送和接收数组

通过 COM 接收和发送数组的正确方法是什么?到目前为止,这是我的尝试:一个包含在变体中的双精度数的安全数组。

问题: - 当前编译在循环操作上失败:error C2679: binary '=' : no operator found which takes a right-hand operand of type 'ATL::_ATL_AutomationType<DOUBLE>::_typewrapper' (or there is no acceptable conversion) 编辑:使用SetAt()而不是operator[]解决 - 我应该out_sa在堆上声明吗?当被解除分配时它会out被解除分配(我只能假设客户会这样做吗?)

任何帮助将不胜感激!

编辑 2:这是一个部分实现,它试图返回一个安全数组。

这也失败了;lisp 报告

CComSafeArray<double>用一组变体替换会产生相同的错误。

0 投票
1 回答
1368 浏览

c# - 无法将参数 1 从“char [25]”转换为“SAFEARRAY *”

我的 C++ 代码中有一个char sendBuf[sizeof(double)*3 + 1];

我的 c# com 代码方法Multicast( byte[] message)将字节数组作为参数。

那么为什么调用 Multicast(sendBuf) 不抛出这个错误cannot convert parameter 1 from 'char [25]' to 'SAFEARRAY *'

ist a char array a byte array in c/c++

那么我该如何将此 char* 转换为 safearray 呢?

我试过

cannot convert parameter 2 from 'int *' to 'LONG *'得到SafeArrayPutElement

0 投票
1 回答
421 浏览

c++ - COM TypeLib 中自动生成的 C++ 类在方法中不返回 SAFEARRAY

让我首先声明,我不是 COM 开发人员。我知道标准的 C++、C# 和 Java。

我有一个将从托管 C++ 调用的 C# 库。我使用 Visual Studio 2010 -> TypeLib 中的 MFC 类添加了 C++ 类。自动生成的 C++ 类虽然不能编译。它显然缺少返回语句。我该如何解决?我非常感谢任何帮助。

库中的 C# 类

托管 C++ 生成的类

0 投票
2 回答
1536 浏览

c++ - COM:访问冲突使 BSTR 的 SafeArray

下面的代码工作得很好,感谢您使用一个 COM 客户端,但使用新客户端(同一软件的更新版本)string_array_to_bstr_safearray_variant会引发访问冲突,一切都死了。

谁能告诉我我是否做错了我以前逃避的事情..?我没有正确分配内存吗?

编辑:调试器信息

如果没有调试器,我会遇到访问冲突。

使用调试器单步执行此代码似乎可以工作。 output_length设置正确;out_array被正确创建和填充out_variant,据我所知,通过变量观察也是如此。但是,COM 客户端仍然失败,说"lisp value has no coercion to VARIANT with this type: #<safearray...>"(这很奇怪,因为客户端的先前版本解释返回值就好了)。然后它崩溃并抱怨它的内存不足。

在调试器中运行代码,但让它运行而不是单步执行,它在 的构造函数中失败CComVariant,抱怨由于内部调用SafeArrayCopy失败而引发了无效参数。

编辑:在最近的另一个步骤中,它在循环中失败了,所以问题可能出在@terriblememory 所暗示的 CComSafeArray 上?

0 投票
1 回答
2959 浏览

c# - C# Marshal byte[] 到带有“ref object”签名的 COM SAFEARRAY 参数

我一直在谷歌上转来转去,我可以找到各种讨论,很多建议,但似乎没有任何效果。我有一个 ActiveX 组件,它将图像作为字节数组。当我进行 TLB 导入时,它带有以下签名:

我如何将 byte[] 传递给它?

还有另一个函数可以返回具有类似签名的数据,它之所以有效,是因为我可以传入“null”。返回的类型是字节[1..size](非零有界字节[])。但即使我尝试传入返回的内容,它仍然会出现类型不匹配异常。


更多细节:

我一直在编辑 IDispatch 接口签名中的方法(使用 ILSpy 从自动生成的互操作程序集中提取接口)。我几乎尝试了以下每种组合,它总是得到类型不匹配异常:

  1. 添加和删​​除“参考”
  2. 将参数数据类型更改为“byte[]”或“Array”
  3. 编组为 [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)]。在玩了一段时间 MarshalAs 之后,我开始确信 IDispatch 不使用这些属性。

还尝试按原样使用“ref object”接口,并传递不同的类型:byte[], Array.CreateInstance(typeof(byte) (我认为它们是相同的,但我发现有人建议它,所以它不能伤害尝试)。

下面是一个 Delphi 代码示例,它创建了一个适当的数组来传递:

这是执行相同操作的 C 代码。我想如果我不能让它在 C# 中工作,我可以通过托管 C++ 调用它,尽管我宁愿将所有东西都放在一个项目中:

0 投票
2 回答
740 浏览

c++ - C++ DLL only reading first char of a string contained in a safearray

I'm trying to figure out how to pass a user defined structure from a VB6 application to a C++ DLL.

Here's a sample of my VB6 code :

And a sample of my C++ code :

My Issue is, when I click "Command2", my log file looks like this :

Whereas, when I click "Command1", it looks like this :

Why does my C++ DLL recognize "char* Id" as a chain of characters when I pass a single item whereas when I use an array of items it looks like it recognizes it as a pointer to the first character?

And, most notably, how could I fix it? I tried using LBSTR instead of char* in my c++ struct, it didn't fix it, I also tried to add "elements(i).Id = String (255, vbNullChar)" berfore initializing the VB6 strings, but it didn't prove to be helpful either.

As usual, I'd like to thank all of you for the time you put into reading and trying to help.

On a side note : English is a foreign langage to me, so I hope I'm almost understandable and, of course, I apologize if it's not the case.

Edit :

I don't know if it could help, but after trying what Mark Bertenshaw suggested, I also tried this : in VB6 :

in C++ :

Which gave this weird result :