gpt4 book ai didi

c# - COM C#,如何用C++调用COM

转载 作者:太空狗 更新时间:2023-10-29 21:45:58 27 4
gpt4 key购买 nike

我使用了C# COM的在线示例,并通过C++调用它。以下是C# COM代码,只有一个接口(interface)“ICalc”和一个类“Calc”。

namespace COMLib
{
[Guid("F40D7BC9-CF53-4613-AA5E-F269AD73808F")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ICalc
{
[DispId(1)]
long Factorial(int n);
}

[Guid("8EE38F2E-75BE-4B45-87B6-3F6D15FDBBC5")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(ICalc))]
[ProgId("MyCalc")]
public class Calc : ICalc
{
long ICalc.Factorial(int n)
{
long fact = 1;
for (int i = 1; i <= n; i++)
fact *= i;
return fact;
}
}
}

下面的代码是在C++中调用this函数的。它起作用了。但是,我对第二行的代码感到困惑。 “ICalcPtr”从哪里来?或者这是某种机制?

CoInitialize(NULL);
COMLib::ICalcPtr pCalc;
HRESULT hRes = pCalc.CreateInstance(__uuidof(COMLib::Calc));
if(FAILED(hRes))
printf("ICalcPtr::CreateInstance failed w/err 0x%08lx\n", hRes);
else
{
printf("%d\n", pCalc->Factorial(3));
}
system("pause");
CoUninitialize();
return 0;

最佳答案

如果您的代码有效,那是因为在 C++ 项目的某处,定义了以下语句(例如,如果您使用 #import directive,它是自动的):

_COM_SMARTPTR_TYPEDEF(ICalc, __uuidof(ICalc));

_COM_SMARTPTR_TYPEDEF 是一个在 ICalc 上定义“智能指针”的宏。它是 Microsoft Visual C++ 神奇的扩展,可以更轻松地支持 COM。官方文档在这里:_com_ptr_t Class

A smart pointer is usually referenced by the typedef definition provided by the _COM_SMARTPTR_TYPEDEF macro. This macro takes an interface name and the IID and declares a specialization of _com_ptr_t with the name of the interface plus a suffix of Ptr.

关于c# - COM C#,如何用C++调用COM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16380580/

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