Entwickler-Ecke

Windows API - Eigene Ressourcen zur Laufzeit bearbeiten


O'rallY - Do 20.02.03 18:30
Titel: Eigene Ressourcen zur Laufzeit bearbeiten
Ich suche nache einer Möglichkeit, einen 128Bit großen String in der EXE-Datei des Programms zu speichern, zur Laufzeit.
Ich habe es mit UpdateResource wie folgt probiert:

Quelltext
1:
2:
UpdateResource(Application.Handle, RT_STRING, MAKEINTRESOURCE(1001), LANG_NEUTRAL, PChar('0123456789012345'), 16);
ShowMessage(LoadStr(1001));


Wenn ich statt Application.Handle hInstance einsetze bekomme ich einen "Access Violation- Fehler im modul "kernel32.dll".

Mit diesem Code bekomme ich zwar keine Fehlermeldung zu sehen, ich weiß aber auch nicht, ob es funktioniert hat. LoadStr(1001) gibt auf jedenfall einen leeren String, bzw. nichts zurück.

Ich weiß auch nicht ob ich falsche Parameter benutzt hab oder ob LoadStr überhaupt anwendbar ist.

Ich bin auch offen für andere Möglichkeiten.


OregonGhost - Do 20.02.03 18:40

Microsoft hat folgendes geschrieben:

hUpdate
[in] Specifies an update-file handle. This handle is returned by the BeginUpdateResource function.

-> BeginUpdateResource aufrufen und dessen Rückgabewert als Handle verwenden. Wenn du fertig bist, musst du außerdem EndUpdateResource aufrufen. Steht übrigens alles im PSDK unter UpdateResource.

Im PSDK befindet sich außerdem der Artikel "Using Resources", der weitere Informationen über das Aktualisieren von Ressourcen enthält.


O'rallY - Do 20.02.03 19:37

Stimmt, du hast recht. Da hab ich wohl nicht genau genug gelesen. Doch dummerweise ist der Artikel "Using Resources" ein C-Beispiel. Da hab ich leider nur ein wenig theoretosce Erfahrung.
Habs mal so versucht, doch klappt es immer noch nicht.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
   s: string;
   aHandle: LongWord;
begin
   s := '0123456789123456';
   aHandle := BeginUpdateResource(PChar(ParamStr(0)), false);
   UpdateResource(aHandle, RT_STRING, MAKEINTRESOURCE(1001),  LANG_NEUTRAL, PChar(s), 16);
EndUpdateResource(aHandle, false);
   ShowMessage(LoadStr(1001));
end;


Klappt das überhaupt mit dem MAKEINTRESOURCE und rufe ich die Resource den überhaupt korrekt mit LoadStr auf?

Könnte mir vielleicht einer ein einfaches Delphi-Beispiel schreiben/geben?


OregonGhost - Fr 21.02.03 14:58

Du solltest als LANGID das Makro MAKELANGID einsetzen:

Quelltext
1:
..., MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), ...                    


Microsoft hat folgendes geschrieben:

If the resource is one of the predefined types, the data must be valid and properly aligned. Note that this is the raw binary data stored in the executable file, not the data provided by LoadIcon, LoadString, or other resource-specific load functions. All data containing strings or text must be in Unicode format; lpData must not point to ANSI data.

--> Ein einfacher PChar geht damit schon mal nicht ;c) Unter Win32 kannst du glaub ich WideChars dafür nehmen, bin aber nicht sicher. Ich weiß auch nicht wie du den RT_STRING ausrichten musst. Du könntest allerdings als Resource-Typ RT_RCDATA, da kannst du dir nämlich selbst aussuchen, wie das ausgerichtet ist (es werden die Rohdaten kopiert). Vielleicht probierst du das einfach mal aus.

Davon abgesehen ist es laut dem Aritkel unter http://www.idevresource.com/vs/library/articles/alteringresources.asp nicht ohne weiteres möglich, eine laufende Datei zu ändern, Abhilfe steht in dem Artikel.


O'rallY - Fr 21.02.03 16:03

MAKELANGID ist bei mir ein "Undeclared identifier". Muss ich noch ein Unit einbinden?


OregonGhost - Sa 22.02.03 13:01

aus winnt.h:

Quelltext
1:
#define MAKELANGID(p, s)       ((((WORD  )(s)) << 10) | (WORD  )(p))                    

Müsste etwa so aussehen:

Quelltext
1:
2:
3:
4:
function MakeLangID(p, s: ShortInt): Word;
begin
Result := (Word(s) shl 10) or (Word(p));
end;

Gebe keine Garantie, aber damit könnte es funktionieren ;c)
Wenn's mal wieder nicht funktioniert hat, kannst du auch prima mal GetLastError() aufrufen, damit kriegst du mehr Informationen über den Fehler.


Sven - Sa 22.02.03 13:29

OregonGhost hat folgendes geschrieben:

Davon abgesehen ist es laut dem Aritkel unter http://www.idevresource.com/vs/library/articles/alteringresources.asp nicht ohne weiteres möglich, eine laufende Datei zu ändern, Abhilfe steht in dem Artikel.


Man kann aber eine Resourcen-Dll schaffen und diese zur Laufzeit anpassen.

Gruß Sven


OregonGhost - Sa 22.02.03 16:38

Yo, aber im ursprünglichen Posting ging es ums Verändern der eigenen EXE-Datei.