Seite 1 von 1

QT Ressourcen windows Dll

Verfasst: 11. Oktober 2006 11:10
von RHBaum
Unter windows XP, MSVS 2005, QT 4.1 Enterprice.

Wir haben ein Modulkonzept ...
die hauptanwendung laed dynamisch module nach (.dll)
Uber die schnittstellen zum Module werden QT klassen (QDomNode, QString) exportiert, bisher kein problem.

Wir verwenden das ressourcenkonzept von QT (qrc files + den ressourcencompiler) , unter anderem auch icons die fest mit gelinkt werden.
Wenn ich die ressourcen in der dll/exe lade QIcon ico(":icons\test.ico"); und auch nur da drin verwende, alles kein problem.

wenn ich aber das icon ueber ne constante referenz ...(const QIcon & Icon ...) ueber die schnittstelle von ner dll zu ner exe schicke, und dort anzeigen will, hab ich ein problem.

Ist dll und exe im selben modus kompilliert (release, debug, singlethread, multithread) funktioniert es, sind aber die modis unterschiedlich (aergerlich weil wir zum debuggen der module nicht immer die debug exe nehmen) dann gibts ne assertion in der crt ....

Hat jemand aehnliche probleme ? gibts da ne loesung fuer ?
Find es schon praktisch, wenn die module ihre eigenen Icons zum anzeigen in die frameanwendung mitbringen ....

Ciao ...

Verfasst: 11. Oktober 2006 11:49
von Christian81
Kannst Du es zum Testen mal runterbrechen? Einfach ein MainWindow welches ein QIcon aus einer DLL als Resource lädt. Würde mir das gern mal anschauen da ich nicht verstehe wieso das nicht gehen soll. Imho ist es unerheblich ob das Image jetzt aus einer Resource kommt oder aus einem File (so mache ich es an einigen Stellen und es funktioniert).

Wobei... das mit der Referenz verstehe ich nicht ganz wie Du es meinst. Ich würde einfach ein getPict(QImage &img) oder eben ein const QImage &getPict() in der DLL implementieren welche mir das Image zurückgibt.

Verfasst: 12. Oktober 2006 11:05
von RHBaum
Kannst Du es zum Testen mal runterbrechen?
dar knallt ziemlich tief in der crt .... definitv beim freigeben vom speicher (_free irgendwas und der Zeiger dazu iss ungueltig), zurueckverfolgen wo es genau herkommt kann ich nicht, weil die Aufrufliste nur funktionen aus der msvcrt da auflistet .... wie als waers nen eigener thread (was aber ned sein kann)
Wobei... das mit der Referenz verstehe ich nicht ganz wie Du es meinst.
das framework(.exe) befragt unter anderem, welche "Geraete" das Modul (.dll)kann
Dazu ruft es ne funktion
bool ListDevices(IDeviceListCreator * ); auf ... und uebergibt damit ne schnittstelle wo das modul seine Geraete registrieren kann ...
void IDeviceListCreator::AddDevice(const QIcon & ico,const QString & Name) ;

Das framework macht wenn es das AddDevice aufgerufen bekommt, erstmal ne kopie vom Icon ..... QIcon myIco(ico); und wirft das in nen container ....
Bei bedarf (user interaktion) werden dann diverse dialoge aufgerufen wo in listboxen das device mit dem Icon dargestellt wird.

Irgendwie schaut es mir aus, als wuerde bei dem QIcon myIco(ico) keine 100% kopie gemacht sondern irgend was schmutziges ueber globale variablen(symbole) gehalten ....
oder das Icon wird verspaetet geladen und zieht erst im code der exe seine ressourcen an, und dann stimmen irgendwelche symbolnamen nicht mehr.

Codeschnipsel kann ich posten, wenn es was hilft.
Den code vom projekt kann ich dir ned zukommen lassen (Auftraggeber wuerde amok laufen ^^)
Wuerdest eh keinen aufruf von AddDevice hinkriegen, weil dir da paar treiber und hardware fehlt ^^

Ciao ...

Verfasst: 12. Oktober 2006 11:18
von Christian81
Vielleicht das:

Code: Alles auswählen

QIcon::QIcon ( const QString & fileName )

Constructs an icon from the file with the given fileName. The file will be loaded on demand.
Und über Modulgrenzen aus einer Resource zu laden geht imho nicht. Versuch mal es explizit zu laden z.B. indem Du einfach QIcon::pixmap() oder so in der Dll aufrufst bevor du es an das andere Modul übergibst.

Verfasst: 12. Oktober 2006 13:36
von RHBaum
Und über Modulgrenzen aus einer Resource zu laden geht imho nicht
Allgemein sollte es gehen .... unter reiner win32 API gehts, wenn man weiss wie ....

Was QT intern mit ressourcen macht, weiss ich halt nu nich ....

Mit dem erzwingen des ladens bevor mans uebergibt ... klingt wie nen Plan. koennt ich mal versuchen ... iss eigentlich auch so gedacht, dass die dll das Icon Laed und nich die exe ....

Ciao ....