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 FindResource Delphi XE Problem (https://www.delphipraxis.net/166996-findresource-delphi-xe-problem.html)

donkey 8. Mär 2012 18:34

FindResource Delphi XE Problem
 
Guten Abend liebe Community

Ich habe ein Problem mit "FindResource" und Delphi XE.
Bei Delphi 2007 funktioniert es noch ganz normal. Jedoch gibt es Problem mit Delphi XE und PWideChar, PChar und PAnsiChar.

Mein Code sieht folgendermassen aus:

Code:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows;

function GetResources(pSectionName: PChar; out ResourceSize: LongWord): Pointer;
var
  ResourceLocation: HRSRC;
  ResourceHandle: HGLOBAL;
begin
  ResourceLocation := FindResource(hInstance, PAnsiChar(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;

begin
  try
    Writeln(GetResourceAsString('a'));
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Ich bekomme folgenden Fehler:

http://img6.imagebanana.com/img/ujh0sygd/1.png

http://img6.imagebanana.com/img/iaom3ct8/3.png

Wenn ich allerdings PAnsiChar in PWideChar ändere, ist die Ausgabe:

http://img6.imagebanana.com/img/5k6lillb/2.png

Könnte mir da jemand helfen damit das auch mit Delphi XE funktioniert?
Ich bin über jede hilfreiche Antwort dankbar.

Mit freundlichen Grüssen,
Herbert Kuhn

jbg 8. Mär 2012 18:47

AW: FindResource Delphi XE Problem
 
Zitat:

FindResource(hInstance, PAnsiChar(pSectionName), RT_RCDATA);
Hier brauchtst du unbedingt "PChar(pSectionName)" was ab Delphi 2009 dem PWideChar enspricht.


Zitat:

Delphi-Quellcode:
 ResourceData: PChar;
  SResourceSize: LongWord;
begin
  ResourceData := GetResources(pSectionName, SResourceSize);
  SetString(Result, ResourceData, SResourceSize);

Hier liegt der eigentliche Fehler. In Delphi 2007 war PChar = PAnsiChar, also 1 Byte pro Zeichen, womit SResourceSize gleich der Länge des Strings entsprach. Seit der Unicode-Umstellung ist PChar jedoch PWideChar, also 2 Byte pro Zeichen. Da ich davon ausgehe, dass sich die Ressource-Daten nicht von Delphi 2007 nach XE geändert haben, stehen in der Ressource immernoch ANSI-Zeichen, also 1 Byte pro Zeichen. Du lässt Delphi das aber als UNICODE-String interpretieren (PChar).
Es sollte also ausreichen, aus "ResourceData: PChar" ein "ResourceData: PAnsiChar" zu machen. Der Compiler generiert dann für das SetString den richtigen Systemfunktionsaufruf, der einen PAnsiChar samt ANSI-Länge in einen Unicode-String umwandelt.

himitsu 8. Mär 2012 18:53

AW: FindResource Delphi XE Problem
 
Tja, der Compiler sagt dir doch, was falsch ist und darauf sollte man auch hören.
Schau dir also die Parameterdefinitionen der Funktion an und sorge für passende Typen der übergebenen Variablen/Konstanten, oder nutze eine Funktion mit passenden Parametern.

PChar = PWideChar (seit Delphi 2009)

PAnsiChar und PWideChar kann man nicht casten, da nur die Zeigertypen gecastet, aber nicht die Daten konvertiert werden.

Für eine Funktion, welche einen PAnsiChar haben will, brauchst du also einen PAnsiChar, welchen man sich über einen AnsiString besorgen kann.

FindResource will (seit Unicode/Delphi 2009) einen PWideChar haben, also sollte man diesem auch einen PWideChar/PChar geben.

FindResource > PChar (bis D2007 = PAnsiChar / ab D2009 = PWideChar)
FindResourceA > PAnsiChar
FindResourceW > PWideChar



PS:
Compiler-Meldungen kann man auch als Text kopieren. (entsprechende Einträge markieren und dann Strg+C)
Bilder/Anhänge nächstes Mal bitte als Anhang an den Post anhängen.

donkey 8. Mär 2012 20:32

AW: FindResource Delphi XE Problem
 
Vielen Dank für eure hilfreichen Antworten. Das Problem konnte somit behoben werden. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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