Chinaunix首页 | 论坛 | 博客
  • 博客访问: 415839
  • 博文数量: 99
  • 博客积分: 4230
  • 博客等级: 上校
  • 技术积分: 1026
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-21 14:52
文章分类

全部博文(99)

文章存档

2011年(1)

2010年(1)

2008年(13)

2007年(28)

2006年(45)

2005年(11)

我的朋友

分类: C/C++

2006-08-01 15:20:37

VC中DLL的创建及调用方法

实际操作,无相关理论

DLL的创建

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

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

extern “c” __declspec(dllexport) void go()

{

//code……

}

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

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

extern “c” __declspec(dllexport) void went(CString str)

{

//code……

}

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

²      DLL的调用

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

HINSTANCE     dllinstance;

dllinstance=::LoadLibrary(strDllUrl);

if(dllinstance==NULL) AfxMessageBox("can't open dll file");

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

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

    FARPROC  proc;

    proc=GetProcAddress(dllinstance,"go");

     if(proc==NULL) AfxMessageBox("can't find function");

     else proc();

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

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

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

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

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

    MYWENT myproc;

    myproc =(MYWENT)GetProcAddress(dllinstance,"go");

     if(myproc ==NULL) AfxMessageBox("can't find function");

     else myproc (“o-----yeah---------”);

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

阅读(696) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~