2016-08-14 1 views
1

Ich schreibe ein Plugin, das eine Schnittstelle von Drittanbietern in C++ implementiert. Ich habe ein ATL-Projekt in MSVS erstellt, ein einfaches ATL-Objekt hinzugefügt und dann die Verknüpfung "Implement Interface" für diese Klasse verwendet. Alle Schnittstellenmethoden wurden stubbed und es baut. Ich habe auch hinzugefügt:Implementierung einer COM-Schnittstelle in C++, Methoden werden nicht offengelegt

[assembly:System::Runtime::InteropServices::ComVisible(true)]; 

und haben diese laufen (erfolgreich) nach dem Build:

regsvr32.exe VWorksCPPATL.dll 
regasm /codebase /tlb VWorksCPPATL.dll 

Allerdings, wenn ich die DLL in OLEVIEW öffnen, ich sehe keine der Methoden des Interface ausgesetzt (abgesehen von IUnknown) und die DLL wird nicht vom Container für das Plugin geladen.

Wenn ich eine funktionierende DLL öffne, die ich in C# geschrieben habe, sehe ich die Interfaces, die ich implementiert habe, und ihre Methoden unter der Co-Klasse aufgelistet. (Ich hatte die Attribute "Register für COM-Interop" und "make assembly COM-visible" im Projekt).

Wenn ich Arbeits-DLLs öffne, die der Hersteller (Ersteller des Plugin-Containers) in C++ geschrieben hat, sehe ich die exponierte Methoden/Schnittstellen in einigen, aber nicht allen DLLs.

Muss ich meine IDL-Datei manuell ändern, um diese Methoden verfügbar zu machen? Jetzt zeigt es (Attribute weggelassen):

interface IPF400 : IDispatch{} 
library VWorksCPPATLIB{ 
    coclass PF400{ 
     [default] interface IPF400; 
    } 
} 

... Oder habe ich wahrscheinlich Probleme aus anderen Gründen?

+0

Wird in COM/OLE Viewer überhaupt eine leere Typbibliothek oder keine Typbibliothek angezeigt? Siehst du, was du in einer .TLB-Datei benötigst, die zwischen temporären Erstellungsdateien produziert wird? –

+0

Der temporäre TLB und der eingebettete TLB sind identisch. Sie enthalten nur die IDispatch-Member (GetTypeInfoCount usw.). Hier eingefügt: https://gist.github.com/bbjornson/8805c2e85b3d70dd2248dd387fbcf231. Ich nehme an, dass ich die IDL-Datei ändern muss, um zu sagen, dass ich die anderen Schnittstellen implementiere, aber ich hoffe, dass es einen automatischen Weg gibt, das zu tun. – ZachB

+0

Sieht gut aus. 'IPF400' ist da. Ihre IDL 'IPF400' ist ebenfalls leer, genau was Sie im kompilierten TLB sehen. –

Antwort

1

Okay, ich die Anweisungen in this answer folgen hatte den TLB aus dem DLL zu exportieren, die die Schnittstelle enthält, die ich Implementierung, dann fügen Sie importlib("....tlb") und interface IFooInterface auf die IDL-Datei manuell (Attribute weggelassen):

interface IPF400 : IDispatch{ 
}; 

library VWorksCPPATLLib 
{ 
    importlib("stdole2.tlb"); 
    importlib("IWorksDriver.tlb"); // <-- Added 

    coclass PF400 
    { 
     interface IControllerClient; // <-- Added 
     [default] interface IPF400; 
    }; 

}; 
Verwandte Themen