Я пытаюсь экспортировать из него COM-объект. У меня есть следующее:
Код: Выделить всё
[Guid("....")]
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMyService
{
void DoWork();
}
[ComVisible(true)]
[Guid("...AnotherGuid...")]
[ClassInterface(ClassInterfaceType.None)]
public class MyService : IMyService
{
void DoWork() { }
}
...
RegistrationServices regServices = new RegistrationServices();
int result = regServices.RegisterTypeForComClients(
typeof(MyService),
RegistrationClassContext.LocalServer,
RegistrationConnectionType.MultipleUse);
...
Код: Выделить всё
GUID classGuid = { ... guid of MyService ... };
GUID ifaceGuid = { ... guid of IMyService ... };
IUnknown* p;
// This returns E_NOINTERFACE !
auto hr = CoCreateInstance(classGuid, CLSCTX_ALL, NULL, ifaceGuid, (LPVOID*)&p);
Я даже экспортировал tlb из .net и успешно импортировал его с помощью #import на стороне cpp и использовал интеллектуальный указатель... но там то же самое - CoCreateInstance с IID_IUnknown работает, а затем QueryInterface возвращает E_NOINTERFACE.
Я даже пошел дальше и унаследовал IMyService от ICustomQueryInterface и реализовал GetInterface следующим образом:
Код: Выделить всё
public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPtr ppv)
{
if (iid == typeof(IMyService).GUID)
{
ppv = Marshal.GetComInterfaceForObject(this, typeof(MyService), CustomQueryInterfaceMode.Ignore);
return CustomQueryInterfaceResult.Handled;
}
ppv = IntPtr.Zero;
return CustomQueryInterfaceResult.NotHandled;
}
Я в тупике.
Помочь?
Подробнее здесь: https://stackoverflow.com/questions/793 ... ointerface
Мобильная версия