Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem bei Resource und Unicode (https://www.delphipraxis.net/169881-problem-bei-resource-und-unicode.html)

OttoFragt 18. Aug 2012 12:08

Problem bei Resource und Unicode
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Delphi Praxis

Ich versuche mit einem Programm einen String in ein anderes zu schreiben um diesen dannach wieder auszulesen.
Hier der Code bisher:

Damit schreibe ich die Daten in die Datei:
Code:
Function WriteResData(sServerFile: string; pFile: pointer; Size: integer; Name: String):Boolean;
var
  hResourceHandle: THandle;
  pwServerFile: PWideChar;
  pwName: PWideChar;
begin
  GetMem(pwServerFile, (Length(sServerFile) + 1) *2);
  GetMem(pwName, (Length(Name) + 1) *2);
  try
    StringToWideChar(sServerFile, pwServerFile, Length(sServerFile) * 2);
    StringToWideChar(Name, pwName, Length(Name) * 2);
    hResourceHandle := BeginUpdateResourceW(pwServerFile, False);
    Result := UpdateResourceW(hResourceHandle, MakeIntResourceW(10), pwName, 0, pFile, Size);
    EndUpdateResourceW(hResourceHandle, False);
  finally
    FreeMem(pwServerFile);
    FreeMem(pwName);
  end;
end;
Button Click Event ist also:
Code:
var
  sBuffer: String;
begin
  sBuffer := 'Hallo';

  CopyFile(PChar(PChar(ExtractFilePath(ParamStr(0)) + 'test.exe')), PChar(ExtractFilePath(ParamStr(0)) + 'test2.exe'), false);
  WriteResData(ExtractFilePath(ParamStr(0)) + 'test2.exe', PWideChar(sBuffer), Length(sBuffer), 'TEST');
Für das auslesen benutze ich folgenden Code:

Code:
function GetResources(pSectionName: PChar; out ResourceSize: LongWord): Pointer;
var
  ResourceLocation: HRSRC;
  ResourceHandle: HGLOBAL;
begin
  ResourceLocation := FindResource(hInstance, PChar(pSectionName), RT_RCDATA);
  ResourceSize := SizeofResource(hInstance, ResourceLocation);
  ResourceHandle := LoadResource(hInstance, ResourceLocation);
  Result := LockResource(ResourceHandle);
end;

function GetResourceAsString(pSectionName: pchar): string;
var
  ResourceData: PChar;
  SResourceSize: LongWord;
begin
  ResourceData := GetResources(pSectionName, SResourceSize);
  SetString(Result, ResourceData, SResourceSize);
end;
Und benutze ihn so:
Code:
var
  sBuffer: String;
begin
  sBuffer := GetResourceAsString('TEST');
  writeln(sBuffer);
  readln;
Die Ausgabe auf der Konsole ist aber leider unvollständig bei Delphi XE:
Anhang 37458

Bei Delphi 2007 funktioniert es.

Ich hoffe auf hilfreiche Antworten.

MfG

Bernhard Geyer 18. Aug 2012 12:12

AW: Problem bei Resource und Unicode
 
Was kommt in der Ressource an.
So wie es aussieht berücksichtigst du nicht das String = Unicodestring ab D2009 ist und ein Char = 2 Byte ist.

OttoFragt 18. Aug 2012 14:45

AW: Problem bei Resource und Unicode
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo

Danke für Deine Antwort.
Ich habe nun beim Schreiben folgende Zeile geändert:

WriteResData(ExtractFilePath(ParamStr(0)) + 'test2.exe', PWideChar(sBuffer), Length(sBuffer) * 2, 'TEST');

Also Length(sBuffer) * 2. Nun wird zwar das ganze Wort ausgegeben, allerdings noch mit anhängenden "?".

Screenshot:
Anhang 37459

Was meinst du genau mit "Was kommt in der Ressource an."? Also mit dem Resourcen Editor (Reshacker) sehe ich folgende Zeichen:
Anhang 37461

Im Code-Tag:
Code:
000089A4  45 00 64 00 69 00 74 00 31                        E•d•i•t•1
Vielen Dank

blackfin 18. Aug 2012 20:33

AW: Problem bei Resource und Unicode
 
nur weils mir aufgefallen ist als tipp (ohne auf die Lösung deines Problems einzugehen):

generell wäre statt

Delphi-Quellcode:
Length(sBuffer) * 2
ein
Delphi-Quellcode:
Length(sBuffer) * SizeOf(Char)
besser, damit vermeidest du ein "hardcoden" der charlänge und hast code evtl. auch nicht-unicode-compiler kompatibel.

Lyan 15. Nov 2013 14:11

AW: Problem bei Resource und Unicode
 
Und das ParamStr(0) kannst du dir auch sparen ;)

himitsu 15. Nov 2013 14:28

AW: Problem bei Resource und Unicode
 
Zitat:

Zitat von Lyan (Beitrag 1236127)
Und das ParamStr(0) kannst du dir auch sparen ;)

Nein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz