Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230514
  • 博文数量: 55
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-22 17:59
文章分类

全部博文(55)

文章存档

2015年(2)

2011年(1)

2010年(1)

2009年(18)

2008年(16)

2007年(17)

我的朋友

分类: C/C++

2009-09-21 16:34:46

    在VC中调用dll有两种方法:一种是显式调用;一种是隐式调用。
    一、显式调用:
    显式调用的方法很简单,调用LoadLibrary()和GetProcAddress()即可。
   HMODULE LoadLibrary(
       LPCTSTR    // file name of module
   );
参数解释:lpFileName:指定要载入的动态链接库的名称。
          返回值:如何函数调用成功,则返回值是库模块的句柄,否则返回NULL。
FARPROC GetProcAddress(
  HMODULE ,    // handle to DLL module
  LPCSTR    // function name
);
 
参数解释:hModule:包含此函数的DLL模块的句柄。LoadLibrary或者GetModuleHandle函数可以返回此句柄。
         lpProcName:包含函数名的以NULL结尾的字符串,或者指定函数的序数值。
         返回值:如果函数调用成功,返回值是DLL中的输出函数地址,否则返回NULL。
如下罗列出DLL显式调用的流程:
(1)使用LoadLibrary()加载指定名称的DLL。
(2)使用GetProcAddress()获取指定名称的函数地址,并将其转换成函数类型。
(3)通过函数地址调用函数。
(4)调用FreeLibrary()函数卸载DLL。
假设在DLL中有一导出函数:extern "C" __declspec(dllexport)  int tulip (int a ,int b);
在程序中调用DLL中的这一函数:
//定义一个函数指针
 typedef int (  * FUNCTION )(int,int);    
int main()
{
    HINSTANCE hLib;
    hLib = ::LoadLibrary(_T("MyDll.dll"));
    
    FUNCTION tulipFunc; //定义一个函数指针变量
    tulipFunc =(FUNCTION )::GetProcAddress(hLib ,"tulip");  
    //调用dll里的函数
tulipFunc(8,10);
    ::FreeLibrary(hLib);
    return 0;
} 
二、隐式调用
    这种调用方式使用lib和动态链接库的头文件
例如:#include “../MyDll.h”
    #pragma comment(lib,"../Debug/MyDll.lib")
    int main()
    {
	tulip();//只要这样我们就可以调用dll里的函数了 
    }
 
阅读(1171) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-03-08 14:03:59

不错