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 String aus .EXE und .DLL extrahieren? (https://www.delphipraxis.net/89131-string-aus-exe-und-dll-extrahieren.html)

Rakshasa 26. Mär 2007 21:27


String aus .EXE und .DLL extrahieren?
 
Hallo Leute,

unter Windows Vista finden sich in der Registry Dateiangaben, die auf Strings in .DLL oder .EXE-Dateien hinweisen, bspw.
"@comres.dll,-947"

Die Frage ist nun: Wie lese ich diese Strings aus? Bisher habe ich folgende Function vom Board hier benutzt:
Code:
function GetString(const lib: string; id: LongWord): string;
var
  hLib: THandle;
  buf: array [Byte] of Char;
begin
  hLib := LoadLibrary(PChar(lib));
  if LongBool(hLib) then
  try
    SetString(Result, buf, LoadString(hLib, id, @buf[0], SizeOf(buf)));
  finally
    FreeLibrary(hLib);
  end;
end;
Nur funktioniert diese Function nicht (mehr). Hat jemand eine Idee, wie die o.g. String-Resourcen ausgelesen werden können/sollen?

Luckie 26. Mär 2007 21:36

Re: String aus .EXE und .DLL extrahieren?
 
Was heißt "funktioniert nicht mehr" und was sagt MSDN-Library durchsuchenFetLastError?

Rakshasa 26. Mär 2007 22:10

Re: String aus .EXE und .DLL extrahieren?
 
Zitat:

Zitat von Luckie
Was heißt "funktioniert nicht mehr" und was sagt MSDN-Library durchsuchenFetLastError?

"Funktioniert nicht" heißt, dass die String-Ressourcen nicht ausgelesen werden, obwohl sie definitiv da sind (Windows findet sie). Das Ergebnis der Function ist also ein leerer String, eine Exception tritt nicht ein.

"GetLastError" sagt "0", das hilft also auch nicht weiter :(

NicoDE 26. Mär 2007 23:12

Re: String aus .EXE und .DLL extrahieren?
 
ID negiert?
Richtige DLL geladen? (WoW64)?

Rakshasa 26. Mär 2007 23:23

Re: String aus .EXE und .DLL extrahieren?
 
Zitat:

Zitat von NicoDE
ID negiert?
Richtige DLL geladen? (WoW64)?


- ID negiert
- WOW64 wurde berücksichtigt

:(

NicoDE 26. Mär 2007 23:29

Re: String aus .EXE und .DLL extrahieren?
 
Zitat:

Zitat von Rakshasa
WOW64 wurde berücksichtigt

Dann verstehe ich die Verwendung von LoadLibrary nicht. Wenn die FileSystem-Redirection für den Thread deaktiviert wurde und es sich um eine 64-Bit-Bibliothek handelt (und ich mal davon ausgehe, dass du keinen 64-Bit-Pascal-Compiler verwendest), dann kannst du nur LoadLibaryEx(..., LOAD_LIBRARY_AS_DATAFILE) verwenden.

Rakshasa 27. Mär 2007 00:18

Re: String aus .EXE und .DLL extrahieren?
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von Rakshasa
WOW64 wurde berücksichtigt

Dann verstehe ich die Verwendung von LoadLibrary nicht. Wenn die FileSystem-Redirection für den Thread deaktiviert wurde und es sich um eine 64-Bit-Bibliothek handelt (und ich mal davon ausgehe, dass du keinen 64-Bit-Pascal-Compiler verwendest), dann kannst du nur LoadLibaryEx(..., LOAD_LIBRARY_AS_DATAFILE) verwenden.

// noch ein Versuch, nachdem mein Post gelöscht wurde?!

Also: An LoadLibraryEx habe ich überhaupt nicht gedacht... immer dieses 64-Bit ... :)
Mit folgendem Code funktioniert es einwandfrei:

Code:
function GetStringFromDLL(const lib: string; id: LongWord): string;
var
  hLib: THandle;
  buf: array [Byte] of Char;
begin
  ChangeFSRedir(true); // Abstellen der 64-Bit-Redirection
  hLib := LoadLibraryEx(PChar(lib), 0, LOAD_LIBRARY_AS_DATAFILE);
  if LongBool(hLib) then begin
  try
    SetString(Result, buf, LoadString(hLib, id, @buf[0], SizeOf(buf)));
  finally
    FreeLibrary(hLib);
  end;
  end;
 ChangeFSRedir(false); // Zurückstellen der 64-Bit-Redirection
end;
Der Aufruf:

Code:
GetStringFromDLL('C:\Windows\system32\wudfsvc.dll', 1000);
Danke an alle!!! :)


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