技术: C++Builder, Use dynamic RTL

翟二喜

这几天在弄一个调用了WMSDK和引用了Windows Media Player 9/10 组件的ActiveX组件。生成了一个 .ocx,将要发布时在一台 Windows 2000 with SP4 + WMP9 的“干净”机器上测试时,发现这个 ocx 文件不能通过 regsvr32 注册(缺少dll那种错误)。


找了好久的原因……,主要呐闷的是:同样条件编译的.exe应用程序在同样的环境中运行没有问题,但这个ocx就是不能注册。


通过 UltraEdit 查看 .ocx 的16进制内容,及用 tdump -em. 发现在这个 .ocx 中有两个不常见的 dll:wmvcore.dll、vcltest3.dll 和 stlpmt45.dll。


其中,wmvcore.dll 在安装 WMP9 后就出现的 dll,应该没有问题。后两个文件缺是 C++Builder 自己的 bin 目录中的。为了测试,将这两个文件复制到 ocx 的目录中、system32 目录中,ocx还是不能注册(ocx换方案编译也不行)。


一气之下,将 C++Builder bin 下的所有内容都复制到 ocx 目录中……,竟然注册成功了——确定了问题就在这些库中,一点一点的查,最终发现 ocx 的注册需要 cc3260mt.dll、stlpmt45.dll,那个 vcltest3.dll 却不是必须。


在网上查资料:cc3260mt 似乎是关于 Use dynamic RTL 选择打开后,使用 MultiThread 编译的程序所需的,stlpmt45.dll 到是没有查到什么结果(我一直以为它是 STL 的什么库,后来确认程序通过他来调用 cc3260mt.dll)。


关于 Use dynamic RTL:


默认情况下使用 C++Builder 开发编译的应用程序,是需要一些 Borland 的运行时库来支持的。像我这样从Delphi“转型”过来的人应该知道:将 Project->Options->Packages 里的 Build with runtime packages 取消选中,可以脱离 Borland Package Library 运行时库。


但在 C++Builder 里光去掉上面这项还不能完全解脱。Project->Options->Linker->Use dynamic RTL 选项也去掉(印象中如果不去掉它会需要 BorlandMM.dll)。


看到网上的资料说 cc3260mt 也是用于对 dynamic RTL 支持的,便在 DLL项目中左看右看,也没看到那个 Use dynamic RTL 打着勾。


这个 DLL 项目使用了两个自己开发的 .lib,这两个 .lib 也用于 EXE 项目的开发,所以一直没有想问题会不会出在 .lib 上(尽管也更改过一些选项重新编译过这两个 .lib)。


翻来覆去的看,突然发现:原来 LIB 项目的 Project->Options->TLib 页里,也有一个 Use dynamic RTL 项,把这两个 LIB 项目的这个选项去掉,再编译生成 .ocx ——一切正常啦……


还是奇怪为什么 .exe 的应用就不受 .lib 中的这个选项的影响。是已经影响了我没发现?或是 .exe 或 .ocx 编译时哪个编译器有 BUG?呵呵,又是说人家的错,还是别没事就把错归结到人家头上。有错先找自己原因,反正现在的问题解决了,先睡觉再说。


写这篇文章地目的是:


多写一篇凑数(好长时间没写了),希望提交时别报错。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  0   博主  0

  1. 王中王 5

    stlpmt45.dll就是STL的运行时库,也是可以静态链接的。用BCB做OCX,最终是通过 ATL来封装成OCX的,用到了模板,所以一定会使用STL的,缺省情况下就是STLpmt45.dll。

    其实工程选项最终对应的还是编译和链接时的参数。可以到工程文件里看到这些选项。可以通过修改注册表,看到编译和链接时用到的参数,具体的自己到网上查查吧。