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?
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? –
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
Sieht gut aus. 'IPF400' ist da. Ihre IDL 'IPF400' ist ebenfalls leer, genau was Sie im kompilierten TLB sehen. –