草庐IT

SAFEARRAY

全部标签

c++ - 从 SAFEARRAY 中获取一个元素(或将其转换为长数组)

我正在尝试从VisualC++中的SAFEARRAY(作为函数的输出返回)获取元素。我以前从未使用过SAFEARRAY,所以我不知道如何处理它。我应该将SAFEARRAY转换为长数组(如何?)还是可以简单地使用SAFEARRAY中的值的索引? 最佳答案 您应该熟悉MSDN上的SafeArray文档。您可能想要做的是调用SafeArrayAccessData()获取指向安全数组的内存缓冲区的指针,然后直接迭代值。这可能是访问值的最有效方式。下面的代码假设了很多,你应该确保你理解这些假设(通过阅读安全数组文档)并且它们适用于你的特定情况

c# - 需要从非托管 C++ 代码调用托管代码

我用C#写了COM类,一个函数是这样的:publicvoidSignAttached(byte[]message,refbyte[]signedMessage,stringuserName="USER")当我尝试从C++代码调用此函数时,我遇到了异常:-“等级12536的SafeArray已传递给期望等级为1的数组的方法。未知错误0x80131538”,并且每次都更改第一等级,C++代码:SAFEARRAY*message=SafeArrayCreateVector(VT_UI1,0,1);SAFEARRAY*signedMessage=SafeArrayCreateVector(VT

c++ - 通过COM将自定义接口(interface)类型的SAFEARRAY返回给VB6

是否可以从C++COM函数(VC6)向VB6客户端返回一组已定义的接口(interface)对象?我已经在网上搜索过,但没有找到任何描述我需要做什么的内容。我已经看到很多传递BSTR和VARIANT类型,但我需要一些方法让客户端实际使用我在数组中返回的接口(interface)类型。我认为我需要做的事情-使用安全阵列-使用具有VT_UNKNOWN类型的SAFEARRAY,这反过来意味着我需要将对象作为IUnknown对象放入数组中。从这里开始我就难住了。是否可以在VB6中解释IUnknown类型,并以某种方式将其转换为我需要的类型?还是我以完全错误的方式解决这个问题......澄清:放

c++ - 将变体 SAFEARRAY 转换为 STL 容器的通用函数

我有一些函数可用于将2D变体SAFEARRAY转换为各种STL容器,有点像这样(仅供说明)templatestd::setSetFromSafeArray(VARIANTsrcArray){CComSafeArraysrcComArray(srcArray.parray);std::setdestContainer;for(ULONGi=0;i我觉得这不是一种非常符合C++风格的处理方式,这意味着我转换到的每个STL容器都有一个单独的函数。我的想法是为CComSafeArrays编写一个包装器和自定义迭代器,这样我就可以...std::copy(srcComArray.begin(),

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

如何使用Safearray将一组自定义类型(仅包含属性的类)从C++传递到C#?使用VT_RECORD类型是否正确?我正在尝试以下方式,但是SafeArrayPutElement在尝试填充safearray时返回错误对类数组的引用作为托管代码获取空值。我在托管世界中有类似以下内容:[ComVisible(true)]publicinterfaceIStatistics{doubleMean{get;set;}doubleStdDev{get;set;}}[Serializable][ComVisible(true)]publicclassStatistics:IStatistics{p

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

我目前遇到需要将SAFEARRAY(GUID)作为返回值从C++传递到C#的问题。目前C#端正在使用从Tlbimp.exe(类型库导入程序)生成的Interopdll。IDL是:HRESULTGetGuids([out]SAFEARRAY(GUID)*guids);我也试过[out,retval]函数签名是:HRESULTWINAPIMyClass::GetGuids(SAFEARRAY**guids)如果我使用SafeArrayCreate()或SafeArrayCreateVector():SAFEARRAY*psapsa=SafeArrayCreate(VT_CLSID,1,rg

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

我正在尝试通过以下方法使用COM组件:HRESULT_stdcallRun([in]SAFEARRAY(BSTR)paramNames,[in]SAFEARRAY(VARIANT*)paramValues);如何在C/C++中创建paramValues数组? 最佳答案 添加到上面的答案以供future读者引用:在IDL中,SAFEARRAY(...)表示指向数组描述符的指针。但在C++中,SAFEARRAY表示数组描述符。所以IDL的SAFEARRAY(...)真的是C++的SAFEARRAY*.这让我困惑不已。为了让事情变得更有趣

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

我有一个应该通过LPSAFEARRAY*返回SafeArray的COM函数出参数。该函数使用ATL的CComSafeArray创建SafeArray模板类。我天真的实现使用CComSafeArray::Detach()为了将所有权从局部变量转移到输出参数:voidfoo(LPSAFEARRAY*psa){CComSafeArrayret;ret.Add(CComVariant(42));*psa=ret.Detach();}intmain(){CComSafeArraysa;foo(sa.GetSafeArrayPtr());std::cout问题是CComSafeArray::Det

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

我有一个获取数据的c++函数,我从c#调用它。该函数获取指向SAFEARRAY的指针并用字符串填充它(使用SysAllocString)一切正常,但程序正在泄漏内存。我稍微搜索了一下,发现如果我在方法签名中添加这个属性:[MarshalAs(UnmanagedType.SafeArray,SafeArraySubType=VarEnum.VT_BSTR)]outstring[]strServerList我需要在c++代码中释放它(它是在哪里分配的),所以我创建了这个函数[DllImport("Native.dll",CallingConvention=CallingConvention

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

我有一个获取数据的c++函数,我从c#调用它。该函数获取指向SAFEARRAY的指针并用字符串填充它(使用SysAllocString)一切正常,但程序正在泄漏内存。我稍微搜索了一下,发现如果我在方法签名中添加这个属性:[MarshalAs(UnmanagedType.SafeArray,SafeArraySubType=VarEnum.VT_BSTR)]outstring[]strServerList我需要在c++代码中释放它(它是在哪里分配的),所以我创建了这个函数[DllImport("Native.dll",CallingConvention=CallingConvention
12