【发布时间】:2013-04-29 03:16:06
【问题描述】:
我使用了一个 C# COM 的在线示例,并通过 C++ 调用它。下面是C#的COM代码,只有一个接口“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++ 中调用此函数。它是有效的。但是,我对第二行中的代码感到困惑。 “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;
【问题讨论】:
-
您有
#import声明吗?这是基于 COM 类型库 (.tlb) 生成类的 Visual Studio 扩展。 msdn.microsoft.com/en-us/library/8etzzkb6%28v=vs.71%29.aspx