2

我之前有一篇关于如何在 wmp activex 中播放 memorystream 的帖子,并得到了回复,并附有 boxedapp sdk 的链接。它不是免费软件,所以我研究了这个过程,发现它使用虚拟文件来保存流,并且它的文件名用作 URL。所以,我的问题是如何创建一个返回句柄的虚拟文件,然后应该由 THandleStream 访问该句柄。我正在使用 Delphi 7。谢谢。

关于如何在 wmp activex 或任何播放器中播放 memorystream 的所需过程:

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

3 回答 3

3

如果您尝试创建对用户隐藏的内容,正如您的一条评论所暗示的那样,您现在可能会忘记它。不可能。从来没有工作过,也永远不会。你可以让它变得更难,但归根结底,如果计算机能够读取它,足够聪明的黑客可以读取你的代码并复制你的技巧。即使是高度加密的 DRM 方案在被破解之前最多只能持续大约一个月,而且你甚至没有尝试走那么远。

于 2009-03-30T12:02:09.503 回答
1

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

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

于 2009-03-30T06:49:48.820 回答
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;
于 2009-03-30T11:14:36.450 回答