2010-11-27 6 views
5

Ich entwickle Plug-in für Win32 mit Mingw und Crosscompilation von Linux. Obwohl mein Plugin erfolgreich von der Anwendung geladen wurde und ich sogar eine COM-Schnittstelle von der App bekam, kann ich Funktionen von dort nicht aufrufen - App ist abgestürzt. Ich denke, dass dies auf falsche vtable Ausrichtung der Schnittstellenimplementierung in Mingw zurückzuführen ist (dies funktionierte perfekt mit MSVS).Wie stelle ich die Ausrichtung für virtuelle Funktionen ein?

Jede Hilfe wird geschätzt, danke.

Antwort

4

VTable Ausrichtung (in der Tat das gesamte VTable-System überhaupt) ist vollständig implementierungsabhängig. Sie müssen den gleichen Compiler verwenden, der mit den gleichen Switches/Einstellungen kompiliert wurde, um nach der Verknüpfung ein funktionsfähiges Programm zu haben.

Sie können msvc generierte Binärdateien aus diesem Grund nicht mit MinGW generierten Binärdateien verknüpfen. Selbst wenn Sie die Tabellen zum Ausrichten erhalten, sind die Namen-Mangling-Algorithmen anders und niemand sagt, dass die beiden Compiler die gleiche Reihenfolge für die einzelnen Funktionen innerhalb der V-Tabelle selbst wählen würden.

Wenn Sie eine portable Schnittstelle zwischen den beiden Compilern benötigen, dann müssen Sie es mit einer C-Schnittstelle (technisch eine extern "C"), die eine standardisierte ABI hat.

+1

COM ist auch eine ABI, aber vielleicht eine, die MinGW nicht so einfach unterstützt. :) (COM basiert auf der Annahme, dass alle C++ - Compiler auf einer bestimmten Plattform die gleiche Vtable-Struktur und das gleiche Layout verwenden. Ich bin überrascht, dass MinGW es so schwierig macht, dass COM ein wichtiger Teil von Win32 ist Andere C++ - Compiler unterstützen zwar COM, aber Sie müssen nicht C oder den gleichen Compiler verwenden, sondern einen anständigen C++ - Compiler für Windows. Natürlich können Sie COM auch in C (dem von der IDL-Compiler definiert normalerweise auch eine C-Schnittstelle, wenn es einfacher ist. –

Verwandte Themen