Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi IS_INTRESOURCE funktioniert nicht (https://www.delphipraxis.net/87593-is_intresource-funktioniert-nicht.html)

Zacherl 2. Mär 2007 16:54


IS_INTRESOURCE funktioniert nicht
 
Hi,

ich habe folgende Funktion hier in der DP gefunden:

Delphi-Quellcode:
function IS_INTRESOURCE(const p_iParameter : integer) : Boolean;
begin
  Result := (p_iParameter and $FFFF0000) = 0;
end;
Leider gibt sie immer zurück, dass meine Resource ein String ist, obwohl dies nicht stimmen kann, da String(lpszName) = '' ist. Ich füge die Resource mit dem ResourceHacker hinzu. Der Name ist schlicht und einfach 1.

Christian Seehase 2. Mär 2007 17:33

Re: IS_INTRESOURCE funktioniert nicht
 
Moin Florian,

das sieht irgendwie nach einer alten Funktion von mir aus ;-)
(die übrigens falsch deklariert ist :oops:)

So müsste es richtig sein:

Delphi-Quellcode:
function IS_INTRESOURCE(const AdwInteger : DWORD) : Longbool;
begin
  Result := (AdwInteger shr 16) = 0;
end;
Es ist eigentlich ein Macro

Zitat:

Zitat von winuser.h
#define IS_INTRESOURCE(_r) ((((ULONG_PTR)(_r)) >> 16) == 0)


Zacherl 2. Mär 2007 17:38

Re: IS_INTRESOURCE funktioniert nicht
 
Mhh komischerweise funktioniert deine neue Funktion aber auch nicht. IS_INTRESOURCE(Integer(lpName)) gibt immer false zurück, wenn ich eine RCDATA Resource mit dem ResourceHacker angehangen habe.

Der Stringwert des Namens ist allerdings auch '' oder wird zumindest nicht gültig von PChar umgewandlet ..

Woran könnte das liegen?

Christian Seehase 2. Mär 2007 19:04

Re: IS_INTRESOURCE funktioniert nicht
 
Moin Florian,

Zitat:

Zitat von Florian Bernd
Mhh komischerweise funktioniert deine neue Funktion aber auch nicht.

ich denke schon, denn:
Dadurch, dass Du einen Pointer auf integer castest, wird daraus noch lange kein integer Identifier für eine Resource.

Zacherl 2. Mär 2007 19:09

Re: IS_INTRESOURCE funktioniert nicht
 
Nein nein, das meine ich nicht .. wenn ich z.b.

ShowMessage(IntToStr(Integer(lpszName))) aufrufe, dann wird nichts ausgegeben. lpszName bekomme ich aus einem EnumResourceNames Callback.

Christian Seehase 2. Mär 2007 19:14

Re: IS_INTRESOURCE funktioniert nicht
 
Moin Florian,

Zitat:

Zitat von Florian
ShowMessage(IntToStr(Integer(lpszName))) aufrufe, dann wird nichts ausgegeben.

Nichts? :shock:
Das kann ja nun nicht sein. Irgendeine Zahl wird es schon sein müssen.

Zacherl 2. Mär 2007 19:20

Re: IS_INTRESOURCE funktioniert nicht
 
Ne sorry .. so meinte ich .. der Name wird immer als Zeichenkette erkannt, aber z.b.

Showmessage(String(lpszName)); ergibt immer eine leere Zeichenkette. Der Integerwert ist eine sehr lange Zahl.

Christian Seehase 2. Mär 2007 20:25

Re: IS_INTRESOURCE funktioniert nicht
 
Moin Florian,

Zitat:

Zitat von Florian Bernd
Der Integerwert ist eine sehr lange Zahl.

die immer > 65535 ist (Feststellung, keine Frage ;-))
Und dann liefert IS_INTRESOURCE immer false zurück.

Mir fiel inzwischen ein, dass ich ja selber auch mal ein Problem mit Resourcen hatte (LoadString macht Probleme), und aus dem Thread hast Du wohl auch die Deklaration von IS_INTRESOURCE.

Da stellt sich mir die Frage:
Wie liest Du die Daten denn aus?

Zacherl 2. Mär 2007 21:49

Re: IS_INTRESOURCE funktioniert nicht
 
Ich verwende
Delphi-Quellcode:
EnumResourceNames(0, RT_RCDATA, @EnumNamesFunc, 0);
und meine Callback Funktion lautet so:

Delphi-Quellcode:
function EnumNamesFunc(hModule: THANDLE; lpType, lpName: PChar; lParam: DWORD):BOOL; stdcall;
var
  Info,
  FH,
  BW: DWORD;
  FileData: TFileData;
  Params: string;
begin
  Result := True;
  if IS_INTRESOURCE(Integer(lpName)) then
    messagebox(0, pchar('int: ' + inttostr(integer(lpname))), '', 0)
    //FileData := GetFileByID(Integer(lpName))
  else
    messagebox(0, pchar('str: ' + String(lpName)), '', 0);
    //FileData := GetFileByID(StrToInt(String(lpName)));
end;

Christian Seehase 2. Mär 2007 22:47

Re: IS_INTRESOURCE funktioniert nicht
 
Moin Florian,

ich kann da keinen Fehler sehen.
Wenn ich Deinen Sourcecode mal in dem für den o.g. Thread einbaue (Copy&Paste), und statt meiner EnumResourceNames-Aufrufe benutze, werden mir alle RT_RCDATA Resourcennamen angezeigt, die in der jeweiligen Datei enthalten sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 Uhr.
Seite 1 von 2  1 2      

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