gpt4 book ai didi

c# - 从非托管代码 : SAFEARRAY 调用托管 COM

转载 作者:行者123 更新时间:2023-11-28 06:30:33 27 4
gpt4 key购买 nike

我有一个用 VB.net 编写的 COM 组件。此 COM 组件的接口(interface)是

Public Interface IEdge
Function FooFunc() As Integer
Function Exec(ByVal modelName As String, ByVal Params As Object()) As Object
Sub Foo()
Sub Fooint(ByVal a As Integer)
End Interface

我在 native C++ 代码中使用此 COM 组件的类型库

#import "..\Edge.tlb" named_guids raw_interfaces_only

Main 的 C++ 代码是

int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = CoInitialize(NULL); //Initialize all COM Components

ICOMEdgePtr myEdge;
HRESULT hRes = myEdge.CreateInstance(CLSID_COMEdge);
if (hRes == S_OK)
{
VARIANT lResult ;
BSTR str;

myEdge->Foo();
myEdge->Fooint(1234);
long abc = 0;
myEdge->FooFunc(&abc);

SAFEARRAYBOUND aBound[2];
aBound[1].cElements = 2;
aBound[1].lLbound = 0;
SAFEARRAY* sf = SafeArrayCreate(VT_INT, 1, &aBound[1]);

long index1=0;
int val1=20;
SafeArrayPutElement(sf, &index1, &val1);

long index2=1;
int val2=30;
SafeArrayPutElement(sf, &index2, &val2);

myEdge->Exec(L"Add", sf, &lResult);
//Using lResult after this
}

CoUninitialize ();
return 0;
}

我可以调用 FooFunc() , Foo() , Fooint() .

但我无法调用Exec功能,它没有显示任何错误,没有报告崩溃。

为了测试,我在 VB.net 中使用了这个 COM 组件(使用 CreateObject(CLSID) )并且可以从那里调用 Exec。我需要从 native C++ 调用它。

我怀疑 SafeArray 有问题和 Object()转换。接口(interface)定义错误?

我试过 System.Array , <MarshalAs(UnmanagedType.SafeArray)>但没有什么能解决问题。我放了一个MsgBox()作为 Exec 的第一条陈述定义这样我就可以知道是否 Exec被调用。

最佳答案

根据 Hans Passant 的建议,我可以使用 SAFEARRAY。

我在 C++ 中使用基于 Dotnet 的 COM 组件。最后,我更改了 C++ 代码以保证 COM 的安全。

我已将 VARIANT 替换为 CComVariant,将 BSTR 替换为 CComBSTRSAFEARRAY使用 CComSafeArray

现在 Main 的代码如下所示:

int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = CoInitialize(NULL); //Initialize all COM Components

ICOMEdgePtr myEdge;
HRESULT hRes = myEdge.CreateInstance(CLSID_COMEdge);
if (hRes == S_OK)
{
CComVariant lResult ;
CComSafeArray<VARIANT> arr(2,0);
arr[0] = 20;
arr[1] = 30;

CComBSTR methodName;
methodName = L"Add";

myEdge->Exec(methodName, arr, &lResult);
wprintf(L"The result is %d\n", lResult.intVal);
//Using lResult after this
}

CoUninitialize ();
return 0;
}

关于c# - 从非托管代码 : SAFEARRAY 调用托管 COM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27665488/

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