Конференция "WinAPI" » Замена ресурсов из файлов? [D7]
 
  • Nikfel (30.05.09 18:02) [0]
    Помогите перевести с языка си на Delphi:

    bool ReplaceBitmap(WORD Number)
    {

    // Переменные для чтения и добавления ресурса
    DWORD dwResSize, dwRead;
    HANDLE File,hUpdateRes;

    // Открываем файл для дальнейшего чтения (файл new.bmp)
    File = CreateFile("new.bmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    // Если открыть не удалось, то выходим
    if(File == INVALID_HANDLE_VALUE) return FALSE;

    // Сохраняем его размер исключив BITMAPFILEHEADER (для остальных ресурсов, исключать размер заголовка не нужно)
    dwResSize = GetFileSize(File, NULL)-sizeof(BITMAPFILEHEADER);
    // Если не удалось получить размер, то выходим
    if(dwResSize <= NULL)
    {
    // Закрываем хендл файла
    CloseHandle(File);
    return FALSE;
    }

    // Создаём массив для чтения файла
    char *pRes=new char[dwResSize];

    // Устанавливаем позицию чтения файла, чтобы не читать заголовок битмапа (для остальных ресурсов следует читать с начала файла и не смещать позицию чтения)
    SetFilePointer(File,sizeof(BITMAPFILEHEADER),0,0);

    // Читаем файл
    if(ReadFile(File, (LPVOID)pRes, dwResSize, &dwRead, NULL) == NULL)
    {
    // Закрываем хендл файла
    CloseHandle(File);
    return FALSE;
    }

    // Начинаем обновлять ресурсы
    hUpdateRes = BeginUpdateResource("ResourceKeeper.exe", FALSE);
    if(hUpdateRes == NULL)
    {
    // Закрываем хендл файла
    CloseHandle(File);
    return FALSE;
    }

    // Добавляем ресурс
    if(UpdateResource(hUpdateRes, RT_BITMAP, MAKEINTRESOURCE(Number), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), (LPVOID)pRes, dwResSize) == NULL)
    {
    // Закрываем хендл файла
    CloseHandle(File);
    return FALSE;
    }

    // Завершаем обновление
    if(EndUpdateResource(hUpdateRes, FALSE) == NULL)
    {
    // Закрываем хендл файла
    CloseHandle(File);
    return FALSE;
    }

    // Закрываем хендл файла
    if(CloseHandle(File) == NULL) return FALSE;
    return TRUE;
    }

    Взято с https://forum.zloy.org/showthread.php?t=10037

    Я никак не могу понять как сделать на Delphi. В коде мне не понятно только:
    char *pRes=new char[dwResSize];
    if(ReadFile(File, (LPVOID)pRes, dwResSize, &dwRead, NULL) == NULL)
    Помогите как правильно это записать. Заранее спасибо.
  • Сергей М. © (30.05.09 19:27) [1]

    > char *pRes=new char[dwResSize];


    var
     pRes: PChar;
    ..
    pRes := SysGetMem(dwResSize);


    > if(ReadFile(File, (LPVOID)pRes, dwResSize, &dwRead, NULL)
    > == NULL)


    if not ReadFile(File, pRes^, dwResSize, dwRead, nil)
  • Nikfel (30.05.09 19:53) [2]
    Вот попробовал так переписать, но работает не правильно, т.е. запись происходит, но получается не правильный рисунок( смотрел в программе Restorator). Где же тут ошибка?

    procedure TForm1.Button1Click(Sender: TObject);
    var dwResSize, dwRead:DWORD;
    hUpdateRes:Cardinal;
    pRes: PChar;
    f:thandle;
    begin
    F:=CreateFile('new.bmp', GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    dwResSize:=GetFileSize(F, nil)-sizeof(BITMAPFILEHEADER);
    pRes:=SysGetMem(dwResSize);
    SetFilePointer(F,sizeof(BITMAPFILEHEADER),0,0);
    ReadFile(F, pRes, dwResSize, dwRead, nil);
    hUpdateRes:=BeginUpdateResource('ResourceKeeper.exe', FALSE);
    UpdateResource(hUpdateRes, RT_BITMAP, 'bmp', LANG_NEUTRAL, pRes, dwResSize);
    EndUpdateResource(hUpdateRes, FALSE);
    CloseHandle(F);
    end;

  • Сергей М. © (30.05.09 19:59) [3]

    > Вот попробовал так переписать


    Ты даже передрать один-в-один мой код не смог, что уж тут о какой-то работоспособности говорить ?)
  • Nikfel (30.05.09 20:01) [4]

    > if not ReadFile(File, pRes^, dwResSize, dwRead, nil)


    Все понял вот об этом забыл что надо pRes^. Еще надо будет добавить проверку на ошибки для правильной работы.

    Спасибо. Все работает.
 
Конференция "WinAPI" » Замена ресурсов из файлов? [D7]
Есть новые Нет новых   [134434   +28][b:0][p:0.001]