如何在Delphi应用程序中创建虚拟文件

时间:2009-03-30 06:23:01

标签: delphi virtualbox

我有a previous post关于如何在wmp activex中播放内存流并得到一个带有boxedapp sdk链接的回复。它不是免费软件所以我研究了这个过程,我发现它正在使用一个虚拟文件来保存流,并将其文件名用作URL。所以,我的问题是如何创建一个返回句柄的虚拟文件,然后由THandleStream访问。我正在使用Delphi 7.谢谢。

如何在wmp activex或任何播放器中播放内存流的过程:

  1. 创建一个虚拟文件并返回一个HANDLE; (这是我的问题)
  2. 然后由THandleStream访问此HANDLE;
  3. THandleStream复制要播放的MemoryStream的内容;
  4. 播放器(在我的情况下为wmp activex)访问文件名。
  5. 玩家播放。

3 个答案:

答案 0 :(得分:3)

如果您正在尝试创建隐藏在用户之外的内容,正如您的一条评论所暗示的那样,您现在也可能会忘记所有相关内容。不可能。从来没有工作过,从来没有。你可以让它变得更加困难,但是如果计算机能够阅读它,那么一天结束时,一个聪明的黑客可以阅读你的代码并复制你的技巧。即使是强加密的DRM方案,在被打破之前最多只能持续一个月左右,而你甚至都没有尝试过那么远。

答案 1 :(得分:1)

Boxedapp拦截所有IO调用,如果文件是使用他们的API创建的(I.E. BoxedAppSDK_CreateVirtualFile),他们将自己处理调用。这不是一件容易的事,你可以看看detours这是一个拦截框架,但至于拦截所有的IO调用,祝你好运。

你为什么需要那个?为什么你不能将内存流保存到临时文件夹并从那里播放文件?你需要在完成后清理文件吗?

答案 2 :(得分:1)

我相信你使用管道功能(来自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;