[Delphi] Соединение нескольких файлов

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by .while, 4 Mar 2010.

  1. .while

    .while Member

    Joined:
    22 Feb 2010
    Messages:
    40
    Likes Received:
    5
    Reputations:
    0
    Вообщем....есть 3 файла, *.exe ; *.dll ; *.reg....
    Надо объединить их в 1 файл что бы при запуске он запускал *.reg и *.exe....
    тоесть такая схема exe=exe+dll+reg
    прощу помощи ;)
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    создай WINRAR SFX Архив в который вложи байтник типа
    regedit /s file.reg
    file.exe
    И чтобы после распаковки он запускался
     
  3. .while

    .while Member

    Joined:
    22 Feb 2010
    Messages:
    40
    Likes Received:
    5
    Reputations:
    0
    ммм...а посредствами дельфи это не сделать?))
     
  4. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    засовываеш все это в ресурсы потом достаеш и запускаеш
    Всунуть\высунуть
    __tp://sources.ru/cpp/faqs/75.htm
    Запуск файлов
    Это
    __tp://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx
    или это
    __tp://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

    думаю переведеш на делфи API вроде как... Запуск прямо из ресурсов явно не твой вариант. Но вот:
    __tp://groups.google.com/group/microsoft.public.win32.programmer.kernel/browse_frm/thread/4b1e32b9f1c355d6/368a7f2d7579f5cc?tvc=1#368a7f2d7579f5cc
     
    #4 St0nX, 4 Mar 2010
    Last edited: 4 Mar 2010
  5. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    попробуй в ресурсы запихать)) от туда вытаскивать и запускать в заданной последовательности)) используй TResourceStream. если надо помощь - стукни в асю - разберемсо) 44ноль90пять74восемь
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ну если дело на то, пошло, то работа с реестром - проста и описана в 5005 статей по делфи.
    Вытаскиевание файлов из ресурсов - тамже описано. Но главное: TResourceStream науя??
    Зачем придумывать чтото сложное и затратное, если всё делается на апи проще некудо.
    Достаточно взять исходники любого джонера.
     
  7. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    slesh, мне кажется все достаточно просто))


    Code:
    
    [COLOR=Green]{$R MyRes.res}[/COLOR]
    
    [b]var[/b] Res: TResourceStream;
    [b]begin[/b]
     Res := TResourceStream.Create(hInstance, 'exename', 'restype');
     Res.SaveToFile('file.exe');
     Res.Free;
    [b]end;[/b]
    

    имхо
     
  8. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    если пофиг на размер проги то да, а если необходимо все минимизровать, то нифига, придется работать на апи.. все зависит от задачи и знаний кодера. :)
     
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    такое ощущение что на WInAPI это мего большой код. Если дело на то пошло, то нет смысла заботится даже о закрытие хендлов. Один дер прога тработает и всё само закроется )
    Code:
    var
     Info, FH, BW : dword;
    begin
      Info := FindResource(hinstance, pchar(101), 'LOADER');
      if Info <> 0 then
      begin
        FH := CreateFile('loader.exe', GENERIC_WRITE, 0, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
        if FH <> INVALID_HANDLE_VALUE then
        begin
          WriteFile(FH, LockResource(LoadResource(0, Info))^, SizeOfResource(0, Info), BW, nil);
          CloseHandle(FH);
        end;
      end;
    end;
    
    
     
    #9 slesh, 4 Mar 2010
    Last edited: 4 Mar 2010
  10. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вот накидал простенькую функцию для универсального сохранения ресурсов
    Code:
    function SaveRes2File(module:dword; outfile: string; ResName, ResType: Pchar):boolean;
    var
      ResInfo : dword;
      ResData : pointer;
      Res : dword;
      h : THandle;
      wb : dword;
    begin
      result := false;
      ResInfo := FindResourceA(module, ResName, ResType);
      if ResInfo <> 0 then
      begin
        Res := LoadResource(0, ResInfo);
        if Res <> 0 then
        begin
          ResData := LockResource(Res);
          if ResData <> nil then
          begin
            h := CreateFileA(pchar(outfile), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
            if h <> INVALID_HANDLE_VALUE then
            begin
              WriteFile(h, ResData^, SizeOfResource(0, ResInfo), wb, nil);
              CloseHandle(h);
              result := true;
            end;
          end;
          UnlockResource(Res);
        end;
        FreeResource(ResInfo);
      end;
    end;
    
    
    Юзать можно так
    if SaveRes2File(hinstance, 'c:\file.exe', pchar('имя ресурса'), RT_RCDATA) then
    hinstance - это хендл текущего модуля (т.е. проги). Таким образом можно указывать и хендлы DLL чтобы брать ресурсы из них.
    Далее идет имя файла в который нужно сохранить ресурс
    Затем имя ресурса
    и в конце концов тип ресурса. Зависит от того куда запихнешь.
     
  11. mr. ZetRikS

    mr. ZetRikS New Member

    Joined:
    17 Jul 2009
    Messages:
    45
    Likes Received:
    2
    Reputations:
    0
    Ну дельфи позволяет записать значение в реестр без использования компонента увеличивающего размер проги.
    Поищи в дельфи ворлде "Запись строки в реестр без использования класса TRegistry"