用C语言写动态链接库.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
近来又有人在群里问如何用c语言编制dll文件(动态链接库)。 原来没有对这个问题太在意过,也没有尝试过任何解决方案,毕竟原来我是用vb的(现在用.net),做个dll只不过是点选一下建立activeX?dll工程的图标而已。今天在网上与朋友聊天,看了他指给我的几个几个文件,用MingW将C程序编译成dll文件的例子,我恍然大悟,原来讲C程序编译成dll文件只不过是在要公开的接口函数声明前面加上几个特定的修饰符而已。于是用dev-cpp建了个dll的默认文档,一切都很明了。(我把源代码贴在下面) /*dll.h文件*/ #ifndef?_DLL_H_ #define?_DLL_H_ #if?BUILDING_DLL #?define?DLLIMPORT?__declspec?(dllexport) #else?/*?Not?BUILDING_DLL?*/ #?define?DLLIMPORT?__declspec?(dllimport) #endif?/*?Not?BUILDING_DLL?*/ DLLIMPORT?void?HelloWorld?(void); #endif?/*?_DLL_H_?*/ /*dllmain.c文件*/ /*?Replace?dll.h?with?the?name?of?your?header?*/ #include?dll.h #include?windows.h #include?stdio.h #include?stdlib.h DLLIMPORT?void?HelloWorld?() { ????MessageBox?(0,?Hello?World?from?DLL!\n,?Hi,?MB_ICONINFORMATION); } BOOL?APIENTRY?DllMain?(HINSTANCE?hInst?????/*?Library?instance?handle.?*/?, ???????????????????????DWORD?reason????????/*?Reason?this?function?is?being?called.?*/?, ???????????????????????LPVOID?reserved?????/*?Not?used.?*/?) { ????switch?(reason) ????{ ??????case?DLL_PROCESS_ATTACH: ????????break; ??????case?DLL_PROCESS_DETACH: ????????break; ??????case?DLL_THREAD_ATTACH: ????????break; ??????case?DLL_THREAD_DETACH: ????????break; ????} ????/*?Returns?TRUE?on?success,?FALSE?on?failure?*/ ????return?TRUE; } 关于以上代码的几点解释: 一、__declspec?(dllexport):这是关键,它标志着这个这个函数将成为对外的接口。(以下是我在网上下载的dllexport、dllimport、_declspec的一些说明): 使用包含在DLL的函数,必须将其导入。导入操作时通过dllimport来完成的,dllexport和dllimport都是vc(visual?C++)和bc(Borland?C++)所支持的扩展的关键字。但是dllexport和dllimport关键字不能被自身所使用,因此它的前面必须有另一个扩展关键字__declspec。通用格式如下:__declspec(specifier)其中specifier是存储类标示符。对于DLL,specifier将是dllexport和dllimport。而且为了简化说明导入和导出函数的语句,用一个宏名来代替__declspec.在此程序中,使用的是DllExport。如果用户的DLL被编译成一个C++程序,而且希望C程序也能使用它,就需要增加“C”的连接说明。#define?DllExport?extern?C__declspec(dllexport),这样就避免了标准C++命名损坏。(当然,如果读者正在编译的是C程序,就不要加入extern?“C”,因为不需要它,而且编译器也不接受它)。 二、BOOL?APIENTRY?DllMain?()说明:(以下是我在网上收集的资料) 1、每一个DLL必须有一个入口点,DllMain是一个缺省的入口函数。DllMain负责初始化(Initialization)和结束(Termination)工作,每当一个新的进程或者该进程的新

文档评论(0)

ktj823 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档