ImageVerifierCode 换一换
格式:DOCX , 页数:45 ,大小:37.39KB ,
资源ID:20194196      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20194196.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(动态链接库Word下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

动态链接库Word下载.docx

1、例如,假设要为Windows编写一个由几个不同的程序组成的大型财务软件包,就会发现这些应用程序会使用许多共同的例程。可以把这些公共例程放入一个一般性的目的码链接库(带.LIB扩展名)中,并在使用LINK静态连结时把它们加入各程序模块中。但这种方法是很浪费的,因为软件包中的每个程序都包含与公共例程相同的程序代码。而且,如果修改了链接库中的某个例程,就要重新连结使用此例程的所有程序。然而,如果把这些公共例程放到称为ACCOUNT.DLL的动态链接库中,就可解决这两个问题。只有动态链接库模块才包含所有程序都要用到的例程。这样能为储存文件节省磁盘空间,并且在同时执行多个应用程序时节省内存,而且,可以修

2、改动态链接库模块而不用重新连结各个程序。动态链接库实际上是可以独立存在的。例如,假设您编写了一系列3D绘图例程,并把它们放入名为GDI3.DLL的DLL中。如果其它软件开发者对此链接库很感兴趣,您就可以授权他们将其加入他们的图形程序中。使用多个这样的图形程序的使用者只需要一个GDI3.DLL文件。链接库:一词多义动态链接库有着令人困惑的印象,部分原因是由于链接库这个词被放在几种不同的用语之后。除了动态链接库之外,我们也用它来称呼目的码链接库或引用链接库。目的码链接库是带.LIB扩展名的文件。在使用连结程序进行静态连结时,它的程序代码就会加到程序的.EXE文件中。例如,在Microsoft Vi

3、sual C+中,连同程序连结的一般C执行目的码链接库被称为LIBC.LIB。引用链接库是目的码链接库文件的一种特殊形式。像目的码链接库一样,引用链接库有.LIB扩展名,并且被连结器用来确定程序代码中的函数呼叫来源。但引用链接库不含程序代码,而是为连结程序提供信息,以便在.EXE文件中建立动态链接时要用到的复位位表。包含在Microsoft编译器中的KERNEL32.LIB、USER32.LIB和GDI32.LIB文件是Windows函数的引用链接库。如果一个程序呼叫Rectangle函数,Rectangle将告诉LINK,该函数在GDI32.DLL动态链接库中。该信息被记录在.EXE文件中,

4、使得程序执行时,Windows能够和GDI32.DLL动态链接库进行动态连结。目的码链接库和引用链接库只用在程序开发期间使用,而动态链接库在执行期间使用。当一个使用动态链接库的程序执行时,该动态链接库必须在磁盘上。当Windows要执行一个使用了动态链接库的程序而需要加载该链接库时,动态链接库文件必须储存在含有该.EXE程序的目录下、目前的目录下、Windows系统目录下、Windows目录下,或者是在通过MS-DOS环境中的PATH可以存取到的目录下(Windows会按顺序搜索这些目录)。一个简单的DLL虽然动态链接库的整体概念是它们可以被多个应用程序所使用,但您通常最初设计的动态链接库只与

5、一个应用程序相联系,可能是一个测试程序在使用DLL。下面就是我们要做的。我们建立一个名为EDRLIB.DLL的DLL。文件名中的EDR代表简便的绘图例程(easy drawing routines)。这里的EDRLIB只含有一个函数(名称为EdrCenterText),但是您还可以将应用程序中其它简单的绘图函数添加进去。应用程序EDRTEST.EXE将通过呼叫EDRLIB.DLL中的函数来利用它。要做到这一点,需要与我们以前所做的略有不同的方法,也包括Visual C+ 中我们没有看过的特性。在Visual C+ 中工作空间(workspaces)和项目(projects)不同。项目通常与建立

6、的应用程序(.EXE)或者动态链接库(.DLL)相联系。一个工作空间可以包含一个或多个项目。迄今为止,我们所有的工作空间都只包含一个项目。我们现在就建立一个包含两个项目的工作空间EDRTEST一个用于建立EDRTEST.EXE,而另一个用于建立EDRLIB.DLL,即EDRTEST使用的动态链接库。现在就开始。在Visual C+中,从File菜单选择New,然后选择Workspaces页面标签。(我们以前从来没有选择过。)在Location栏选择工作空间要储存的目录,然后在Workspace Name栏输入EDRTEST,按Enter键。这样就建立了一个空的工作空间。Developer St

7、udio还建立了一个名为EDRTEST的子目录,以及工作空间文件EDRTEST.DSW(就像两个其它文件)。现在让我们在此工作空间里建立一个项目。从File菜单选择New,然后选择Projects页面标签。尽管过去您选择Win32 Application,但现在Win32 Dynamic-Link Library。另外,单击单选按钮Add To Current Workspace,这使得此项目是EDRTEST工作空间的一部分。在Project Name栏输入EDRLIB,但先不要按OK按钮。当您在Project Name栏输入EDRLIB时,Visual C+将改变Location栏,以显示E

8、DRLIB作为EDRTEST的一个子目录。这不是我们要的,所以接着在Location栏删除EDRLIB子目录以便项目建立在EDRTEST目录。现在按OK。屏幕将显示一个对话框,询问您建立什么型态的DLL。选择An Empty DLL Project,然后按Finish。Visual C+将建立一个项目文件EDRLIB.DSP和一个构造文件EDRLIB.MAK(如果Tools Options对话框的Build页面卷标中选择了Export Makefile选项。现在您已经在此项目中添加了一对文件。从File菜单选择New,然后选择Files页面标签。选择C/C+ Header File,然后输入文

9、件名EDRLIB.H。输入程序21-1所示的文件(或者从本书光盘中复制)。再次从File菜单中选择New,然后选择Files页面标签。这次选择C+ Source File,然后输入文件名EDRLIB.C。继续输入程序21-1所示的程序。程序21-1 EDRLIB动态链接库 EDRLIB.H /*- EDRLIB.H header file-*/#ifdef _cplusplus#define EXPORT extern C _declspec (dllexport)#else #define EXPORT _declspec (dllexport)#endifEXPORT BOOL CALLB

10、ACK EdrCenterTextA (HDC, PRECT, PCSTR) ;EXPORT BOOL CALLBACK EdrCenterTextW (HDC, PRECT, PCWSTR) ;#ifdef UNICODE #define EdrCenterText EdrCenterTextW #define EdrCenterText EdrCenterTextA #endif EDRLIB.C /*- EDRLIB.C - Easy Drawing Routine Library module (c) Charles Petzold, 1998 -*/ #include windows

11、.h #include edrlib.hint WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) return TRUE ; EXPORT BOOL CALLBACK EdrCenterTextA ( HDC hdc, PRECT prc, PCSTR pString) int iLength ; SIZE size ; iLength = lstrlenA (pString) ; GetTextExtentPoint32A (hdc, pString, iLength, &size) ; retur

12、n TextOutA (hdc,(prc-right - prc-left - size.cx) / 2,( prc-bottom - prc-top - size.cy) / 2,pString, Length) ;EXPORT BOOL CALLBACK EdrCenterTextW (HDC hdc, PRECT prc, PCWSTR pString) iLength = lstrlenW (pString) ; GetTextExtentPoint32W (hdc, pString, iLength, & return TextOutW (hdc, ( prc-left - size

13、.cx) / 2, ( prc-top - size.cy) / 2, pString, iLength) ;这里您可以按Release设定,或者也可以按Debug设定来建立EDRLIB.DLL。之后,RELEASE和DEBUG目录将包含EDRLIB.LIB(即动态链接库的引用链接库)和EDRLIB.DLL(动态链接库本身)。纵观全书,我们建立的所有程序都可以根据UNICODE标识符来编译成使用Unicode或非Unicode字符串的程序代码。当您建立一个DLL时,它应该包括处理字符和字符串的Unicode和非Unicode版的所有函数。因此,EDRLIB.C就包含函数EdrCenterTex

14、tA(ANSI版)和EdrCenterTextW(宽字符版)。EdrCenterTextA定义为带有参数PCSTR(指向const字符串的指针),而EdrCenterTextW则定义为带有参数PCWSTR(指向const宽字符串的指针)。EdrCenterTextA函数将呼叫lstrlenA、GetTextExtentPoint32A和TextOutA。EdrCenterTextW将呼叫lstrlenW、GetTextExtentPoint32W和TextOutW。如果定义了UNICODE标识符,则EDRLIB.H将EdrCenterText定义为EdrCenterTextW,否则定义为Edr

15、CenterTextA。这样的做法很像Windows表头文件。EDRLIB.H也包含函数DllMain,取代了DLL中的WinMain。此函数用于执行初始化和未初始化(deinitialization),我将在下一节讨论。我们现在所需要的就是从DllMain传回TRUE。在这两个文件中,最后一点神秘之处就是定义了EXPORT标识符。DLL中应用程序使用的函数必须是输出(exported)的。这跟税务或者商业制度无关,只是确保函数名添加到EDRLIB.LIB的一个关键词(以便连结程序在连结使用此函数的应用程序时,能够解析出函数名称),而且该函数在EDRLIB.DLL中也是看得到的。EXPORT标

16、识符包括储存方式限定词_declspec(dllexport)以及在表头文件按C+模式编译时附加的C。这将防止编译器使用C+的名称轧压规则(name mangling)来处理函数名称,使C和C+程序都能使用这个DLL。链接库入口出口点当动态链接库首次启动和结束时,我们呼叫了DllMain函数。DllMain的第一个参数是链接库的执行实体句柄。如果您的链接库使用需要执行实体句柄(诸如DialogBox)的资源,那么您应该将hInstance储存为一个整体变量。DllMain的最后一个参数由系统保留。fdwReason参数可以是四个值之一,说明为什么Windows要呼叫DllMain函数。在下面的

17、讨论中,请记住一个程序可以被加载多次,并在Windows下一起执行。每当一个程序加载时,它都被认为是一个独立的程序(process)。fdwReason的一个值DLL_PROCESS_ATTACH表示动态链接库被映像到一个程序的地址空间。链接库可以根据这个线索进行初始化,为以后来自该程序的请求提供服务。例如,这类初始化可能包括内存配置。在一个程序的生命周期内,只有一次对DllMain的呼叫以DLL_PROCESS_ATTACH为参数。使用同一DLL的其它任何程序都将导致另一个使用DLL_PROCESS_ATTACH参数的DllMain呼叫,但这是对新程序的呼叫。如果初始化成功,DllMain应

18、该传回一个非0值。传回0将导致Windows不执行该程序。当fdwReason的值为DLL_PROCESS_DETACH时,意味着程序不再需要DLL了,从而提供给链接库自己清除自己的机会。在32位的Windows下,这种处理并不是严格必须的,但这是一种良好的程序写作习惯。类似地,当以DLL_THREAD_ATTACH为fdwReason参数呼叫DllMain时,意味着某个程序建立了一个新的线程。当线程中止时,Windows以DLL_THREAD_DETACH为fdwReason参数呼叫DllMain。请注意,如果动态链接库是在线程被建立之后和一个程序连结的,那么可能会得到一个没有事先对应一个D

19、LL_THREAD_ATTACH呼叫的DLL_THREAD_DETACH呼叫。当使用一个DLL_THREAD_DETACH参数呼叫DllMain时,线程仍然存在。动态链接库甚至可以在这个程序期间发送线程消息。但是它不应该使用PostMessage,因为线程可能在此消息被处理到之前就已经退出执行了。测试程序现在让我们在EDRTEST工作空间里建立第二个项目,程序名称为EDRTEST,而且使用EDRLIB.DLL。在Visual C+中加载EDRTEST工作空间时,请从File菜单选择New,然后在New对话框中选择Projects页面标签。这次选择Win32 Application,并确保选中了

20、Add To Current Workspace按钮。输入项目名称EDRTEST。再在Locations栏删除第二个EDRTEST子目录。按下OK,然后在下一个对话框选择An Empty Project,按Finish。从File菜单再次选择New。选择Files页面标签然后选择C+ Source File。确保Add To Project清单方块显示EDRTEST而不是EDRLIB。输入文件名称EDRTEST.C,然后输入程序21-2所示的程序。此程序用EdrCenterText函数将显示区域中的字符串居中对齐。程序21-2 EDRTEST EDRTEST.C/*- EDRTEST.C -

21、Program using EDRLIB dynamic-link library (c) Charles Petzold, 1998-*/ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) static TCHAR szAppName = TEXT (StrProg) ; HWND hwnd ; MSG msg ; WNDCL

22、ASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground

23、 = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass) MessageBox ( NULL, TEXT (This program requires Windows NT!), szAppName, MB_ICONERROR) ; return 0 ; hwnd = CreateWindow (szAppName, TEXT (DLL Demonstration Pro

24、gram), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg) ; DispatchMessage (& return msg.wParam ;LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM

25、wParam, LPARAM lParam) HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (message) case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; EdrCenterText (hdc, &rect, TEXT (This string was displayed by a DLL) ; EndPaint (hwnd, & case WM_DESTROY: PostQuitMessage (0) ; return DefWindowProc (hwnd, message, wParam, lParam) ;注意,为了定义EdrCenterText函数,EDRTEST.C包括EDRLIB.H表头文件,此函数将在WM_PAINT消息处理期间呼叫。在编译此程序之前,您可能希望做以下几件事。首先,在Project菜单选择Select Active Project。这时您将看到EDRLIB和EDRTEST,选择EDRTEST。在重新编译此工作空间时,您真正要重新编译的是程序。另外,在Project菜单中,选择Dependencies,在Select Project To Modify清单方

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1