Laden eines Resource-Strings aus einer anderen Anwendung



  • Hallo,
    ich möchte gerne eine String-Resource aus einer anderen Datei lesen und
    verarbeiten. Ich habe bereits sämtliche Foren durchsucht, jedoch geht es immer nur
    um das Laden einer Zeichenkette aus den Resourcen der aktuellen Anwendung :(.

    Zur Zeit benutze ich folgende Anweisungen:

    char lpStr[300];
    HANDLE hFile = CreateFile(cExePath, GENERIC_READ,FILE_SHARE_READ,NULL,
                               OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
                               NULL);
    
    LoadString(hFile,1,lpStr, 300)
                            MessageBox(0,lpStr,0,0);
    

    Doch die Zeichenkette mit der Resource-ID 1 wird nie gelesen.
    Weiss einer von euch eine Lösung?



  • Hi,

    GetModuleHandle statt CreateFile.



  • Danke für die Antwort 🙂
    Aber wie bekomme ich denn dann das Handle der Datei, bzw. welchen Parameter
    brauch ich dann für GetModuleHandle. Überall finde ich Lösungen mit

    GetModuleHandle(0);
    

    aber ich will ja keinen String aus der eigenen Anwendung, sondern den aus einer
    anderen Anwendung haben :(.

    Vielen Dank 🙂



  • Hat sich erledigt... ich glaub es hackt...
    es reicht wenn man als Parameter den Dateinamen übergibt 😃

    char lpStr[300];
    
            LoadString(GetModuleHandle(cExePath),1,lpStr, 200);
                            MessageBox(0,lpStr,0,0);
    


  • Hm sry hab grad das hier gelesen:

    The GetModuleHandle function returns a module handle for the specified module if the file has been mapped into the address space of the calling process.

    Damit gehts also nicht.
    Hab dir mal n Code gebastelt, mit dem es aber funktioniert (getestet!) 😉 :

    TCHAR szBuffer[400];
    	HINSTANCE hDemoInst = LoadLibrary(TEXT("C:\\demo.dll"));
    	if(!hFirefoxInst)
    	{
    		// Error...
    	}
    	if(!LoadString(hDemoInst, 1, szBuffer, sizeof(szBuffer) / sizeof(TCHAR)))
    	{
    		// Error...
    	}
    	MessageBox(NULL, szBuffer, TEXT("Info..."), MB_OK);
    	FreeLibrary(hDemoInst);
    

    Noch was ➡ ...du redest von 'Datei'...LoadString kann aber nur Resource-Strings
    aus Modulen (EXE, DLL) extrahieren.



  • beepeeep schrieb:

    Hat sich erledigt... ich glaub es hackt...
    es reicht wenn man als Parameter den Dateinamen übergibt 😃

    char lpStr[300];
    
            LoadString(GetModuleHandle(cExePath),1,lpStr, 200);
                            MessageBox(0,lpStr,0,0);
    

    LOL, also bei mir funzt das nicht 😃 .



  • CodeFinder schrieb:

    LOL, also bei mir funzt das nicht 😃 .

    LOL 😃 ja bei mir funktionierte das von Anfang an, da ich mir eine Klasse
    geschrieben habe, die sozusagen die "Verwaltung" der Ressourcen einer Anwendung (sorry, meinte natürlich auch Anwendung, was denn auch sonst :-D) darstellt.
    Darin habe ich sowohl eine Funktion zum Schreiben/Überschreiben und nun auch zum Auslesen eines Strings. Nach dem Erstellen des Objekts rufe ich immer eine Funktion auf, die cExePath (Variable der Klasse) definiert und BeginUpdateResource(cExePath, false) aufruft.

    so, my file has always been mapped into the address space of the calling process before using LoadString(...) 🙂

    Trotzdem vielen Dank für die Hilfe und den Quelltext und die Idee, die Anwendung vorher mit LoadLibrary zu laden. Bei mir hatte ich das Problem ja vorher mit dem Aufruf von BeginUpdateResource schon gelöst.

    thx 👍

    mfg



  • Hey cool, die Klasse hört sich gut an...kannste mir die mal schicken ?



  • Schade, hatte mich doch vertan, die Anwendung muss doch nochmal mit
    LoadLibrary geladen werden. Habe in meiner Anwendung genau die gleiche String-Ressource wie in der anderen, und ich hab nicht bemerkt, dass die Ressource aus der aktuellen Anwendung geladen wurde 😡

    Naja, jetzt geht's ja 🙂

    Klar kann ich sie dir schicken - sie ist sicherlich noch verbesserungswürdig 😉



  • DANKE! Also hier: cpp-coding(at)arcor(punkt)de 😉


Anmelden zum Antworten