Resource String aus statischer Methode
-
Hallo.
Habe ein kleines Problem mit Strings aus einer Resource-Datei (arbeite mit VS2005 und den MFC).
Simples Beispiel:// ... CString strMessage; strMessage.Format(IDS_ERR_INIT, ulInitReturn); AfxMessageBox(strMessage, MB_ICONERROR);In einer normalen Klassenmethode klappt das auch. Aber in einer statischen Methode wirft mir die MFC eine Handvoll asserts und die MessageBox bleibt leer. Auch mit
strMessage.LoadString(IDS_ERR_INIT)hatte ich nicht mehr Erfolg.
Aus einem der Asserts war ersichtlich, dass der ResourceHandle NULL ist.
Das könnte ja auch Sinn machen (zumindest klingt es plausibel, dass die Resourcen in statischen Mehtoden nicht direkt verfügbar sind).
Nun die Preisfrage an alle Pros hier:
Wie komme ich aus einer statischen Mehtode an die ResourceStrings ran?????
Danke & Gruß
-
es sieht fuer mich aus dem Bisschen was du hier preisgibst so aus, als ob das Problem bei den globalen bzw. statischen Variablen liegt: Es ist nicht festgelegt in welcher Reihenfolge die angelegt werden, deshalb kann es immer mal passieren, dass man versucht auf Objekte zuzugreifen, die noch nicht oder nicht mehr existieren, wenn sie voneinander abhaengig sind. Es gibt verschiedene Ansaetze, solche Probleme zu loesen, google mal ein bisschen rum (unter anderem globale Variablen vermeiden bzw. in singletons zusammenfassen, z.B. das phoenix-singleton von Alexandrescu)
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Das hat nichts mit statischen Fuktionen zu tun.
LoadString ist eine Funktion, die auf einen String-Manager zurückgreift. Dieser muss initialisiert sein.Wenn Du einfach die MFC verwendest ohne die durch ein CWinAp bzw. AfxWinInit (o.ä) zu initialisieren, dann hat der String Manager kein Ressource Handle und schmeißt einen ASSERT...
-
Danke schon mal für eure Antworten (sorry übrigens für das fehlplatzierte Posting - hab extra nach MFC geschaut - muss wohl etwas blind gewesen sein...).
...als ob das Problem bei den globalen bzw. statischen Variablen liegt...
Die betroffenen Variablen sind allesamt lokal

Wenn Du einfach die MFC verwendest ohne die durch ein CWinAp bzw. AfxWinInit (o.ä) zu initialisieren, dann hat der String Manager kein Ressource Handle und schmeißt einen ASSERT...
Jetzt verwirrst du mich.

Also ich habe ja noch ein wenig Probiert: Ich habe an meiner Klasse (abgeleitet von CWinApp - zur DLL kompiliert) nichts weiter geändert, außer eben eine Funktion als statisch zu deklarieren.
Hier mal etwas Hintergrundinformationen (vieleicht klärt sich dann einiges):
Es handelt sich um eine DLL, welche einen Thread für eine größere Applikation enthält und erst zur Laufzeit zur eigentlichen Applikation gelinkt wird (also LoadLibrary/GetProcAdress).
Wie bekannt, wird nach dem Laden der Bibliothek InitInstance vom CWinApp aufgerufen - dort behandel ich auch schon mal den Großteil der Initialisierung. Hier funktioniert im Fehlerfall auch das Ausgeben einer MessageBox (bzw laden des Strings) problemlos.
Danach wird durch die Hauptapplikation über GetProcAdress die Startroutine aufgerufen, welche den eigentlichen Thread startet. Die Methode, die den Thread repräsentiert ist logischerweise statisch (wie eigentlich die gesammte Klasse...).
In eben diesen statischen Funktionen habe ich es noch nicht geschafft, einen String aus der Resource Tabelle zu laden...Für jede Hilfe dankbar

-
Ok dann ist alles klar.
Du hastAFX_MANAGE_STATE(AfxGetStaticModuleState());nicht eingebaut...
Lies mal TN058 http://msdn2.microsoft.com/en-US/library/ft1t4bbc(VS.80).aspx
-

Danke - das klingt doch sehr vielversprechend. Werde es bei nächster Gelegenheit testen.Vielen Dank
-
Jau - scheint zu funktionieren.

Obwohl ich zugeben muss, den MS Artikel nicht wirklich verstanden zu haben (liegt vieleicht daran, dass ich mich auch nie so ganz mit den MFC anfreunden konnte).
Wäre schön, wenn du den Hintergrund des Makros einmal kurz umreißen könntest -denn eigentlich baue ich ungerne Codezeilen ein, die ich selber nicht begründen kann...
-
Das ganze ist ziemlich einfach.
Wenn Du die MFC als shared DLL verwendest, dann gibt es eine globale Variable in der MFC DLL, die einen Zeiger auf die aktuelle Instanz des Programmes angibt.
In diesen Instanzdaten, steht auch wo die Ressourcen zu laden sind.Nun baust Du eine neue DLL, diese hat nun auch ein CWinApp Objekt. Die Ressourcen werden aber immer über den globalen Zeiger in der MFC DLL gesucht.
AFX_MANAGE_STATE tauscht nun für die Zeit Deines DLL Aufrufes diesen globalen Zeiger der Applikation aus mit einem Zeiger aus Deiner DLL-Instanz. Nun kann Deine DLL seine Ressourcen laden. Am Ende der Funktion wird der Zeiger wieder zurückgesetzt und alles ist wie zuvor.Hättest Du die MFC statisch gelinkt, hättest Du das Problem nicht gehabt.
HTH
-
Ahhh so schauts aus... Jetzt is alles klar!
Supi - wieder was dazu gelernt

Danke Dir für die Hilfe.