мой 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"))
Никогда не проходит, В чем может быть проблема, Не было ли оно зарегистрировано должным образом?
Любезно помочь.
Написанный код не дает вам хорошего способа диагностики ошибки. Напишите это так:
HRESULT hr = spCoClass.CoCreateInstance(L"myLib.CsClas");
if (SUCCEEDED(hr)) {
// etc..
}
Типичный код ошибки: 0x80040154, «Класс не зарегистрирован». Etcetera.
Других решений пока нет …