Seite 1 von 1

MFC/Qt Migration

Verfasst: 7. September 2007 07:31
von Flo1902
Morgen Leute!

Hab schon wieder ein Problem:
Meine Aufgabe besteht darin, herauszufinden, mit welchem Aufwand eine Migration von MFC nach Qt verbunden ist.
Bei dem Projekt handelt es sich um eine HMI für Automatisierungslösungen. Das System ist sehr flexibel aufgebaut. Es besteht im Wesentlichen aus vier Views, die dynamisch mit Inhalt gefüllt werden. Die Inhalte liegen als PropertyPages in MFC-Dlls vor, die wiederum je nach Anwendung dynamisch aufgebaut werden und ihr Aussehen über INI-Files erhalten.
Ich versuche gerade eine der Dlls in ein Qt-Projekt zu laden, scheitere aber daran, dass ich zwar auf einzelne Funktionen mithilfe der QLibrary-Klasse und typedefs mit Funktionspointern zugreifen kann, aber das Ganze nicht über Objekte der importierten Klasse aus der DLL funktioniert. Dazu muss vielleicht noch gesagt werden, dass die Funktionen nicht einzeln als "extern C" exportiert werden, sondern die komplette Klasse per AFX_EXPORT_CLASS exportiert wird.

Hat jemand in dieser Hinsicht tiefgehende Erfahrungen gemacht?
Bin für jede Hilfe dankbar.

Gruß Flo

PS: Ich habe mir auch schon das MFC/Qt-MigrationFramework von TT angeschaut. Die beiligenden Beispiele helfen mir aber nicht wirklich weiter, da hierbei nur von "extern C"-Funktionen ausgegangen wird.

Verfasst: 7. September 2007 08:07
von CaptnChaos
also wenn ich die einbindungsanleitung von opensource qt in visual studio .net befolge und dann ein neues mfc projekt öffne, kann ich nach einbinden der Header alle QtCore Klassen verwenden (auch alles andere, was nichts mit gui zu tun hat). wenn ich ein qt projekt starte kann ich auch mfc funktionen verwenden, die nichts mit gui zu tun haben. hoffe das hilft.

Verfasst: 7. September 2007 08:15
von Flo1902
Danke für die Antwort, aber nein, das hilft nicht weiter.
Zunächst einmal habe ich die Evaluationsversion vom kommerziellen Qt mit VS-Integration und dem MigrationFramework. Ausserdem will ich ja gerade keine MFC-Abhängigen Header einbinden, was bei diesem Projekt auch gar nicht so einfach wäre, weil es einen Rattenschwanz an abhängigen Headerfiles hinter sich herziehen würde (>20 HeaderFiles), die natürlich alle wiederum MFC-abhängig sind.

Verfasst: 7. September 2007 10:31
von RHBaum
Nur meine Meinung:

Vergiss die MFC Migration. Also QMfcApp

Iss dein Project unter Mfc sauber geproggt wurden, kannst Du die logic Klassen weiter verwenden. Wenn das alles tief mit der MFC verzahnt ist, Pech!
Nimms als gelegenheit das zeugs auber aufzusetzen. Wir habens versucht nen etwas umfangreicheres MFC Project zu migrieren, wir haben mehr Probleme bekommen als es hilft. Glaub das funktioniert nur gut mit kleineren einfachen anwendungen / kleineren Modulen.
Also setz nen neues sauberes QT-Project auf, und "kopier" rueber was du verwenden kannst.

nuetzlich sind hingegen die QWinhost und QWinwidget klassen .... wenn man modular programiert. So kann man z.b. die QT um module mit Fenstern / Views erweitern, wo die module nicht mit der QT implementiert sind.
Module im Sinne von Dll's

Ciao ...

Verfasst: 7. September 2007 12:03
von Flo1902
nuetzlich sind hingegen die QWinhost und QWinwidget klassen .... wenn man modular programiert. So kann man z.b. die QT um module mit Fenstern / Views erweitern, wo die module nicht mit der QT implementiert sind.
Module im Sinne von Dll's
Genau das ist was ich vor habe.

Verfasst: 14. September 2007 10:58
von Flo1902
Um mein vorhaben mal ein bischen zu veranschaulichen:

Code: Alles auswählen

  //CCommunicationServer ist die fragliche Klasse aus der DLL
  CCommunicationServer  *   m_pCommunicationServer;
  CString                   m_szComServerModule;
  CString                   m_szComServerParameter;
  HINSTANCE                 m_hComServerInstance;

	 m_hComServerInstance = AfxLoadLibrary( m_szComServerModule );

	if ( m_hComServerInstance )

{
	  typedef CRuntimeClass * (*GETCOMMUNICATIONSERVER)(); //Funktionspointer
	  GETCOMMUNICATIONSERVER GetComServer = (GETCOMMUNICATIONSERVER) GetProcAddress(m_hComServerInstance, "GetCommunicationServer");
	  ASSERT (GetComServer != NULL);
  
	  if ( GetComServer )
	  {
		m_pCommunicationServer	= (CCommunicationServer*)GetComServer()->CreateObject(); //Gibt Instanz der Klasse zurück
    
		if ( m_pCommunicationServer )
		{    
		  m_pCommunicationServer->Init( m_szComServerParameter, GetEventWnd() );
		}
	  }
	}
Unter Qt hatte ich folgenden Ansatz:

Code: Alles auswählen

	//DLL in QLibrary-Objekt laden (=handle)
	QLibrary *lib = new QLibrary("\MCSocketServerD.dll");
	bool ret = lib->load();
  
	typedef void* (*GETCOMMUNICATIONSERVER)();
	GETCOMMUNICATIONSERVER GetComServer = (GETCOMMUNICATIONSERVER) lib->resolve("GetCommunicationServer");
	
	CCommunicationServer*  m_pCommunicationServer = (CCommunicationServer*)((CCommunicationServer*)GetComServer())->CreateObject();

  CString para(_T("<RC><TCPIP>127.0.0.1</TCPIP><PORT>5000</PORT><TYPE>M</TYPE></RC>"));
  m_pCommunicationServer->Init( para, hwnd);

Nach einigem Hin-Und-Her habe ich die Sache auch zum laufen gebracht.
Der Pointer m_pCommunicationServer zeigt auch auf eine Adresse,
allerdings bekomme ich beim Aufruf der Init()-Methode einen Speicherzugriffsfehler.

Vorschläge?

Gruß
Flo