Aus einem .NET-Dienst exportiertes COM-Objekt gibt E_NOINTERFACE zurückC++

Programme in C++. Entwicklerforum
Guest
 Aus einem .NET-Dienst exportiertes COM-Objekt gibt E_NOINTERFACE zurück

Post by Guest »

Ich verwende also eine ausführbare .NET Framework 4.8.1-Datei als Windows-Dienst.

Ich versuche, ein COM-Objekt daraus zu exportieren. Ich habe Folgendes:

Code: Select all

[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);
...
Auf der Clientseite (in C++) habe ich:

Code: Select all

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);
Ich habe alles versucht ... Die Implementierung als IDispatch funktioniert und ich kann die Methoden problemlos aufrufen, aber ich kann meine eigene Schnittstelle nicht erkennen !
Ich habe sogar ein TLB aus .net exportiert und es erfolgreich mit #import auf der CPP-Seite importiert und den Smart Pointer verwendet ... aber dort ist es dasselbe - CoCreateInstance mit IID_IUnknown funktioniert und dann gibt QueryInterface E_NOINTERFACE zurück.
Ich bin sogar noch weiter gegangen und habe IMyService von ICustomQueryInterface geerbt und implementiert GetInterface wie folgt:

Code: Select all

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;
}
Ich habe dann einen Debugger an den Dienst angehängt ... der Code WIRD aufgerufen, GetComInterfaceForObject gibt einen gültigen Zeiger zurück und immer noch in C++ erhalte ich E_NOINTERFACE.
Ich bin ratlos.
Hilfe? :)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post