Qt 如何预加载Dll?

看山不是山看水不是水 2013-11-16 11:08:03
现在做wince平台的程序开发 用的Qt,界面刷新的时候感觉很慢,但是Vc调试的时候速度很快,
VC调试的时候信息有:

加载模块: ws2.dll
加载模块: winsock.dll
加载模块: lpcrt.dll
加载模块: rpcrt4.dll
加载模块: commctrl.dll
加载模块: shcore.dll
加载模块: ceshell.dll
加载模块: ole32.dll
加载模块: QtCore4.dll
加载模块: QtGui4.dll
加载模块: QtXml4.dll
加载模块: SerializeBasic.dll
加载模块: fpcrt.dll
加载模块: coredll.dll
加载模块: mmtimer.dll
加载模块: aygshell.dll

因此怀疑调试的时候,是预先将qt的各个dll加载到内存里了,但是我现在在main函数里这样写:

QApplication a(argc, argv);

QLibrary libCore("QtCore4.dll");
bool lib = libCore.load();

QLibrary libGui("QtGui4.dll");
lib = libGui.load();

QLibrary libXml("QtXml4.dll");
lib = libXml.load();

QLibrary libSerializeBasic("SerializeBasic.dll");
lib = libSerializeBasic.load();

QMainWdgt w;
w.show();


这样子好像程序还是很快,这样位置有问题?Qt是怎么调用各个dll的呢 QtCore4.dll等等
...全文
339 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
RabinSong 2013-11-18
  • 打赏
  • 举报
回复
输入表是你引用外部dll文件的实现时,你的可执行文件就有一个该dll的对应的输入表,表的内容大体包括,该模块名称,模块中引用的函数符号,序号等。 这样os loader时,就会根据输入表,来加载对应的dll,到进程4G地址空间的高2G处, 具体详解 锻钢的《加密与解密 》
  • 打赏
  • 举报
回复
引用 楼主 ao834391367 的回复:
现在做wince平台的程序开发 用的Qt,界面刷新的时候感觉很慢,但是Vc调试的时候速度很快, VC调试的时候信息有:

加载模块: ws2.dll
加载模块: winsock.dll
加载模块: lpcrt.dll
加载模块: rpcrt4.dll
加载模块: commctrl.dll
加载模块: shcore.dll
加载模块: ceshell.dll
加载模块: ole32.dll
加载模块: QtCore4.dll
加载模块: QtGui4.dll
加载模块: QtXml4.dll
加载模块: SerializeBasic.dll
加载模块: fpcrt.dll
加载模块: coredll.dll
加载模块: mmtimer.dll
加载模块: aygshell.dll
因此怀疑调试的时候,是预先将qt的各个dll加载到内存里了,但是我现在在main函数里这样写:

	QApplication a(argc, argv);
	
	QLibrary libCore("QtCore4.dll");
	bool lib = libCore.load();

	QLibrary libGui("QtGui4.dll");
	lib = libGui.load();

	QLibrary libXml("QtXml4.dll");
	lib = libXml.load();

	QLibrary libSerializeBasic("SerializeBasic.dll");
	lib = libSerializeBasic.load();

        QMainWdgt w;
        w.show();

这样子好像程序还是很快,这样位置有问题?Qt是怎么调用各个dll的呢 QtCore4.dll等等
os loader是wince API? 我能手动调用预加载吗?
  • 打赏
  • 举报
回复
引用 2 楼 LazyDreamHunter 的回复:
装载器pe文件的输入表来装载对应的dll
能多讲点吗?这方面不是很懂
  • 打赏
  • 举报
回复
引用 3 楼 LazyDreamHunter 的回复:
你去掉这些代码,程序启动就慢了吗? QLibrary libCore("QtCore4.dll"); bool lib = libCore.load(); QLibrary libGui("QtGui4.dll"); lib = libGui.load(); QLibrary libXml("QtXml4.dll"); lib = libXml.load(); QLibrary libSerializeBasic("SerializeBasic.dll"); lib = libSerializeBasic.load(); 慢了多少?1秒还是2秒?
我不清楚 Qt是怎么调用他自身的QtXml4.dll动态库,这些代码没有明显的作用
RabinSong 2013-11-17
  • 打赏
  • 举报
回复
建议楼主先了解下什么是dll的显示加载和隐式加载吧
dyw 2013-11-17
  • 打赏
  • 举报
回复
编译期链接的库无需在代码里加载。如果你的应用支持插件DLL,可以用QLibrary来动态加载。
RabinSong 2013-11-16
  • 打赏
  • 举报
回复
你去掉这些代码,程序启动就慢了吗? QLibrary libCore("QtCore4.dll"); bool lib = libCore.load(); QLibrary libGui("QtGui4.dll"); lib = libGui.load(); QLibrary libXml("QtXml4.dll"); lib = libXml.load(); QLibrary libSerializeBasic("SerializeBasic.dll"); lib = libSerializeBasic.load(); 慢了多少?1秒还是2秒?
RabinSong 2013-11-16
  • 打赏
  • 举报
回复
装载器pe文件的输入表来装载对应的dll
RabinSong 2013-11-16
  • 打赏
  • 举报
回复
这个不是Qt怎么装载dll库, 这个是os loader程序,在你启动qt应用程序的时候,装载的。

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧