Einzelnen Beitrag anzeigen

Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: UpdateResource und Resource Section

  Alt 15. Apr 2010, 08:50
Irgendwie bin ich zu blöd dazu
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!

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:

  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!
  Mit Zitat antworten Zitat