软盘君比较喜欢怀旧,所以仍然使用Delphi7。发送HTTP请求没有问题,但是如果要HTTPS的话就问题大大的有了,需要OpenSSL,但是网上没有找到静态连接OpenSSL的教程,所以被迫要带着这沉重的两个DLL文件。
但是下载的文件要拖着两个DLL显然不是我所希望看到的。所以,我有了需求:把两个DLL文件写进程序内部,并在需要使用的时候释放出来。
参考了一篇讲述资源文件使用的文章:Delphi 7资源文件的使用_无幻的博客-CSDN博客_delphi7 资源文件
但我看到的跟他看到的不太一样,可能因为我还没学透这个Delphi。
但他给出的添加资源文件的步骤是没有问题的。
首先,要先有一个资源文件。

这是我创建了一个空白的TXT文件,然后后缀改成rc,再用VS打开后修改,修改后再删减出来的。
需要注意的是:Visual Studio中似乎没有列出这样的文件类型,我在stack overflow上看到一个帖子,说二进制文件应选用RCDATA类型存放,经测试,确实可以实现。(原文地址我没有保存,故无法在这里备注)
创建RC文件之后,需要在Delphi中引入它

点击添加到工程,然后将文件类型改选为RC资源文件,再选定你的RC文件

添加后,可以在查看-工程管理器中查看

这样,就成功写进去了。接下来,需要让它可以把文件写出来。
首先,定义一个变量:
1 | resStream: TResourceStream; |
然后到函数体的begin部分中,创建一个资源流
1 | resStream := TResourceStream.Create(HInstance, '<资源名称>', <资源类型>); |
注释:资源类型为 RT_ 开头的常量,可以在逗号后面输入RT_后按下ctrl+空格以查看所有可用的常量;这里我使用的是RT_RCDATA
打开了这样一个流之后,我们要把它写出来。我到处找文件流的用法,但是并没有写明白。
最后使用了简单、直接的方式——TResourceStream下有一个名为SaveToFile的方法
1 | TResourceStream对象.SaveToFile(<文件路径或名称>); |
最后我的成品代码是长这样的(begin后面的):
1 2 3 4 5 | resStream := TResourceStream.Create(HInstance, 'IDR_RCDATA1', RT_RCDATA); resStream.SaveToFile('./libeay32.dll'); resStream.Free; resStream := TResourceStream.Create(HInstance, 'IDR_RCDATA2', RT_RCDATA); resStream.SaveToFile('./ssleay32.dll'); |
当然这个Free我猜测是释放这个变量,我执行是为了避免出现什么岔子,我也不知道不加上能不能正常工作
发表回复