Я использовал онлайн-пример C# COM и назову его через C++. Ниже приведен код C# COM, только один интерфейс «ICalc» и один класс «Calc».COM C#, Как использовать C++ для вызова COM
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'? Это расширение Visual Studio, которое генерирует классы на основе библиотеки типа COM (.tlb). http://msdn.microsoft.com/en-us/library/8etzzkb6%28v=vs.71%29.aspx – shf301