![]() |
Ressourcen aus anderen Pe Dateien auslesen
Hi,
ich habe in der Codelib folgenden Code gefunden:
Delphi-Quellcode:
Kann mir jemand sagen wie ich den umändern muss das ich den auch in "Grafischen" Anweundungen von mir also mit ganz normalen Forms ohne Konsole verwenden kann. Wenn ich manche Sachen übernehm kommt es nämlich zu Fehlern.
program ResLister;
{$APPTYPE CONSOLE} uses Windows, SysUtils; const // Nicht in Delphi 4 deklariert. RT_HTML = PChar(23); RT_MANIFEST = PChar(24); var // Mappingliste von Typen zu Namen ResourceTypeDefaultNames: array[0..20] of record ResType: PChar; ResTypeName: string; end = ( (ResType: RT_ACCELERATOR; ResTypeName: 'RT_ACCELERATOR'; ), (ResType: RT_ANICURSOR; ResTypeName: 'RT_ANICURSOR'; ), (ResType: RT_ANIICON; ResTypeName: 'RT_ANIICON'; ), (ResType: RT_BITMAP; ResTypeName: 'RT_BITMAP'; ), (ResType: RT_CURSOR; ResTypeName: 'RT_CURSOR'; ), (ResType: RT_DIALOG; ResTypeName: 'RT_DIALOG'; ), (ResType: RT_DLGINCLUDE; ResTypeName: 'RT_DLGINCLUDE'; ), (ResType: RT_FONT; ResTypeName: 'RT_FONT'; ), (ResType: RT_FONTDIR; ResTypeName: 'RT_FONTDIR'; ), (ResType: RT_GROUP_CURSOR; ResTypeName: 'RT_GROUP_CURSOR'; ), (ResType: RT_GROUP_ICON; ResTypeName: 'RT_GROUP_ICON'; ), (ResType: RT_HTML; ResTypeName: 'RT_HTML'; ), (ResType: RT_ICON; ResTypeName: 'RT_ICON'; ), (ResType: RT_MANIFEST; ResTypeName: 'RT_MANIFEST'; ), (ResType: RT_MENU; ResTypeName: 'RT_MENU'; ), (ResType: RT_MESSAGETABLE; ResTypeName: 'RT_MESSAGETABLE'; ), (ResType: RT_PLUGPLAY; ResTypeName: 'RT_PLUGPLAY'; ), (ResType: RT_RCDATA; ResTypeName: 'RT_RCDATA'; ), (ResType: RT_STRING; ResTypeName: 'RT_STRING'; ), (ResType: RT_VERSION; ResTypeName: 'RT_VERSION'; ), (ResType: RT_VXD; ResTypeName: 'RT_VXD'; ) ); (****************************************************************************** ** GetEnglishLangName (Hilfsfunktion) ** ** Diese Hilfsfunktion holt den Namen der als LANGID übergebenen Sprache auf ** Englisch und gibt sie als String zurück. ******************************************************************************) function GetEnglishLangName(langid: LANGID): string; var len: Integer; lcid: DWORD; begin lcid := DWORD(langid or (SORT_DEFAULT shl 16)); // MAKELCID len := GetLocaleInfoA(lcid, LOCALE_SENGLANGUAGE, nil, 0); SetLength(Result, len); GetLocaleInfoA(lcid, LOCALE_SENGLANGUAGE, @Result[1], len); end; (****************************************************************************** ** IS_INTRESOURCE (Hilfsfunktion) ** ** Diese Hilfsfunktion überprüft, ob es sich bei einem Ressourcentypnamen um ** einen Integertypen oder einen Stringtypen handelt. Ist es ein Integertyp, so ** wird True zurückgegeben, ansonsten False. ******************************************************************************) function IS_INTRESOURCE(lpszType: PChar): Boolean; begin Result := ((DWORD(lpszType) shr 16) = 0); end; (****************************************************************************** ** ResourceTypes (Hilfsfunktion) ** ** Diese Hilfsfunktion erzeugt aus dem übergenen Ressourentypnamen eine lesbare ** Form. Dies schließt Integertypnamen ein. ** Sollte es sich um einen der Standardtypen handeln, so wird an die numerische ** Form des Ressourcentypnamen noch der Name der Konstante in Klammern ** angehangen. ******************************************************************************) function ResourceTypes(lpszType: PChar): string; var i: Integer; begin if (IS_INTRESOURCE(lpszType)) then Result := Format('#%d', [Word(lpszType)]) else Result := Format('%s', [string(lpszType)]); for i := 0 to Length(ResourceTypeDefaultNames) - 1 do begin if (MAKEINTRESOURCE(lpszType) = MAKEINTRESOURCE(ResourceTypeDefaultNames[i].ResType)) then begin Result := Result + Format(' (%s)', [ResourceTypeDefaultNames[i].ResTypeName]); Break; end; end; end; (****************************************************************************** ** EnumResLangProc ** ** Eine Callback-Funktion, welche für jeden im Modul enthaltenen Ressourcentyp ** pro enthaltenem Ressourcennamen so oft aufgerufen wird, wie es Sprachen ** gibt, in denen die Ressource verfügbar ist. ** ** Die Funktion ihrerseits gibt den aktuellen Sprachcode aus. ******************************************************************************) function EnumResLangProcA(hModule: HINST; lpszType: PChar; lpszName: PChar; wIDLanguage: Word; lParam: LPARAM): BOOL; stdcall; begin Writeln(Format(#9'%4.4X - %s', [wIDLanguage, GetEnglishLangName(wIDLanguage)])); Result := True; end; (****************************************************************************** ** EnumResNameProc ** ** Eine Callback-Funktion, welche für jeden im Modul enthaltenen Ressourcentyp ** pro enthaltenem Ressourcennamen einmal aufgerufen wird. ** ** Die Funktion ihrerseits gibt den Namen der Ressource aus und ermittelt die ** Sprachcodes (LANGID) der Sprachen in welchen die Ressource verfügbar ist ** durch Aufruf einer weiteren Enumerierungsfunktion EnumResLangProc(). ******************************************************************************) function EnumResNameProcA(hModule: HINST; lpszType: PChar; lpszName: PChar; lParam: LPARAM): BOOL; stdcall; begin // Teste auf Integer statt Namen if (IS_INTRESOURCE(lpszName)) then Writeln(Format(' -> #%d', [Word(lpszName)])) // Ansonsten normal als String behandeln else Writeln(Format(' -> %s', [string(lpszName)])); EnumResourceLanguagesA(hModule, lpszType, lpszName, @EnumResLangProcA, 0); Result := True; end; (****************************************************************************** ** EnumResTypeProc ** ** Eine Callback-Funktion, welche für jeden im Modul enthaltenen Ressourcentyp ** einmal aufgerufen wird. ** ** Die Funktion ihrerseits wandelt den Typennamen in eine lesbare Form um und ** ruft dann eine weitere Enumerierungsfunktion (und damit Callbackfunktion) ** auf, die die Namen der eigentlichen Ressourcen auflistet. ******************************************************************************) function EnumResTypeProcA(hModule: HINST; lpszType: PChar; lParam: LPARAM): BOOL; stdcall; begin Writeln('RESOURCE TYPE: ', ResourceTypes(lpszType)); EnumResourceNamesA(hModule, lpszType, @EnumResNameProcA, 0); Result := True; end; (****************************************************************************** ** ListResources ** ** Nimmt den Dateinamen der EXE oder DLL (oder anderen PE-Datei) entgegen. ** ** Danach ruft diese Funktion eine Enumerierungsfunktion auf, welche alle im ** Modul vorhandenen Ressourcentypen auflistet. Die übergebene Callbackfunktion ** EnumResTypeProc() ist für die weitere Verarbeitung zuständig. ******************************************************************************) procedure ListResources(filename: string); var hModule: HINST; begin hModule := LoadLibraryEx(@filename[1], 0, LOAD_LIBRARY_AS_DATAFILE); if (hModule <> 0) then try EnumResourceTypesA(hModule, @EnumResTypeProcA, 0); finally FreeLibrary(hModule); end; end; (****************************************************************************** ** Hauptfunktion ** ** Überprüft die Parameter und gibt ggf. einen Syntaxhinweis aus. Ansonsten ** wird die zum Auflisten der Ressourcen zuständige Funktion aufgerufen! ******************************************************************************) begin if (ParamCount() < 1) then begin Writeln(Format('Syntax: %s <Filename>', [ParamStr(0)])); Exit; end; if (FileExists(ParamStr(1))) then begin ListResources(ParamStr(1)); end else begin Writeln('The given file does not exist.'); end; end. MFG Lars Wiltfang |
Re: Ressourcen aus anderen Pe Dateien auslesen
Hi,
Musst halt die ganzen readlns und writelns rausnehmen... Ersetz sie durch was anderes oder lass sie weg. |
Re: Ressourcen aus anderen Pe Dateien auslesen
Und wo muss der Teil hier hin:
Delphi-Quellcode:
end = (
(ResType: RT_ACCELERATOR; ResTypeName: 'RT_ACCELERATOR'; ), (ResType: RT_ANICURSOR; ResTypeName: 'RT_ANICURSOR'; ), (ResType: RT_ANIICON; ResTypeName: 'RT_ANIICON'; ), (ResType: RT_BITMAP; ResTypeName: 'RT_BITMAP'; ), (ResType: RT_CURSOR; ResTypeName: 'RT_CURSOR'; ), (ResType: RT_DIALOG; ResTypeName: 'RT_DIALOG'; ), (ResType: RT_DLGINCLUDE; ResTypeName: 'RT_DLGINCLUDE'; ), (ResType: RT_FONT; ResTypeName: 'RT_FONT'; ), (ResType: RT_FONTDIR; ResTypeName: 'RT_FONTDIR'; ), (ResType: RT_GROUP_CURSOR; ResTypeName: 'RT_GROUP_CURSOR'; ), (ResType: RT_GROUP_ICON; ResTypeName: 'RT_GROUP_ICON'; ), (ResType: RT_HTML; ResTypeName: 'RT_HTML'; ), (ResType: RT_ICON; ResTypeName: 'RT_ICON'; ), (ResType: RT_MANIFEST; ResTypeName: 'RT_MANIFEST'; ), (ResType: RT_MENU; ResTypeName: 'RT_MENU'; ), (ResType: RT_MESSAGETABLE; ResTypeName: 'RT_MESSAGETABLE'; ), (ResType: RT_PLUGPLAY; ResTypeName: 'RT_PLUGPLAY'; ), (ResType: RT_RCDATA; ResTypeName: 'RT_RCDATA'; ), (ResType: RT_STRING; ResTypeName: 'RT_STRING'; ), (ResType: RT_VERSION; ResTypeName: 'RT_VERSION'; ), (ResType: RT_VXD; ResTypeName: 'RT_VXD'; ) ); |
Re: Ressourcen aus anderen Pe Dateien auslesen
Hi,
Mach es der Übersicht und dem Verständnis wegen so:
Delphi-Quellcode:
interface
type TResourceName = record ResType: PChar; ResTypeName: string; end; var // Mappingliste von Typen zu Namen ResourceTypeDefaultNames: array[0..20] of TResourceName = ( (ResType: RT_ACCELERATOR; ResTypeName: 'RT_ACCELERATOR'; ), (ResType: RT_ANICURSOR; ResTypeName: 'RT_ANICURSOR'; ), (ResType: RT_ANIICON; ResTypeName: 'RT_ANIICON'; ), (ResType: RT_BITMAP; ResTypeName: 'RT_BITMAP'; ), (ResType: RT_CURSOR; ResTypeName: 'RT_CURSOR'; ), (ResType: RT_DIALOG; ResTypeName: 'RT_DIALOG'; ), (ResType: RT_DLGINCLUDE; ResTypeName: 'RT_DLGINCLUDE'; ), (ResType: RT_FONT; ResTypeName: 'RT_FONT'; ), (ResType: RT_FONTDIR; ResTypeName: 'RT_FONTDIR'; ), (ResType: RT_GROUP_CURSOR; ResTypeName: 'RT_GROUP_CURSOR'; ), (ResType: RT_GROUP_ICON; ResTypeName: 'RT_GROUP_ICON'; ), (ResType: RT_HTML; ResTypeName: 'RT_HTML'; ), (ResType: RT_ICON; ResTypeName: 'RT_ICON'; ), (ResType: RT_MANIFEST; ResTypeName: 'RT_MANIFEST'; ), (ResType: RT_MENU; ResTypeName: 'RT_MENU'; ), (ResType: RT_MESSAGETABLE; ResTypeName: 'RT_MESSAGETABLE'; ), (ResType: RT_PLUGPLAY; ResTypeName: 'RT_PLUGPLAY'; ), (ResType: RT_RCDATA; ResTypeName: 'RT_RCDATA'; ), (ResType: RT_STRING; ResTypeName: 'RT_STRING'; ), (ResType: RT_VERSION; ResTypeName: 'RT_VERSION'; ), (ResType: RT_VXD; ResTypeName: 'RT_VXD'; ) ); |
Re: Ressourcen aus anderen Pe Dateien auslesen
Direkt hinter interface? Da kommen sehr viele Fehler.
|
Re: Ressourcen aus anderen Pe Dateien auslesen
Och Lars.
Das ist ne Record Deklaration und danach eine globale, vorinitialisierte Variable. Was für Fehler kommen denn da? |
Re: Ressourcen aus anderen Pe Dateien auslesen
Also wenn ich das jetzt so mache wie du gesagt hast sieht das oben in der pas Datei so aus:
Delphi-Quellcode:
unit Unit3;
interface type TResourceName = record ResType: PChar; ResTypeName: string; end; var // Mappingliste von Typen zu Namen ResourceTypeDefaultNames: array[0..20] of TResourceName = ( (ResType: RT_ACCELERATOR; ResTypeName: 'RT_ACCELERATOR'; ), (ResType: RT_ANICURSOR; ResTypeName: 'RT_ANICURSOR'; ), (ResType: RT_ANIICON; ResTypeName: 'RT_ANIICON'; ), (ResType: RT_BITMAP; ResTypeName: 'RT_BITMAP'; ), (ResType: RT_CURSOR; ResTypeName: 'RT_CURSOR'; ), (ResType: RT_DIALOG; ResTypeName: 'RT_DIALOG'; ), (ResType: RT_DLGINCLUDE; ResTypeName: 'RT_DLGINCLUDE'; ), (ResType: RT_FONT; ResTypeName: 'RT_FONT'; ), (ResType: RT_FONTDIR; ResTypeName: 'RT_FONTDIR'; ), (ResType: RT_GROUP_CURSOR; ResTypeName: 'RT_GROUP_CURSOR'; ), (ResType: RT_GROUP_ICON; ResTypeName: 'RT_GROUP_ICON'; ), (ResType: RT_HTML; ResTypeName: 'RT_HTML'; ), (ResType: RT_ICON; ResTypeName: 'RT_ICON'; ), (ResType: RT_MANIFEST; ResTypeName: 'RT_MANIFEST'; ), (ResType: RT_MENU; ResTypeName: 'RT_MENU'; ), (ResType: RT_MESSAGETABLE; ResTypeName: 'RT_MESSAGETABLE'; ), (ResType: RT_PLUGPLAY; ResTypeName: 'RT_PLUGPLAY'; ), (ResType: RT_RCDATA; ResTypeName: 'RT_RCDATA'; ), (ResType: RT_STRING; ResTypeName: 'RT_STRING'; ), (ResType: RT_VERSION; ResTypeName: 'RT_VERSION'; ), (ResType: RT_VXD; ResTypeName: 'RT_VXD'; ) ); uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, shellapi, StdCtrls, ExtCtrls, Registry, XPMan, ComCtrls, signed, md5, DFFileInfo, AppEvnts, DECHash, DECUtil, DECFmt; type TForm3 = class(TForm) //bla bla bla private public end; var Form3: TForm3; end; Dann kommen folgende Fehler: [DCC Fehler] Unit3.pas(16): E2003 Undefinierter Bezeichner: 'RT_ACCELERATOR' [DCC Fehler] Unit3.pas(16): E2026 Konstantenausdruck erwartet [DCC Fehler] Unit3.pas(17): E2003 Undefinierter Bezeichner: 'RT_ANICURSOR' [DCC Fehler] Unit3.pas(17): E2026 Konstantenausdruck erwartet [DCC Fehler] Unit3.pas(18): E2003 Undefinierter Bezeichner: 'RT_ANIICON' [DCC Fehler] Unit3.pas(19): E2003 Undefinierter Bezeichner: 'RT_BITMAP' [DCC Fehler] Unit3.pas(20): E2003 Undefinierter Bezeichner: 'RT_CURSOR' [DCC Fehler] Unit3.pas(21): E2003 Undefinierter Bezeichner: 'RT_DIALOG' [DCC Fehler] Unit3.pas(22): E2003 Undefinierter Bezeichner: 'RT_DLGINCLUDE' [DCC Fehler] Unit3.pas(22): E2026 Konstantenausdruck erwartet [DCC Fehler] Unit3.pas(23): E2003 Undefinierter Bezeichner: 'RT_FONT' [DCC Fehler] Unit3.pas(24): E2003 Undefinierter Bezeichner: 'RT_FONTDIR' [DCC Fehler] Unit3.pas(25): E2003 Undefinierter Bezeichner: 'RT_GROUP_CURSOR' [DCC Fehler] Unit3.pas(25): E2026 Konstantenausdruck erwartet [DCC Fehler] Unit3.pas(26): E2003 Undefinierter Bezeichner: 'RT_GROUP_ICON' [DCC Fehler] Unit3.pas(26): E2026 Konstantenausdruck erwartet [DCC Fehler] Unit3.pas(27): E2003 Undefinierter Bezeichner: 'RT_HTML' [DCC Fehler] Unit3.pas(28): E2003 Undefinierter Bezeichner: 'RT_ICON' [DCC Fehler] Unit3.pas(29): E2003 Undefinierter Bezeichner: 'RT_MANIFEST' [DCC Fehler] Unit3.pas(29): E2026 Konstantenausdruck erwartet [DCC Fehler] Unit3.pas(30): E2003 Undefinierter Bezeichner: 'RT_MENU' [DCC Fehler] Unit3.pas(31): E2003 Undefinierter Bezeichner: 'RT_MESSAGETABLE' [DCC Fehler] Unit3.pas(31): E2026 Konstantenausdruck erwartet [DCC Fehler] Unit3.pas(32): E2003 Undefinierter Bezeichner: 'RT_PLUGPLAY' [DCC Fehler] Unit3.pas(32): E2026 Konstantenausdruck erwartet [DCC Fehler] Unit3.pas(33): E2003 Undefinierter Bezeichner: 'RT_RCDATA' [DCC Fehler] Unit3.pas(34): E2003 Undefinierter Bezeichner: 'RT_STRING' [DCC Fehler] Unit3.pas(35): E2003 Undefinierter Bezeichner: 'RT_VERSION' [DCC Fehler] Unit3.pas(36): E2003 Undefinierter Bezeichner: 'RT_VXD' [DCC Fehler] Unit3.pas(39): E2029 Deklaration erwartet, aber 'USES' gefunden [DCC Fehler] Unit3.pas(45): E2003 Undefinierter Bezeichner: 'TForm' [DCC Fehler] Unit3.pas(46): E2003 Undefinierter Bezeichner: 'TEdit' [DCC Fehler] Unit3.pas(47): E2003 Undefinierter Bezeichner: 'TButton' [DCC Fehler] Unit3.pas(48): E2003 Undefinierter Bezeichner: 'TXPManifest' [DCC Fehler] Unit3.pas(49): E2003 Undefinierter Bezeichner: 'TOpenDialog' [DCC Fehler] Unit3.pas(50): E2003 Undefinierter Bezeichner: 'TDFFileInfo' [DCC Fehler] Unit3.pas(51): E2003 Undefinierter Bezeichner: 'TTimer' [DCC Fehler] Unit3.pas(52): E2003 Undefinierter Bezeichner: 'TApplicationEvents' [DCC Fehler] Unit3.pas(53): E2003 Undefinierter Bezeichner: 'TLabel' [DCC Fehler] Unit3.pas(55): E2003 Undefinierter Bezeichner: 'TPageControl' [DCC Fehler] Unit3.pas(56): E2003 Undefinierter Bezeichner: 'TTabSheet' [DCC Fehler] Unit3.pas(57): E2003 Undefinierter Bezeichner: 'TImage' [DCC Fehler] Unit3.pas(90): E2003 Undefinierter Bezeichner: 'TDateTimePicker' [DCC Fehler] Unit3.pas(94): E2003 Undefinierter Bezeichner: 'TCheckBox' [DCC Fehler] Unit3.pas(97): E2003 Undefinierter Bezeichner: 'TMemo' [DCC Fehler] Unit3.pas(139): E2003 Undefinierter Bezeichner: 'Exception' [DCC Fehler] Unit3.pas(141): E2003 Undefinierter Bezeichner: 'TCloseAction' [DCC Fehler] Unit3.pas(147): E2003 Undefinierter Bezeichner: 'TWMDropFiles' [DCC Fehler] Unit3.pas(147): E2003 Undefinierter Bezeichner: 'WM_DROPFILES' [DCC Fehler] Unit3.pas(147): E2139 Ungültiger Botschaftsmethoden-Index [DCC Fehler] Unit3.pas(163): E2003 Undefinierter Bezeichner: 'TMemoryStream' [DCC Fehler] Unit3.pas(169): E2004 Bezeichner redefiniert: 'TResourceName' [DCC Fehler] Unit1.pas(241): E2003 Undefinierter Bezeichner: 'Close' [DCC Fehler] Unit3.pas(178): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden |
Re: Ressourcen aus anderen Pe Dateien auslesen
kein Kommentar :roll:
|
Re: Ressourcen aus anderen Pe Dateien auslesen
Was kommt denn normalerweise hinter "interface"?
|
Re: Ressourcen aus anderen Pe Dateien auslesen
Das ist nunmal das Problem, wenn man versucht mit Copy und Paste versucht Anwendungen zu erstellen und absolut NULL kappiert von dem, was man da tut!
Edit: Und wenn man zu faul ist, mal eben selbst zu schauen, was man denn am neuen Code anders gemacht hat, als am alten. -sic- |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz