利用ISAPI DLL存储和提供二进制数据

在开发网络应用时,经常需要处理大量的图形资源,如按钮、图标等。这些资源如果以单独的文件形式存在,不仅会增加部署的复杂性,还可能被用户随意修改。为了解决这个问题,采用了一种简单而有效的方法:将这些二进制数据存储在ISAPIDLL中,并编写代码以方便检索。这种方法不仅易于实现,而且在.NET/COM时代仍然非常有用,可以简化二进制数据的打包过程。此外,还发现这种方法可以用于为网络应用提供“皮肤”支持,只需发送一个新的DLL文件,即可改变整个应用的外观,而无需用户复制大量文件到正确的目录。

ISAPIDLL使用了MFC(Microsoft Foundation Classes),发现可以将CByteArray序列化到CHttpServerContext类中。因此,需要做的只是确保能够将二进制数据加载到CByteArray中。以下是实现这一功能的代码示例:

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;

ISAPIDLL假设二进制数据存储类型为"BINARY",如FindResource调用中的最后一个参数所示。当然,可以使用不同的名称,甚至可以通过更改函数参数使名称动态化。将数据添加到DLL中也相当简单,只需使用资源导入命令即可。

测试ISAPIDLL也相当直接,可以在自己的网页或其他组件和ISAPI DLL中添加类似以下的链接:

<img src="http://localhost/Isapi/BinaryLib.dll?GetImage&Image=IDR_KITTY" border="0">

请注意,这些图片不会被浏览器本地缓存,因此性能可能会稍慢。然而,出于某些原因,可能不希望图片被本地缓存。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485