Вызов C # dll из C ++ с использованием CoCreateInstance

мой ProjectA C# библиотека классов с одним единственным классом:

  namespace myLib
{
// Interface declaration.
[Guid("Some GUID")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ICsClass
{
[DispId(1)]
int Add(int Number1, int Number2);
};

[Guid("Some GUID")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("myLib.CsClas")]
public class CsClas : ICsClass
{
public int Add(int a, int b)
{
return a + b;
}
}
}

я проверил Register for com interop с помощью VS2010 который породил dll & tlb файлы для меня, хорошо до сих пор.

мой ProjectB Win32 Dll приложение с одним cpp файл:

    #import "MyLib.tlb" raw_interfaces_only
using namespace MyLib;

……………

#ifdef __cplusplus
extern "C"{
#endif
__declspec(dllexport) long Add(int a,int b)
{
CoInitialize(NULL);
long lResult = 0;
// Use Smart pointer
CComQIPtr <ICsClass> spCoClass;
if (SUCCEEDED (spCoClass.CoCreateInstance(L"myLib.CsClas")))
{
spCoClass->Add(a,b,&lResult);
wprintf(L"The result is %d\n", lResult);
std::cout << "#"+lResult << '\n';
}
CoUninitialize();
return lResult;
}
#ifdef __cplusplus
}
#endif

…….

Я могу собрать этот Dll, и все выглядит хорошо до сих пор.

Вопрос, когда я использую свою Win32 Dll & попробуйте вызвать функцию Add
эта строка:

 SUCCEEDED (spCoClass.CoCreateInstance(L"myLib.CsClas"))

Никогда не проходит, В чем может быть проблема, Не было ли оно зарегистрировано должным образом?

Любезно помочь.

1

Решение

Написанный код не дает вам хорошего способа диагностики ошибки. Напишите это так:

    HRESULT hr = spCoClass.CoCreateInstance(L"myLib.CsClas");
if (SUCCEEDED(hr)) {
// etc..
}

Типичный код ошибки: 0x80040154, «Класс не зарегистрирован». Etcetera.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]