Announcement

Collapse
No announcement yet.

Ressourcen Problem WICHTIG !

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ressourcen Problem WICHTIG !

    Hallo Leute,

    ich habe folgendes Problem und muß es bis nach Weihnachten gelöst haben:
    Ich habe ein paar Dateien über .rc in die Ressourcen meiner DLL eingebunden:

    <PRE>
    resfils.rc
    1000 FILES "test1.exe"
    1001 FILES "test2.exe"
    </PRE>
    und kann diese aber nicht aufrufen.
    Hier mein Code:
    <PRE>
    function InstallFileFromResource(ID: PChar; FileName: String): Boolean;
    var
    stFile : TFileStream;
    hRes, hResFound : THandle;
    P : ^Char;
    N : integer;
    i : integer;
    begin
    FillChar(buffer,MAX_PATH,#0);

    // ID ist gleich '1000';
    hResFound := FindResource(hInstance, ID, 'FILES');
    if hResFound <> 0 then begin
    hRes := LoadResource(hInstance,hResFound);
    if hRes <> 0 then begin
    N := SizeOfResource (HInstance,hRes) ;
    P := lockresource (hRes) ;
    stFile := TFileStream.Create(FileName,fmCreate);
    stFile.Write(P^,N);
    FreeAndNil(stFile);
    UnLockResource(hRes);
    FreeResource(hRes);
    WinExec32AndWait(FileName);
    Result := True;
    end else begin
    Result := False;
    WriteDebugProtokoll('Resource konnte nicht geladen werden!');
    end;
    end else begin
    Result := False;
    WriteDebugProtokoll('Resource konnte nicht gefunden werden!');
    end;
    end;
    </PRE>

    In meinen Debug Protokoll steht immer:
    Resource konnte nicht gefunden werden!

    Was mache ich falsch ?

    Gruß Mike

  • #2
    Hallo Leute,

    ich habs selbst wie folgt gelöst:
    (Für alle die es interessiert!)

    <PRE>
    function InstallFileFromResource(ID: integer; FileName: String): Boolean;

    var
    ResFile : TResourceStream;
    .
    .

    begin
    ResFile := TResourceStream.CreateFromID(hInstance,ID,'FILES') ;
    ResFile.SaveToFile(FileName);
    FreeAndNil(ResFile);
    .
    .
    end;
    </PRE&gt

    Comment


    • #3
      Hallo Mike,<br>
      ich würde so vorgehen:<br>
      <pre>
      <font face="Verdana" size="1" color="#000000">unit main_frm;

      interface

      uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

      type
      TForm1 = class(TForm)
      Button1: TButton;
      procedure Button1Click(Sender: TObject);
      private
      { Private-Deklarationen }
      function LoadRCDLL : THandle;
      procedure UnloadRCDLL(aHandle : THandle);
      procedure WriteExeFromRCToFile(RCHandle : THandle);
      public
      { Public-Deklarationen }
      end;

      var
      Form1: TForm1;
      ApplicationPath : String;
      implementation

      {$R *.dfm}

      procedure TForm1.Button1Click(Sender: TObject);
      var
      FRCDLL_HANDLE : THandle;
      begin
      FRCDLL_HANDLE:=LoadRCDLL;
      Try
      WriteExeFromRCToFile(FRCDLL_HANDLE);
      WinExec(PChar(ApplicationPath+'tmp\rcexe.exe'),SW_ SHOW);
      Finally
      UnloadRCDLL(FRCDLL_HANDLE);
      end;
      end;

      function TForm1.LoadRCDLL: THandle;
      begin
      Result:=LoadLibrary('exedll.dll');
      end;

      procedure TForm1.UnloadRCDLL(aHandle: THandle);
      begin
      FreeLibrary(aHandle);
      end;

      procedure TForm1.WriteExeFromRCToFile(RCHandle: THandle);
      var
      aRS : TResourceStream;
      begin
      TResourceStream.CreateFromID(RCHandle,1000,'EXEDAT A');
      Try
      aRS.SaveToFile(ApplicationPath+'tmp\rcexe.exe');
      Finally
      aRS.Free;
      end;
      end;

      initialization
      ApplicationPath:=ExtractFilePath(Application.ExeNa me);
      ApplicationPath:=IncludeTrailingBackSlash(Applicat ionPath);
      end.</font>
      </pre>
      Dies ist der Quelltext der DLL:<br>
      <pre>

      library exedll;

      uses
      SysUtils,
      Classes;

      {$R 'exe.res' 'exe.rc'}

      begin
      end.
      </pre>
      Dies ist der Inhalt der RC-Datei:<br>
      1000 EXEDATA "rcexe.exe"<br>
      &#10

      Comment

      Working...
      X