C技巧:VC中编译、运行程序的知识点(4)
" w7 X% F* ?1 A( H/ d; K3 ] {. I5、MFC的库文件: n/ O5 k0 x& K1 F( L% B1 Y
MFC的库可以静态链接,也可以动态链接。静态库和动态库又有Debug和Release,ANSI和Unicode版本之分。: |1 ~) D3 G& `& y% O! k! f7 H
静态MFC库主要有:$ `2 g5 F- p4 v J8 ^) o2 O( v) m
ANSI Debug NAFXCWD.LIB
# f( |3 u7 c3 a. Y- \* d ANSI Release NAFXCW.LIB
; Y/ T9 w% \2 r' n' P& W N Unicode Debug UAFXCWD.LIB* |; f. z1 v6 r# R
Unicode Release UAFXCW.LIB: ?7 @. F, H a. j: j
动态链接库主要有;1 k# v z9 y* C
ANSI Debug MFCxxD.LIB (core,MFCxxD.DLL),
; G& j6 C o1 b# h6 b MFCOxxD.LIB (OLE,MFCOxxD.DLL),8 R. q% z+ f8 q( P5 l" [: U
MFCDxxD.LIB (database,MFCDxxD.DLL),* c( U& s: w" \% t, a# C( l3 g1 V0 N
MFCNxxD.LIB (network,MFCNxxD.DLL),
( X7 [9 B% _+ f) p MFCSxxD.LIB (static)' O* Q) p( A- q. d/ A
ANSI Release MFCxx.LIB (combined,MFCxx.DLL)# i% @5 O+ {1 T% j' v# K
MFCSxx.LIB (static)6 n* R8 @- X* t
Unicode Debug MFCxxUD.LIB (core,MFCxxUD.DLL),
2 Z" T8 M, \0 J* h }3 H7 q# I$ ^ MFCOxxUD.LIB (OLE,MFCOxxUD.DLL),+ l9 Q4 y2 m7 @- b" N% G
MFCDxxUD.LIB (database,MFCDxxUD.DLL),9 z2 [1 K3 e. }, Z( i4 X+ a
MFCNxxUD.LIB (network,MFCNxxUD.DLL),+ c+ Z9 ]9 U# `% @. n5 ?
MFCSxxUD.LIB (static). `$ |/ c/ k7 A3 I8 g- Y* t' I
Unicode Release MFCxxU.DLL (combined,MFCxxU.DLL),
2 {, _; {& Z; M" q; h! F: O MFCSxxU.LIB (static)
9 X' l; [( c" F% r J4 i 上面的LIB文件除了MFCSxx(D、U、UD).LIB以外都是导入库。. v! f1 u @* U$ B
MFC动态链接库版本也需要静态链接一些文件,这些文件就放在MFCSxx(D、U、UD).LIB中。例如包含_tWinMain的appmodul.cpp。
' c2 A3 |6 S* ~6 ]6 O6 _ 6、结束语
0 }+ Y; i) N4 \( X 研究这些问题的动机是想弄清楚我们的程序是如何装载、运行的。但是,由于Windows不是开源平台,考试大提示只能研究到PE文件(Windows上可执行文件的格式)。entry point、subsystem都是PE文件头的一部分。& C% s+ w/ k6 P
Windows在进入PE文件的entry point之前做了些什么,就看不到了,只能大概推测:应该是创建一个进程,装载PE文件和所有需要的DLL,初始化C变量,然后从某个起点函数开始运行。不同的subsystem,应该有不同的起点。调用这个起点函数时应该传入PE文件的entry point地址。 |