Проблема с извлечением ресурса

Тема в разделе "Delphi - Система", создана пользователем Dzmitry Kalesnikau, 23 янв 2007.

Статус темы:
Закрыта.
  1. Dzmitry Kalesnikau

    Dzmitry Kalesnikau Гость

    Уважаемые программисты.
    Есть следующий код:
    Код (Text):
    program ExtrResSave;

    function LoadResource(hModule: CARDINAL; hResInfo: CARDINAL):CARDINAL; stdcall; external 'kernel32.dll' name 'LoadResource';
    function FindResource(hModule: CARDINAL; lpName, lpType: PChar): CARDINAL; stdcall; external 'kernel32.dll' name 'FindResourceA';
    function LockResource(hResData: CARDINAL): Pointer; stdcall; external 'kernel32.dll' name 'LockResource';
    function LoadLibrary(lpLibFileName: PChar): CARDINAL; stdcall; external 'kernel32.dll' name 'LoadLibraryA';
    function FreeLibrary(hLibModule: CARDINAL): BOOLEAN; stdcall; external 'kernel32.dll' name 'FreeLibrary';
    function GetCommandLine: PChar; stdcall; external 'kernel32.dll' name 'GetCommandLineA';

    var pData: Pointer; libr:CARDINAL; f:textfile; s:string;

    begin
    libr:=LoadLibrary(GetCommandLine);
    pData:=LockResource(LoadResource(libr, FindResource(libr,'EXEDATA',PChar(10))));
    AssignFile(f,'tmp.dat');
    Rewrite(f);
    s:=PChar(pData);
    Write(f,s);
    Closefile(f);
    FreeLibrary(libr);
    end.
    Код в принципе рабочий, но почему-то в файл извлекается не весь ресурс, а его определённый кусок. Извлечение прекращается, как только в коде ресурса встречается байт $00. Тоесть извлекается кусок ресурса только до позиции первого же $00 в нём и всё. При этом никаких ошибок не возникает.
    В связи с этим и вопросы: Почему так происходит? Как устранить проблему? Какой есть рабочий код для этого?
     
  2. Barmutik

    Barmutik Гость

    Ну однозначно почему ..#0 - это признать конца PChar... вот только до него и читает ...

    А не проще ли воспользовать готовым классом TResourceStream и потом прямо из него сохранить в нужный Вам файл?
     
  3. Dzmitry Kalesnikau

    Dzmitry Kalesnikau Гость

    Спасибо, понял теперь почему. Но готовым классом пользоваться нельзя, т.к. в данном случае требуется минимальный размер скомпилированного приложения. Возможно даже придётся самостоятельно осуществлять запись в файл и работу со строками, дабы отказаться от sysinit.pas и system.pas. А так конечно, с TResourceStream работать легко и я уже делал, а тут на чистом API нужно. Но тогда как правильно читать ресурс, если $00 останавливает считывание?
    И интересно то, что если брать pData из ресурса (например звукового файла wav) и подавать его функции PlaySound(PChar(pData),0,$04) так, то несмотря на содержание в коде ресурса неоднократно $00 считывание ресурса происходит до конца - звуковой файл полностью проигрывается. Но при попытке парралельно проигрыванию сохранить этот ресурс в файл он, как обычно, только до первого $00.
    Как можно сохранить pData в файл? Я так понимаю, что данные в pData - просто последовательность байт, может попробовать сохранять в нетипизированный файл побайтно, вот как только...
     
  4. Barmutik

    Barmutik Гость

    Вы не путайте одно с другим .. когда Вы преобразуете в строку s:=PChar(pData); Вы теряете всё что хранится после #0.

    А что Вам мешает напрямую записать в файл блок памяти? Зачем пробразовывать в строку?
     
  5. Dzmitry Kalesnikau

    Dzmitry Kalesnikau Гость

    Дело в том, что там планируется ещё добавить обработку строки s одной функцией (я буду заменять некоторые символы на другие в этой строке), перед тем как записать в файл.
     
  6. Barmutik

    Barmutik Гость

    Так а кто мешает заменять напрямую в блоке памяти ? Зачем преобразоваине в строку?

    Этим преобразованием Вы существенно снижаете возможности Вашей программы.. не говоря уже о дополнительных глюках со специальными символами...
     
Загрузка...
Похожие Темы - Проблема извлечением ресурса
  1. c0de3r
    Ответов:
    5
    Просмотров:
    127
  2. DobermannTT
    Ответов:
    10
    Просмотров:
    136
  3. SoulPaladin
    Ответов:
    4
    Просмотров:
    133
  4. Artael
    Ответов:
    1
    Просмотров:
    110
  5. ENSLER
    Ответов:
    0
    Просмотров:
    103
Статус темы:
Закрыта.

Поделиться этой страницей