VC中DLL的创建及调用方法介绍
创始人
2024-04-25 08:51:35
0

方法一:

VC中DLL的创建及调用方法  

此中只有实际才操作,而无相关理论   

²             DLL的创建   

首先,用VC集成开发界面中的“新建”,新建一个项目。无论是VC6.0还是VC.NET,都有建立DLL项目的选项。只不过有些稍有不同,例如VC.NET中就有ISAPI   DLL,扩展存储过程DLL等,这些都不在讨论的范围。例如我们建立了一个用静态连接MFC库的DLL项目,名称为mydll  

然后,编辑mydll.cpp文件,在其中加入我们自己的函数void   go()。注意,不需要在mydll.h中声明它,而需要将函数头变成如下样子:  

  1. extern   “c”   __declspec(dllexport)   void   go()     
  2.  {     
  3. //code……     
  4. }    

dllexport表示这个函数是由外部调用的。  

由于是否带参数,要影响到外部调用的方式,因此,我们再声明一个带参数的函数:  

  1. extern   “c”   __declspec(dllexport)   void   went(CString   str)     
  2.   {     
  3.    //code……     
  4.     }   

OK,下面编译连接形成mydll.dll文件。  

²             DLL的调用  

好,下面我们就用VC写个程序调用它。在调用的函数中,首先要获得DLL的句柄,有如下语句:  

  1. HINSTANCE           dllinstance;     
  2. dllinstance=::LoadLibrary(strDllUrl);     
  3. if(dllinstance==NULL)   AfxMessageBox("can't   open   dll   file");    

其中strDllUrl是mydll.dll路径的字符串,这样程序才能找到它。::LoadLibrary获得参数标识的DLL文件的句柄。  

获得句柄后,下面要获得函数地址以便执行它。有如下语句:  

  1. FARPROC     proc;     
  2. proc=GetProcAddress(dllinstance,"go");     
  3.  if(proc==NULL)   AfxMessageBox("can't   find   function");     
  4. else   proc();    

FARPROC是一个远程过程指针,通过GetProcAddress获得函数的地址。它的两个参数就是dll文件句柄和函数的名字了。  

然后FARPROC就可以和go一样的使用了,它就是go   ,go   就是它。  

而对于带参数的DLL中的函数,调用方法有所不同。因为对函数的调用是通过对它地址的引用进行的,这样,传入参数对不对,在函数调用程序的编译和联接过程中,无法知道其正确性。因此,要在调用程序中对DLL中带参数的函数做个声明,如mydll中的went,我们要做个声明如下:   

  1. typedef   void   (FAR   __cdecl   *MYWENT)(CString);    

然后以类型MYWENT声明变量既可调用,如下:   

  1. MYWENT   myproc;     
  2. myproc   =(MYWENT)GetProcAddress(dllinstance,"go");     
  3. if(myproc   ==NULL)   AfxMessageBox("can't   find   function");     
  4. else   myproc   (“o-----yeah---------”);    

注意声明的时候呢,由于DLL中WENT的定义为C语言调用规范,因此MYWENT前一定要用__cdecl,而VC中常用的__stdcall是PASCAL调用规范,不可以的。一定要注意。  

方法二:

VC中DLL的创建及调用方法  

New->MfcWiazard.dll   一路下去,就会生成一个了(略)。

【编辑推荐】

  1. C#自定义事件步步 通
  2. 如何在C#中使用存储过程(SQL Server 2000)
  3. 存储过程自动转成C#源码过程
  4. C#事件处理和自定义事件
  5. 通过C#反射特性查看自定义特性

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...