AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL als *.res Datei

Ein Thema von sk0r · begonnen am 10. Mai 2007 · letzter Beitrag vom 9. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#1

DLL als *.res Datei

  Alt 10. Mai 2007, 05:55
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: DLL als *.res Datei

  Alt 10. Mai 2007, 07:54
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:

ShowMessage(SysErrorMessage(GetLastError)); Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: DLL als *.res Datei

  Alt 10. Mai 2007, 09:12
warum verwendest du nicht einfach TRessoruceStream?

[Edit]Den Teil von Marabu übersehen[/Edit]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: DLL als *.res Datei

  Alt 10. Mai 2007, 17:36
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: DLL als *.res Datei

  Alt 10. Mai 2007, 18:17
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
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: DLL als *.res Datei

  Alt 10. Mai 2007, 18:37
Mit der Prozedur SaveToFile geht es, da frag ich mich wieso es mit meinen Funktionen nicht geht

naja danke trotzdem
  Mit Zitat antworten Zitat
taktaky
(Gast)

n/a Beiträge
 
#7

Re: DLL als *.res Datei

  Alt 9. Okt 2007, 00:37
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



<>
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: DLL als *.res Datei

  Alt 9. Okt 2007, 10:53
Dann sollte aber brcc32 auch eine entsprechende Fehlermeldung bringen:
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...
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: DLL als *.res Datei

  Alt 9. Okt 2007, 11:03
hm das thema ist schon längst geklärt.
benutze sowieso nur noch TResourceStream
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: DLL als *.res Datei

  Alt 9. Okt 2007, 11:22
und wo lag der Fehler?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 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