Resourcedatei in dll einbinden
-
jo... ich linke die statisch indem ich die .lib zum projekt hinzufüge.
-
Dann bräuchtest du aber LoadLibrary nicht aufzurufen.
Hast du den Rückgabewert von LoadLibrary mal überprüft?
-
ja.. habe ich...
ist ein leerer string.
Komisch ist die Tatsache, dass es funktioniert wenn ich das Projekt mit "build with runtimepackages" kompiliere.
-
Ich meine LoadLibrary und nicht LoadStr. Die erstere Funktion würde ein Handle auf die geladene dll zurückgeben bzw. 0 wenn sie nicht geladen werden konnte.
-
erstmal danke für deine Antworten.
Ich habe bisher leider noch nichts mit dll's gemacht.
Kannst du mir evtl. mal ein Beisp. posten?
Bei LoadStr versucht das Programm doch sich die Resource aus der .exe zu ziehen falls vorhanden oder?
gruss
Sosi
-
Warum packst du die Ressource überhaupt in eine dll? Du könntest deine rc-Datei ja auch direkt in das Hauptprojekt einbinden.
Der Syntax deiner StringRessource sieht mir etwas merkwürdig aus, aber vielleicht gehts ja auch so.
Bei mir würde das eher so aussehenSTRINGTABLE { 1001, "File" }Ansosnsten gibts z.Bsp. hier http://bcb-tutorial.c-plusplus.net/inhalt.html#Thema8 ein Tutorial zu dlls.
Auch auf der Seite von F98 ist noch eins.
-
Hallo Braunstein,
habe es eben anhand von deinem .rc Beispiel versucht. Beide (deine und meine) Syntaxversionen funktionieren. Allerdings nur solange bis ich "build with runtimepackages" aktiviert habe.
Der Sinn warum ich einen Ressourcefile in eine dll kompilieren möchte ist die Tatsache, dass ich eine Mehrsprachige Software entwickeln muss mit dem Ziel die Sprach-dll's dynamisch in das Projekt einzubinden.
Ich habe mir die Links die du gepostet hast auch schon angeschaut. Leider wird nirgendwo tatsächlich ein Beispiel angezeigt.
Mein Vorhaben bezgl. des einbindens einer .rc datei in eine dll datei scheint mir nicht grade eine Programmiertechnische Meisterleistung zu erfordern. Wie hast du das denn gelöst?
gruss Sosi
-
Eigentlich nicht viel anders.
Ich habe mit dem dll-Experten ein Projekt angelegt und dort die rc-Datei eingebunden.
Da ich normalerweise statisch linke war "Importbibliothek erzeugen" markiert.
Die nach dem kompiliernen entstandene lib in das Hauptprojekt einfügen, die dll in das verzeichnis des Hauptprogramms kopieren und dann das Hauptprogamm kompilieren. Das wars.
Ich linke meine Programme immer ohne dynamische RTL.
-
ok.... und wie hast du dann auf die Strings zugegriffen?
auch mit LoadStd()?
btw: hatte vorhin Müll erzählt....
Die dll wird in meiner .exe nicht mittels .lib eingebunden. Deshalb habe ich "LoadLibrary" benutzt.
Aber selbst bei "Statisch gelinkt" funktioniert es bei mir nicht.
Ich wiederhole mal ALLE Schritte:
1. Projekt mit dll-wizzard angelegt. Nix am enstandenen Source geändert oder hinzugefügt, ausser .rc file mit eingebunden. Dann Kompiliert.
2. Exe erzeugt, .lib NICHT eingebunden (weil ja Dynamisch).
3. Button auf ne Form plaziert.
void __fastcall TForm1::Button1Click(TObject *Sender) { LoadLibrary ("Project2.dll"); Form1->Caption = LoadStr(1001); }das war es.
Wie gesagt, wenn ich "build with runtimepackages" aktiviere und das Programm dann kompiliere kunftioniert ALLES Perfekt.
Will aber mein Programm sozusagen weitergeben, also "build with runtimepackages" deaktivieren und dann kompiliren. Und genau daran hapert es.
Bekomme dann einen leeren String geliefert.Mir scheint "LoadLibrary" verhält sich einfach anders wenn man mit "build with runtimepackages" kompiliert.
Ich komme da nicht weiter.
-
Ich denke mal, dass LoadStr nur bei statisch gelinkten dlls funktioniert.
Bei dynamisch gelinkten Ressourcen-dlls (habe ich aber bisher nur für RCDATA gemacht) verwende ich die zugehörigen API-Funktionen. Also z.Bsp FindRessource etc. Für StringTables gibt es da LoadString.
Also vielleicht so (ungetestet)HINSTANCE hdll = LoadLibrary("Project2.dll"); if( hdll == NULL ) { // irgendeine Fehlerbehandlung } char *buffer = new char[100]; int res = LoadString(hdll, 1001, buffer, 100); if( res == 0 ) { // irgendeine Fehlerbehandlung } else Caption = buffer; delete[] buffer;
-
Danke Braunstein...
hast recht... so funktioniert es.
greetz
Sosi