Einzelnen Beitrag anzeigen

Olli
(Gast)

n/a Beiträge
 
#8

Re: Ressourcen mit WinAPI laden

  Alt 9. Jul 2006, 01:55
Uralt und funzt immernoch:
Delphi-Quellcode:
function ExtractResTo(Instance: hInst; BinResName, NewPath, ResType: string):
  boolean;
(*******************************************************************************
Function:  ExtractResTo
Returns:    Boolean (true=success)
Version:    Function version 3.0

Parameters
Instance:  is the instance handle of the module containing the resource. if not
            current module, use LLoadLibrary() and FreeLibrary() to load and free
            the module containing the resource.
BinResName: is the name of the resource to extract. this would even work with
            icons, cursors, texts, yaddayadda ...
NewPath:    path of the file to create from the resource (where to put the
            file)
ResType:    resource type. pre-defined values can be found in Windows.pas
            e.g. RT_RCDATA
*******************************************************************************)

var
  ResSize,
    HG,
    HI,
    SizeWritten,
    hFileWrite: Cardinal;
begin
  result := false;
  HI := FindResource(Instance, @binresname[1], @ResType[1]);
  if HI <> 0 then begin
    HG := LoadResource(Instance, HI);
    if HG <> 0 then
    try
      ResSize := SizeOfResource(Instance, HI);
      hFileWrite := CreateFile(@newpath[1], GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS,
        FILE_ATTRIBUTE_ARCHIVE, 0);
      if hFileWrite <> INVALID_HANDLE_VALUE then
      try
        result := (WriteFile(hFileWrite, LockResource(HG)^, ResSize,
          SizeWritten, nil) and (SizeWritten = ResSize));
      finally
        CloseHandle(hFileWrite);
      end;
    except;
    end;
  end;
end;
siehe auch hier und Hier im Forum suchenExtractResTo sowie Hier im Forum suchenPutBinResTo ...

Übrigens sind selbst Delphi-Strings (AnsiString, LongString, WideString) keine nullterminierten Zeichenketten, somit ist es absolut irrelevant für die Funktion ob die zu extrahierenden Daten nun Text sind oder nicht. Man kann sich auch gut vorstellen eine Liste von nullterminierten Strings als Ressource einzubinden, oder?!
Auch für Strings habe ich schon vor Jahren was geschrieben, finde es aber im Moment nicht. Ist aber sowieso nur eine Modifikation des ursprünglichen Codes der obigen Funktion gewesen.

Übrigens lautet die Konstante ja auch: RT_RCDATA, nur mal so ...

Denn wie wir alle wissen ist RT_RCDATA wie folgt deklariert:
Code:
#define RT_RCDATA          MAKEINTRESOURCE(10)
oder delphianisch:const RT_RCDATA = PChar(10);
  Mit Zitat antworten Zitat