如何检查嵌入式资源是否存在?

14
在Delphi中,我正在构建一个HTTP应用程序或Web服务器。它本质上是一个内置于单个EXE文件中的整个网站。我嵌入的文件包括HTML、JS、CSS、SWF、PNG、XML等。资源名称与原始文件名相同,只是将.替换为_。最终,将有大约40-60个文件嵌入到EXE中。
问题是我不想写代码来包装每个单独的文件。目前,我为每个资源声明一个常量,并在使用TResourceStream获取资源时使用该常量。HTTP请求正在请求任何特定文件,由于我将有很多文件,所以我不想使用单独的处理每个文件的方法。此外,将来当我添加一个新的要嵌入的文件时,我应该只需要将其添加到我的资源脚本(.rc)中。因此,我决定更改我的机制,自动将请求的文件名解析为资源的名称。例如,/Home.HTML被解析为HOME_HTML,这应该是嵌入式资源的名称。我需要检查是否存在这样的资源才能加载它。
我可以尝试加载它并捕获任何异常,但如果资源不存在,这将在调试中产生错误。如何在不使用try..except的情况下执行此类检查?

5
你为什么想这样做?使用能够从文件系统中读取的Web服务器的主要优点之一是,你可以在不必更改服务器本身的情况下更改网站上的内容。目前,如果您需要更改文件或添加新文件,则必须构建一个新服务器,关闭现有服务器,将新服务器复制到其中,然后重新启动它。即使停机时间相对较短,这看起来也很糟糕。 - Mason Wheeler
@MasonWheeler 我实际上有几百个,事实上几乎有一千个其他文件,这些文件是应用程序动态生成的。嵌入的内容只是关键的部分,永远不会改变。上面的描述只是一个示例。我这样做的原因是为了分发。目标是能够将这个单独的可执行文件发送给他人,并让他们立即能够运行它。 - Jerry Dodge
2
可以请问一下为什么会被踩吗?还是只是那些常见的 Delphi 反感者之一? - Jerry Dodge
2
这对我来说是个合理的问题,所以你可以免费得到一枚点赞。 - Martin James
@Jerry:啊,我明白了。好的,那就更有意义了。 - Mason Wheeler
2个回答

24

你可以使用 FindResource API,类似下面的方式:


if(FindResource(hInstance, PChar(ResourceName), RT_RCDATA) <> 0)then begin
   // load the resource
end

2
使用Win32 API的FindResource()函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接