在 ISAPI 扩展中存储和检索二进制数据





5.00/5 (1投票)
2002 年 9 月 1 日
3分钟阅读

72880

1487
一种在 ISAP DLL 中存储和检索二进制数据并在网页上显示它们的简单方法。
概述
作为我对CodeProject的首次贡献,我决定做一些非常简单的事情,这在许多情况下也相当有用。几年前,当我致力于一个需要易于安装并且看起来像一个“简单包”的互联网应用程序时,我写了大部分内容。我的问题是我的互联网应用程序有大量的图形(按钮等),并且不想包含这些单独的文件。其中一个目标是确保用户无法随意操作某些图形。
解决方案?
将我们的二进制数据存储在ISAPI DLL中,并添加代码以便于检索。总而言之,这非常容易做到。大多数有经验的ISAPI程序员可以很快完成。好处是,即使在 .NET/COM 时代,它也是一个非常有用的ISAP DLL,可以使打包二进制数据变得容易。我可以想到许多其他用途。从那时起,我一直用它为一些互联网应用程序提供一种“皮肤”支持。只需向用户发送一个新的 DLL,他们的整个应用程序就会突然变得不同(而无需他们将无数个文件复制到正确的目录)。是的,我知道有很多方法可以实现类似的功能,但我仍然喜欢这种方法。
ISAPI DLL 使用 MFC,并且我之前注意到我可以将一个 `CByteArray` 序列化到 `CHttpServerContext` 类。所以基本上我唯一需要做的就是确保我可以将二进制数据加载到 `CByteArray` 中。
这就是以下代码所做的。我们需要做的是找到正确的资源,获取它的大小并将其复制到 `CByteArray`。这是通过对 `FindResource` 和 `LoadResource` 的各种调用实现的。
int iRAWSize = 0;
CByteArray caImage;
CString cImage(sImage);
cImage.Remove('\'');
HRSRC tSrc = ::FindResource(AfxGetResourceHandle() ,cImage,"BINARY");
if (tSrc == NULL) return;
iRAWSize = ::SizeofResource(AfxGetResourceHandle(),tSrc);
caImage.SetSize(iRAWSize);
HGLOBAL hImage;
hImage = ::LoadResource(AfxGetResourceHandle(),tSrc);
if (hImage == NULL) return;
BYTE* pImage = NULL;
pImage = (BYTE*) ::LockResource(hImage);
if (pImage == NULL) return;
for (int iCount = 0; iCount < iRAWSize; iCount++)
caImage.ElementAt(iCount) = pImage[iCount];
*pCtxt << caImage;
请注意,ISAPI DLL 假定您将二进制数据存储为“`BINARY`”类型,如 `FindResource` 调用的最后一个参数所示。当然,您可以使用不同的名称,甚至可以通过更改函数参数使名称动态化。将数据添加到 DLL 中非常容易,只需右键单击资源并使用 `import` 命令即可。
测试 ISAPI DLL 也非常简单,如顶部的介绍图片所示。您可以在自己的网页或其他组件和 ISAPI DLL 中添加这样的链接。
<HTML>
You can add pictures using this dll to your webpages. This is a nce way to
implement "skins" by grouping all pictures in a ISAPI dll
<img src="https:///Isapi/BinaryLib.dll?GetImage&Image=IDR_KITTY" border=0>
</HTML>
请注意,您的浏览器不会在本地缓存这些图片,因此性能可能会稍慢。同样,您可能由于某种原因不想让图片在本地缓存。
不要问我从哪里得到的图片,这是一个很长的故事……就这样了,但我相信您可以想到使用这种方法的其他事情。当然,您不必存储图像。通过向 DLL 添加新功能,您可以支持不同类型的二进制数据。请记住,您的浏览器不会在没有问题的情况下显示所有内容。您可能需要向 `CHttpServerContext` 对象编写一些 HTML 代码,以指示浏览器应该处理您的数据的方式和内容。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。