COM-объект, экспортированный из службы .NET, возвращает E_NOINTERFACE.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 COM-объект, экспортированный из службы .NET, возвращает E_NOINTERFACE.

Сообщение Anonymous »

Итак, я запускаю исполняемый файл .NET Framework 4.8.1 в качестве службы Windows.

Я пытаюсь экспортировать из него 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);
...
На стороне клиента (в C++) у меня есть:

Код: Выделить всё

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);
Я все перепробовал... Реализация как IDispatch работает, и я могу без проблем вызывать методы, но не могу заставить его распознавать мой собственный интерфейс !
Я даже экспортировал 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;
}
Затем я подключил к службе отладчик... код вызывается, GetComInterfaceForObject возвращает действительный указатель, и по-прежнему на C++ я получаю E_NOINTERFACE.
Я в тупике.
Помочь? :)

Подробнее здесь: https://stackoverflow.com/questions/793 ... ointerface
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»