MFC/Qt Migration

Verschiedenes zu Qt
Antworten
Flo1902
Beiträge: 15
Registriert: 4. September 2007 15:17
Wohnort: Reutlingen

MFC/Qt Migration

Beitrag 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.
Die drei wichtigsten Paradigmen der SW-Entwicklung:
copy-and-paste, trial-and-error, it's-not-a-bug-it's-a-feature
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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.
Flo1902
Beiträge: 15
Registriert: 4. September 2007 15:17
Wohnort: Reutlingen

Beitrag 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.
Die drei wichtigsten Paradigmen der SW-Entwicklung:
copy-and-paste, trial-and-error, it's-not-a-bug-it's-a-feature
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Flo1902
Beiträge: 15
Registriert: 4. September 2007 15:17
Wohnort: Reutlingen

Beitrag 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.
Die drei wichtigsten Paradigmen der SW-Entwicklung:
copy-and-paste, trial-and-error, it's-not-a-bug-it's-a-feature
Flo1902
Beiträge: 15
Registriert: 4. September 2007 15:17
Wohnort: Reutlingen

Beitrag 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
Die drei wichtigsten Paradigmen der SW-Entwicklung:
copy-and-paste, trial-and-error, it's-not-a-bug-it's-a-feature
Antworten