Конференция "WinAPI" » Добавление ресурсов в исполняемый файл [D7, WinXP]
 
  • SDrim (02.09.11 17:17) [0]
    Добрый день.

    Ситуация такая, добавляю ресурсы в исполняемый файл с помощью следующей функции


    function WriteRes_SetName(Filename: PChar; Settings: PSettings; NameSection:Pchar): boolean;
    var
     hResource: THandle;
    begin
     Result := False;
     hResource := BeginUpdateResource(Filename, False);
     if hResource <> 0 then
       begin
         if UpdateResource(hResource, RT_RCDATA, NameSection, 0, Settings,
           SizeOf(Settings^)) then
           Result := True;
         EndUpdateResource(hResource, False);
       end;
    end;



    Вызываю так:


    if not WriteRes_SetName(PAnsiChar(FileName), CreteParam, PChar(SectionName)) then
    begin
     ShowMessageLabel('err.', 2, 5);
     exit;
    end;



    Код вызова функций в windows.pas


    function BeginUpdateResource(pFileName: PChar; bDeleteExistingResources: BOOL): THandle; stdcall;

    function UpdateResource(hUpdate: THandle; lpType, lpName: PChar;
     wLanguage: Word; lpData: Pointer; cbData: DWORD): BOOL; stdcall;

    function EndUpdateResource(hUpdate: THandle; fDiscard: BOOL): BOOL; stdcall;



    где SectionName рандомно генерирующееся стринговое значение длиной 5-7 символов.

    Проблема в том что под windows 7 запись проходит нормально. Каждый раз при вызове создаются новые ресурсы с переданым именем.

    Если же код исполняется под XP каждая новая запись затирает предыдущую, а не добавляет новый ресурс.

    Смотрел в MSDN

    BeginUpdateResource(Filename, False); - False (не затирать)
    EndUpdateResource(hResource, False); - False (не затирать)

    Все верно вроде.

    Если же мы под XP передаем фиксированное значение, например


    WriteRes_SetName(PAnsiChar(FileName), CreteParam, PChar,'1');
    WriteRes_SetName(PAnsiChar(FileName), CreteParam, PChar,'2');
    WriteRes_SetName(PAnsiChar(FileName), CreteParam, PChar,'3');



    То все 3 секции будут созданы как не в чем не бывало.
    Т.е Такое чувство что неправельно передаю Pchar
  • SDrim (02.09.11 17:18) [1]
    Немного ошибся в последнем коде.

    Вот так


    WriteRes_SetName(PAnsiChar(FileName), CreteParam,'1');
    WriteRes_SetName(PAnsiChar(FileName), CreteParam,'2');
    WriteRes_SetName(PAnsiChar(FileName), CreteParam,'3');

  • SDrim (02.09.11 19:21) [2]
    Спасибо всем кто помог :)

    гадыыыыыы ...

    Решается так

    Вызываем BeginUpdateResource

    Добавляем сколько нам нужно разных секций всех подряд ресурсов с помощью UpdateResource

    в конце вызываем EndUpdateResource записывая все внесенные изменения..

    Надеюсь поможет кому нибудь, потратил на разбор 9 часов :(
 
Конференция "WinAPI" » Добавление ресурсов в исполняемый файл [D7, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]