AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FindResource Delphi XE Problem

Ein Thema von donkey · begonnen am 8. Mär 2012 · letzter Beitrag vom 8. Mär 2012
Antwort Antwort
Benutzerbild von donkey
donkey

Registriert seit: 1. Jan 2012
2 Beiträge
 
#1

FindResource Delphi XE Problem

  Alt 8. Mär 2012, 19:34
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
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: FindResource Delphi XE Problem

  Alt 8. Mär 2012, 19:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#3

AW: FindResource Delphi XE Problem

  Alt 8. Mär 2012, 19:53
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von donkey
donkey

Registriert seit: 1. Jan 2012
2 Beiträge
 
#4

AW: FindResource Delphi XE Problem

  Alt 8. Mär 2012, 21:32
Vielen Dank für eure hilfreichen Antworten. Das Problem konnte somit behoben werden.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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