Seite 1 von 1

QT-DLL mit VC aufrufen

Verfasst: 31. Oktober 2009 23:42
von allieno
Ich habe ein Problem eine DLL die mit QT erstellt worden ist in MS Visual C++ aufzurufen.

Es ist möglich, die DLL innerhalb eines Beispiel-Client-Programm zu kreieren , jedoch ist es danach nicht mehr möglich eine weitere Methoden der DLL aufzurufen. Dies führt zum Absturz. :cry:

Ein Frage vorweg: ist es grundsätzlich möglich eine QT-DLL mit einem in MS Visual C++ entwickelten Client-Programm aufzurufen , oder führt dies grundsätzlich zu Kompatibilitätsproblemen?


Danke für Eure Hilfe !!!

Folgendes ist die client.cpp Datei : (wenn erwünscht kann ich auch weitere Sourcecodefiles hinzufügen)


Das Programm funktioniert bis a->printOut(); der Aufruf selber führt , wie erwähnt zum Absturz. Die QT-DLL enthält jedoch gans sicher dieses Methode!!!



#include "stdafx.h"
#include "expclass.h"
#include "forcecast.h"
#include "classldr.h"
#include <malloc.h>

int main(int argc, char* argv[])
{

TCHAR szDllPath[MAX_PATH];
HMODULE hMod;

do
{
_tprintf(TEXT("Please enter the dll to load the class from:\n"));
_tscanf(TEXT("%s"), szDllPath);
// szDllPath = "qtdll");
}
while ((hMod = LoadLibrary(szDllPath)) ?
false :
_tprintf(TEXT("Failed to Load the dll. GetLastError returns: 0x%X\n"), GetLastError()));


/* Virtual Function table method */
_tprintf(TEXT("Importing by Virtual Function Table:\n\n"));


typedef QtTest* (*PFNCreate)();

_tprintf(TEXT("Creating an Object of QTTest through Default Constructor\n"));


PFNCreate pfnCreate = (PFNCreate)GetProcAddress(hMod, TEXT("CreateObject"));

QtTest* a = (pfnCreate)();


a->printOut();


//TODO
//delete a;
_tprintf(TEXT("NULL\n"));

a = NULL;
}

return 0;
}

Verfasst: 31. Oktober 2009 23:53
von Christian81
Warum muss die DLL überhaupt während der Laufzeit dynmaisch geladen werden anstatt einfach dagegen zu linken??
Des weiteren sind die Namen der Funktionen und Klassen aufgrund des C++ name manglings definitiv nicht so wie Du sie erwartest. Es gibt ziemlich sicher keine Funktion "CreateObject" in deiner DLL. Das kannst du auch auch z.B. mit 'pexports' nachschauen.
Und selbst wenn - den Pointer auf einer Klassenfunktion via GetProcAdress zu holen geht definitiv nicht.

Verfasst: 1. November 2009 01:44
von allieno
Danke schonmal

Das Ziel ist eine DLL zu erstellen, die wiederum von anderen Programmen eigesetzt wird. Der Client dient nur dazu, die DLL zu testen. (Deswegen ist das dagegenlinken einer Libary keine befriedigende Lösung)

Warum geht es nicht "den Pointer auf einer Klassenfunktion via GetProcAdress zu holen"???

im folgenden Beispiel wird dies auch so gemacht
http://www.codeguru.com/cpp/w-p/dll/imp ... .php/c123/

Verfasst: 1. November 2009 10:10
von Christian81
Dort ist es keine Klassenfunktion sondern eine normale Funktion welche als C-Funktion exportiert wurde.
Das Stichwort habe ich ja schon gegeben - name mangling
Was du machen möchtest geht nur per Interface-Klasse.
Des weiteren schaue Dir mal die Doku zu QPlugins an - ggf. ist das was für Dich.