Autor Beitrag
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Do 20.02.03 18:30 
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:
ausblenden 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.

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: 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.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: 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.
ausblenden 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?

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Fr 21.02.03 14:58 
Du solltest als LANGID das Makro MAKELANGID einsetzen:
ausblenden 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 www.idevresource.com...lteringresources.asp nicht ohne weiteres möglich, eine laufende Datei zu ändern, Abhilfe steht in dem Artikel.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Fr 21.02.03 16:03 
MAKELANGID ist bei mir ein "Undeclared identifier". Muss ich noch ein Unit einbinden?

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Sa 22.02.03 13:01 
aus winnt.h:
ausblenden Quelltext
1:
#define MAKELANGID(p, s)       ((((WORD  )(s)) << 10) | (WORD  )(p))					

Müsste etwa so aussehen:
ausblenden 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.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
Sven
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314


D6 Ent, K3 Pro (patched)
BeitragVerfasst: Sa 22.02.03 13:29 
OregonGhost hat folgendes geschrieben:

Davon abgesehen ist es laut dem Aritkel unter www.idevresource.com...lteringresources.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

_________________
MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Sa 22.02.03 16:38 
Yo, aber im ursprünglichen Posting ging es ums Verändern der eigenen EXE-Datei.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.