所有winapi都能够用dll动态连接不?

iorikingdom 2009-06-25 06:25:24
加精
为了降低程序占用内存,有同事提出所有windows API都用动态链接库的提案
...全文
279 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
不说害怕 2010-07-24
  • 打赏
  • 举报
回复
系统api都在dll里..没有静态连接的.那些lib是导入库.也就是隐式加载动态库.
你改了反倒代码很乱.没有任何好处.
bcrun 2010-03-29
  • 打赏
  • 举报
回复
楼上说的有理
xwsn007 2010-02-13
  • 打赏
  • 举报
回复
引用 27 楼 yangjue1 的回复:
应该是exe的体积更小,但是用的内存更多.


比如有一个系统dll: xxx.dll, 其中有 函数 Func1, Func2, ...
假设程序只使用Func1

静态链接时,只需要把Func1的代码链接到exe中, 执行时也就只需要Func1的内存;
动态链接时, 整个xxx.dll都会被load到exe的地址空间, Func1, Func2.... 你说用的内存更多还是更少?


非也非也,dll封装的代码就一套,但数据,比如函数调用栈还是各个进程(确切的说是线程)拥有自己的,用不着每个调用api的进程都开一段内存放这段代码,故还是省内存
lzjdlsl 2010-02-09
  • 打赏
  • 举报
回复
关注这个帖子。。。。。
Conry 2010-02-09
  • 打赏
  • 举报
回复
LoadLibrary加载dll,如果 已经加载则引用计数加1
FreeLibrary减少引用计数,如果引用计数为0,则卸载dll

那么你再调用其中的函数肯定会挂掉,因为卸载掉dll后地址空间已经释放,再调用函数就是访问已经不可用的地址了
wangk 2010-02-09
  • 打赏
  • 举报
回复
引用楼主 iorikingdom 的回复:
为了降低程序占用内存,有同事提出所有windows API都用动态链接库的提案


我不知道你同事的依据是什么,降低程序占用内存,不是这么个优化法的。

会飞的老鱼 2010-02-09
  • 打赏
  • 举报
回复
收藏,备以后学习。。。。
jingzhongrong 2010-02-09
  • 打赏
  • 举报
回复

1、无论隐式的调用还是显式的调用(API的lib,并没有实现代码),系统都会将用到的dll加载进来。
2、像ntdll.dll、kernel32.dll、advapi32.dll都是驻留在系统中的,无论你隐式的调用还是显式的调用,加载的动作其实就是修改进程的页表对dll所在的物理内存进行映射,dll的引用计数+1
3、加载dll的过程实际是一个递归加载的过程,dll依赖的dll如果没有被加载,都会被加载进系统。

cdm2179 2010-02-09
  • 打赏
  • 举报
回复
引用 17 楼 wltg2001 的回复:
应该是exe的体积更小,但是用的内存更多.


比如有一个系统dll: xxx.dll, 其中有 函数 Func1, Func2, ...
假设程序只使用Func1

静态链接时,只需要把Func1的代码链接到exe中, 执行时也就只需要Func1的内存;
动态链接时, 整个xxx.dll都会被load到exe的地址空间, Func1, Func2.... 你说用的内存更多还是更少?
==========================
这个说法不对吧,对于DLL来说,不管是隐式的调用还是显式的调用都是动态链接,这里没有静态链接一说,也就是说,调用DLL中的函数,不管用什么方法DLL中的Func1的代码都不会链接到exe中去,隐式调用也不过是将调用的函数名写入PE文件的导入表中而已。隐式调用DLL中的函数和显式调用DLL中的函数最大区别在于,隐式调用DLL的话,在主程序没有加载之前,DLL必须要先加载进内存空间。而显式调用时,只到Load时才加载相应的DLL。所以上面说用的内存更多是错误的。

楼上弄错了一个问题,对于API来说,是没有静态链接的,windows并没有提供API的源代码,它提供的LIB文件和静态链接的LIB文件也不一样,里面并不是源代码,你看一下大小就明白了,它里面不过是一些符号。


学习了!!!!!!!顶
WFORLS 2010-02-09
  • 打赏
  • 举报
回复
飘过学习+帮顶!都是知识啊!嘎嘎
踏实每一步 2010-02-09
  • 打赏
  • 举报
回复
winapi 就是windows API.只要是在windows平台上,基本都有
ringphone 2010-02-09
  • 打赏
  • 举报
回复
1、所有的API实际代码都是在系统DLL里面,不管什么方式,你的程序里面都只有调用的代码,不会有该API实际的执行代码。
2、不管静态链接动态链接,都会把该API所在的DLL整个加载进来,只是加载的时机不同。
3、动态调用API,用完马上释放DLL的方法并不可取,这样导致频繁加载和释放DLL,程序性能受影响,都耗在这上面了。而且有的DLL是需要依赖其他DLL的,比如SOCKET的ws2_32.dll,就依赖advapi32.dll,kernel32.dll,msvcert.dll,ntdll.dll,ws2help.dll,动态加载一样把这几个DLL一起加载了进来。
嬴政爱天下 2010-02-07
  • 打赏
  • 举报
回复
帮顶一下!
mjesse88 2010-01-19
  • 打赏
  • 举报
回复
新手学习
aa3000 2010-01-19
  • 打赏
  • 举报
回复
纯纯的接
su413127080 2009-06-26
  • 打赏
  • 举报
回复
~~~
yangjue1 2009-06-26
  • 打赏
  • 举报
回复

应该是exe的体积更小,但是用的内存更多.


比如有一个系统dll: xxx.dll, 其中有 函数 Func1, Func2, ...
假设程序只使用Func1

静态链接时,只需要把Func1的代码链接到exe中, 执行时也就只需要Func1的内存;
动态链接时, 整个xxx.dll都会被load到exe的地址空间, Func1, Func2.... 你说用的内存更多还是更少?
iloveppmm 2009-06-26
  • 打赏
  • 举报
回复
系统API的dll 不是常驻内存的吗?
DavidHsing 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gust2012 的回复:]
引用 11 楼 DavidHsing 的回复:
为了降低内存的话,你还可以在空闲时把程序数据从物理内存移到虚拟内存,这样就“看起来”内存小了。
以前飞信就这么干。


只是造成了一种假象
[/Quote]

是的,对于半懂不懂又喜欢装懂的 user,可以这么干。
LWYY52243548 2009-06-26
  • 打赏
  • 举报
回复
大部分都可以。
加载更多回复(34)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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