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 UpdateResource und Resource Section (https://www.delphipraxis.net/150349-updateresource-und-resource-section.html)

stOrM 14. Apr 2010 15:04


UpdateResource und Resource Section
 
Hi,
ich hab grad ein Problem mit UpdateResource...

Das Problem ist, innerhalb einer DLL besteht eine Sektion mit dem Namen IMAGES, innerhalb dieser Sektion gibt es Bilder vom Typ JPEG, die Bilder haben z.b. als Namen 5031 usw...

Meine Frage ist nun wie ich die Bilder innerhalb dieser DLL mit UpdateResource updaten (austauschen) kann, da UpdateResource ja einen ResourceTypen erwartet. Meine Vermutung ist nun das ich die Bilder nicht austauschen kann, da ich kein RT_Data oder sowas in der art in der DLL hab sondern eben besagte Sektion mit Namen IMAGES...

Hat jemand ne Idee wie ich die trotzdem austauschen kann?

Images
-------5031 Type JPEG

Grüsse
s!

himitsu 14. Apr 2010 15:13

Re: UpdateResource und Resource Section
 
[edit] war blöd

[add]
Du kannst ja auch erstmal mit EnumResourceTypes und EnumResourceNames schauen was da ist?

stOrM 14. Apr 2010 15:21

Re: UpdateResource und Resource Section
 
Hmm wär ne Überlegung :idea:
Muss ich mir mal ansehen :shock:

stOrM 15. Apr 2010 08:50

Re: UpdateResource und Resource Section
 
Irgendwie bin ich zu blöd dazu :shock:
Zumindest wird nun die Section IMAGE in der DLL gefunden, mein JPEG in die Section eingefügt, nur hab ich nun nach dem UpdateResource Aufruf z.b. 2 JPEGS darin mit dem Namen 5031 anstelle von einem! :mrgreen:

Ein weiteres Problem kann später auch noch sein, das mein JPEG in der Dll eine Language von Neutral hat, die alte aber ENGLISH ist.

Delphi-Quellcode:
var
  ResLanguage: Word;

function EnumResLangProc(hModule: HMODULE; lpType, lpName: PChar; wIDLanguage: Word;
  lParam: Longint): BOOL; stdcall;
begin
  ResLanguage := wIDLanguage;
  Result := False;
end;

procedure UpdateJPEGResource(const ModulePath, JPEGName, ResourceName: string);
var
  hModule, hUpdate: THandle;
  fs: TFileStream;
  Data: Pointer;
begin
  Data := nil;

  hModule := LoadLibrary(PChar(ModulePath));
  try
    if hModule = 0 then
      RaiseLastOSError;

    EnumResourceLanguages(hModule, 'IMAGE', PChar(ResourceName), @EnumResLangProc, 0);
  finally
    FreeLibrary(hModule);
  end;

  hUpdate := BeginUpdateResource(PChar(ModulePath), false);

  try
    if hUpdate = 0 then
      RaiseLastOSError;

    fs := TFileStream.Create(JPEGName, fmOpenRead);

    Data := AllocMem(fs.Size);
    fs.Read(Data^, fs.Size);

    if not UpdateResource(hUpdate, 'IMAGE', PChar(ResourceName), ResLanguage, Data, fs.Size) then
      RaiseLastOSError;

    if not EndUpdateResource(hUpdate, False) then
      RaiseLastOSError;
  finally
    if Data <> nil then
      FreeMem(Data);

    FreeAndNil(fs);
  end;
end;
Aufruf:

Delphi-Quellcode:
  UpdateJPEGResource('C:\blub.dll', 'C:\5031.jpg', '5031');
Sieht dann so aus:

IMAGE
-----5031 (neues JPEG = LANG_NEUTRAL, SUBLANG_NEUTRAL)
-----5031 (altes JPEG = LANG_ENGLISH, SUBLANG_ENGLISH_US)

Statt:

IMAGE
----5031 (neues JPEG = LANG_ENGLISH, SUBLANG_ENGLISH_US)

Grüsse
s!

himitsu 15. Apr 2010 09:12

Re: UpdateResource und Resource Section
 
Versuch mal das: :gruebel:
Delphi-Quellcode:
UpdateJPEGResource('C:\blub.dll', 'C:\5031.jpg', PChar(5031));

stOrM 15. Apr 2010 09:29

Re: UpdateResource und Resource Section
 
Zitat:

Zitat von himitsu
Versuch mal das: :gruebel:
Delphi-Quellcode:
UpdateJPEGResource('C:\blub.dll', 'C:\5031.jpg', PChar(5031));

Hmmm das gibt dann ne Zugriffsverletzung :roll:


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