gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:46 27 4
gpt4 key购买 nike

是否可以从 C++ COM 函数 (VC6) 向 VB6 客户端返回一组已定义的接口(interface)对象?我已经在网上搜索过,但没有找到任何描述我需要做什么的内容。我已经看到很多传递 BSTR 和 VARIANT 类型,但我需要一些方法让客户端实际使用我在数组中返回的接口(interface)类型。

我认为我需要做的事情
- 使用安全阵列
- 使用具有 VT_UNKNOWN 类型的 SAFEARRAY,这反过来意味着我需要将对象作为 IUnknown 对象放入数组中。

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

澄清:
放置在集合中的接口(interface)被用来模仿一个结构。我基本上需要传回一个结构数组。

最佳答案

我想出了一个适合我的目的的解决方案,尽管与我在问题中提出的不完全一样。

我的解决方案是创建一个 COM 函数,它将 SAFEARRAY 作为参数并对其进行修改,而不是返回创建的数组。 VB6 客户端实例化数组,并将其传递给 C++ 进行填充。我设想 future 的使用将包括一个前体函数,VB6 调用该函数来确定所需的数组大小。作为引用,这里是代码片段:

接口(interface)函数:

[id(4), helpstring("method PopulateWithStruct")] HRESULT PopulateWithStruct([in,out]SAFEARRAY (IReturnStruct*)*ppArray, [out,retval] long*plResult);

其中 IReturnStruct 是一个包含属性值的接口(interface),充当结构:

interface IReturnStruct : IDispatch
{
[propget, id(1), helpstring("property num1")] HRESULT num1([out, retval] long *pVal);
[propget, id(2), helpstring("property str1")] HRESULT str1([out, retval] BSTR *pVal);
};

并由ReturnStruct实现

[
uuid(843870D0-E3B3-4123-82B4-74DE514C33C9),
helpstring("ReturnStruct Class")
]
coclass ReturnStruct
{
[default] interface IReturnStruct;
};

PopulateWithStruct 具有以下定义:

STDMETHODIMP CCTestInterface::PopulateWithStruct(SAFEARRAY **ppArray, long *plResult)
{
long lLowerBound = -1;
long lUpperBound = -1;
SafeArrayGetLBound(*ppArray, 1, &lLowerBound);
SafeArrayGetUBound(*ppArray, 1, &lUpperBound);

long lArraySize = lUpperBound - lLowerBound;

VARTYPE type;
SafeArrayGetVartype(*ppArray, &type);

if (lArraySize > 0)
{
for ( int i = lLowerBound; i < lUpperBound; ++i)
{
CComPtr<CReturnStruct> pRetStruct;
HRESULT hr = CoCreateInstance(__uuidof(ReturnStruct), NULL, CLSCTX_ALL, __uuidof(IUnknown), reinterpret_cast<void **>(&pRetStruct));
if (SUCCEEDED(hr))
{
pRetStruct->Initialise();
hr = SafeArrayPutElement(*ppArray, (long*)&i, pRetStruct);
if (FAILED(hr))
{
return hr;
}
pRetStruct.Release();
}
}
SafeArrayUnaccessData(*ppArray);
}

*plResult = 1;

return S_OK;
}

在 VB 方面:

Dim obj As ATL_SERVICETESTLib.CTestInterface
Set obj = New CTestInterface

Dim Result As Long
Dim RetStructs(3) As ReturnStruct

Result = obj.PopulateWithStruct(RetStructs())

对这种方法有什么意见吗?

关于c++ - 通过COM将自定义接口(interface)类型的SAFEARRAY返回给VB6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5631009/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com