Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLL als *.res Datei (https://www.delphipraxis.net/91797-dll-als-%2A-res-datei.html)

sk0r 10. Mai 2007 04:55


DLL als *.res Datei
 
Guten Morgen.

Ich möchte gerne in mein Programm ein *.res Ressourcenscript einbauen,
welche eine Dll sein soll. Diese soll vom Programm dann erstellt werden.

Leider bekomme ich beim schreiben immer den Fehler 1784 ERROR_INVALID_USER_BUFFER.
Keine Ahnung wo der Fehler liegen könnte. Mein Code:

Ressourcenscript
Code:
dllname RT_RCDATA "C:\MeineDll"
Programmcode:
Delphi-Quellcode:
function GetResourceData(rsName, rsType: PAnsiChar): Pointer;stdcall;
var
  fRes, lRes, lResSize: Cardinal;
  gResData: Pointer;
begin
   fRes := FindResource(GetModuleHandle(nil), rsName, rsType);
   if fRes <> 0 then
   begin
    lRes := LoadResource(GetModuleHandle(nil), fRes);
    if lRes <> 0 then
    begin
      gResData := LockResource(lRes);
     result := gResData;
    end;
   end;
end;

function GetResourceSize(srsName, srsType: PAnsiChar): Cardinal;stdcall;
var
   FindRes, sizeRes: Cardinal;
begin
   FindRes := FindResource(GetModuleHandle(nil), srsName, srsType);
   if FindRes <> 0 then
   begin
      sizeRes := SizeOfResource(GetModuleHandle(nil), FindRes);
      if sizeRes <> 0 then
      begin
         result := sizeRes;
      end;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  hcrtDll: Cardinal;
  dwBytesWritten: Cardinal;
  pDllRes: Pointer;
begin
  pDllRes := GetResourceData('dllname', RT_RCDATA);
  hcrtDll := CreateFile('MeineDll.dll', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, 0);
  if hcrtDLl <> INVALID_HANDLE_VALUE then
  begin
     WriteFile(hcrtDll, pDllRes^, GetResourceSize('dllname', RT_RCDATA), dwBytesWritten, 0);
    showmessage(inttostr(GetLastError));
     Closehandle(hcrtDll);
  end;

end;
Weiß jemand woran der Fehler liegt? Mit Bildern klappt alles Perfekt..

MfG

marabu 10. Mai 2007 06:54

Re: DLL als *.res Datei
 
Guten Morgen,

spontan fällt mir auf, dass deine Funktionen mitunter keinen definierten Rückgabewert liefern. Vielleicht besser so:

Delphi-Quellcode:
function GetResourceData(resName, resType: PAnsiChar): Pointer; stdcall;
var
  hRes, hMem: Cardinal;
begin
  Result := nil;
  hRes := FindResource(0, resName, resType);
  if hRes <> 0 then
  begin
    hMem := LoadResource(0, hRes);
    if hMem <> 0 then
      Result := LockResource(hMem);
  end;
end;

function GetResourceSize(resName, resType: PAnsiChar): Cardinal; stdcall;
var
  hModule: Cardinal;
begin
  hModule := 0;
  Result := FindResource(hModule, resName, resType);
  if Result <> 0 then
    Result := SizeOfResource(hModule, Result);
end;
Wenn keine schwerwiegenden Gründe dagegen sprechen, dann würde ich die Funktionen ersetzen durch:

Delphi-Quellcode:
procedure SaveToFile(const fileName, resName: string; resType: PChar);
begin
  with TResourceStream.Create(0, resName, PChar(resType)) do
  try
    SaveToFile(fileName);
  finally
    Free;
  end;
end;
Wenn du statt des Fehlercodes einen Klartext ausgeben möchtest, dann kannst du das so machen:

Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));
Grüße vom marabu

SirThornberry 10. Mai 2007 08:12

Re: DLL als *.res Datei
 
warum verwendest du nicht einfach TRessoruceStream? :gruebel:

[Edit]Den Teil von Marabu übersehen[/Edit]

sk0r 10. Mai 2007 16:36

Re: DLL als *.res Datei
 
Leider klappt das es nicht, er meint die Resource würde nicht exisitieren.
Kann es sein, dass mit DLL-Dateien Probleme existieren und man bestimmte Dinge
beachten muss, bei der Resource selbst?

marabu 10. Mai 2007 17:17

Re: DLL als *.res Datei
 
Hallo,

ich habe beide Ansätze aus Beitrag #2 ausprobiert und sie haben beide funktioniert. Wie hast du die erstellte RES-Datei in dein Projekt eingebunden?

Freundliche Grüße

sk0r 10. Mai 2007 17:37

Re: DLL als *.res Datei
 
Mit der Prozedur SaveToFile geht es, da frag ich mich wieso es mit meinen Funktionen nicht geht :(

naja danke trotzdem

taktaky 8. Okt 2007 23:37

Re: DLL als *.res Datei
 
Sein Problem liegt an .Res
dllname RT_RCDATA "C:\MeineDll" // das ist nur ein Ordner

So ist falsch! Du musst die Dateien auflisten oder Leute?

So:dllname RT_RCDATA "C:\MeineDll" kannst du nie mit brcc32.exe .res erstellen



<>

Muetze1 9. Okt 2007 09:53

Re: DLL als *.res Datei
 
Dann sollte aber brcc32 auch eine entsprechende Fehlermeldung bringen:
Zitat:

Zitat von brcc32
Error test.RC 1 14: Cannot open file: blubb

Wenn er das nicht gesehen hat beim Erstellen, dann saß der Fehler vor'm Rechner...

sk0r 9. Okt 2007 10:03

Re: DLL als *.res Datei
 
hm das thema ist schon längst geklärt.
benutze sowieso nur noch TResourceStream

SirThornberry 9. Okt 2007 10:22

Re: DLL als *.res Datei
 
und wo lag der Fehler?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr.
Seite 1 von 2  1 2      

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