QT-DLL mit VC aufrufen

Alles rund um die Programmierung mit Qt
Antworten
allieno
Beiträge: 2
Registriert: 31. Oktober 2009 22:55

QT-DLL mit VC aufrufen

Beitrag 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;
}
Dateianhänge
Client.cpp
Das Client und QT Projekt werde ich noch vollstaendig hinzufuegen
(2.8 KiB) 45-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
allieno
Beiträge: 2
Registriert: 31. Oktober 2009 22:55

Beitrag 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/
Dateianhänge
client_und_qtdll.zip
Hier wie angekuendigt die Projekte:

QTClient ist in Visual C++ 2008 Express erstellt (bei &quot;Projektmappe oeffnen&quot; alle Meldungen ignorieren bzw. mit ja beantworten)

Für qtdll ist QT 4.5.3 in Verwendung
(23.63 KiB) 35-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten