Как создать виртуальный файл в приложении Delphi - PullRequest
2 голосов
/ 30 марта 2009

У меня был предыдущий пост о том, как заставить играть поток памяти в wmp activex, и я получил ответ со ссылкой на boxedapp sdk. Это не бесплатная программа, поэтому я изучил этот процесс и выяснил, что он использует виртуальный файл для сохранения потока и что его имя файла используется в качестве URL-адреса. Итак, мой вопрос заключается в том, как создать виртуальный файл, который возвращает дескриптор, к которому затем должен обращаться THandleStream. Я использую Delphi 7. Спасибо.

Желаемый процесс воспроизведения потока памяти в wmp activex или любом плеере:

  1. Создать виртуальный файл и вернуть РУЧКУ; (Это мой вопрос)
  2. Затем к этой РУЧКЕ обращается THandleStream;
  3. THandleStream копирует содержимое MemoryStream для воспроизведения;
  4. Плеер (в моем случае wmp activex) получает доступ к имени файла.
  5. Игрок играет в нее.

Ответы [ 3 ]

3 голосов
/ 30 марта 2009

Если вы пытаетесь создать контент, скрытый от пользователя, как подразумевается в одном из ваших комментариев, вы можете забыть все об этом прямо сейчас. Это невозможно. Никогда не работал и никогда не будет. Вы можете сделать это более сложным, но в конце концов, если компьютер сможет прочитать его, достаточно умный хакер сможет прочитать ваш код и скопировать ваши трюки. Даже схемы DRM с сильным шифрованием имеют тенденцию длиться, в лучшем случае, около месяца, прежде чем их нарушают, и вы даже не пытаетесь зайти так далеко.

1 голос
/ 30 марта 2009

Я полагаю, вы используете функцию канала (из msvcrt.dll):

function _pipe(phandles : pointer; psize : uint; textmode : integer) : integer; cdecl; external 'msvcrt.dll' name '_pipe';

некоторый псевдокод:

var
 _handles : array[0..1] of THandle;
begin
  if _pipe(@_handles, size, 0) = -1 then
   Exit;

  FReadHandle := _handles[0];
  FWriteHandle  := _handles[1];

  _write(FVirtualWriteHandle, Buffer, size);

  close(FWriteHandle);
  close(FReadHandle);

end;
1 голос
/ 30 марта 2009

Boxedapp перехватывает все вызовы ввода-вывода, и в случае, если файл был создан с использованием их API (например, BoxedAppSDK_CreateVirtualFile), они будут обрабатывать вызов самостоятельно. Это непростая задача, вы можете взглянуть на обход , который является структурой перехвата, но что касается перехвата всех вызовов ввода-вывода, удачи с этим.

Зачем тебе это? почему вы не можете сохранить поток памяти во временную папку и воспроизвести файл оттуда? Вам нужно очистить файл после завершения?

...