На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: jack128, Rouse_, Krid
  
    > Добавление ресурса
      Цитата x2er0 @
      Как можно добавить к .exe файлу в ресурсы файл file.any.

      ExpandedWrap disabled
          procedure ExportData(Path, AName, AType: String; Data: TFileStream); overload;
          var
            hFile: HWND;
            Buf: array of Byte;
          begin
            hFile := BeginUpdateResource(PChar(Path), False);
            try
              if hFile = 0 then
              begin
                RaiseLastOSError;
              end;
              SetLength(Buf, Data.Size);
              Data.Position := 0;
              Data.Read(Buf[0], Data.Size);
              if not UpdateResource(hFile, PChar(AType), PChar(AName),
                0, @Buf[0], Data.Size) then RaiseLastOSError;    
              Finalize(Buf);
            finally
              EndUpdateResource(hFile, False);
            end;
          end;
      Пример вызова:

      ExpandedWrap disabled
                  Data := TFileStream.Create('c:\1.txt', fmOpenRead);
                  try
                    ExportData('c:\test.exe', 'test', 'sometype', Data);
                  finally
                    Data.Free;
                  end;



      Цитата x2er0 @
      В дальнейшем .exe файл извлекет из себя этот ресурс

      ExpandedWrap disabled
          procedure ExtractRes(Path: String);
          begin
            ForceDirectories(Path);
            with TResourceStream.Create(HInstance, 'sometype', 'test') do
            try
              Position := 0;
              SaveToFile(Path + '1.txt');
            finally
              Free;
            end;
          end;


      Пример вызова:

      ExpandedWrap disabled
        ExtractRes('c:\extract\');

      Цитата x2er0 @
      И, как можно узнать, .exe файлу, что есть в нем этот ресур или нет, на случай - можно уже извлекать или еще нет?!


      ExpandedWrap disabled
        var
          ResourceName  : array of ShortString;
         
        function GetResourceList: Boolean;
        var
          Errors: Cardinal;
         
          function CallBack(hModule: HMODULE; lpType: PChar;
            lpzName: LPTSTR; lParam: Longint): BOOL; stdcall;
          var
            Size: Cardinal;
          begin
            Result := True;
            if Assigned(lpzName) then
            begin
              Size := Length(ResourceName);
              Inc(Size);
              SetLength(ResourceName, Size);
              ResourceName[Size - 1] := ShortString(lpzName);
            end;
          end;
         
        begin
          Result := True;
          ResourceName := nil;
          Errors := 0;
          EnumResourceNames(HInstance, 'sometype', @CallBack, 0);
        end;


      Добавлено
      Цитата x2er0 @
      еще: как можно из самого себя удалить ресурс?

      для этого измени в первом коде вот эту строку:
      ExpandedWrap disabled
        if not UpdateResource(hFile, PChar(AType), PChar(AName),
                0, @Buf[0], Data.Size) then RaiseLastOSError;
      на вот такую:
      ExpandedWrap disabled
        if not UpdateResource(hFile, PChar(AType), PChar(AName),
                0, nil, 0) then RaiseLastOSError;

      после этого создавай свою копию, удаляй у копии ресурс и заеняй себя копией (к примеру через батник)
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0210 ]   [ 15 queries used ]   [ Generated: 17.05.24, 04:58 GMT ]