博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
调用dll
阅读量:2354 次
发布时间:2019-05-10

本文共 1971 字,大约阅读时间需要 6 分钟。

DLL(动态连接库),然而可以分为动态调用于静态调用。下面我分别举一个例子说说。

1)动态调用:
首先:在VC++6.0中创建 Win32 Dynamic-link library工程创建一个动态连接库工程:
            在头文件TestDll.h中写下代码
            extern "C" int __declspec(dllexport) add(int numa, int numb);
            在源文件TestDll.cpp中实现改函数:
            int __declspec(dllexport) add(int numa, int numb)
            {
                      return numa + numb;
            }
其次,创建一个测试程序,TestDemo,创建一个.cpp文件,然后放下代码:
HINSTANCE hinstance;

typedef int (*lpAdd)(int a, int b);

lpAdd lpadd;

int main()

{
          hinstance = LoadLibrary("E://vc//DLL//TestDll//Debug//TestDll.dll");
          lpadd = (lpAdd)GetProcAddress(hinstance, "add");
          cout << "2 + 3 = " << lpadd(2, 3) << endl;
          FreeLibrary(hinstance);
          return 0;
}
而应用程序对本DLL的调用和对第2节静态链接库的调用却有较大差异,下面我们来逐一分析。

  首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;

    其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;

   再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;

     最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。

    通过这个简单的例子,我们获知DLL定义和调用的一般概念:

      (1)DLL中需以某种特定的方式声明导出函数(或变量、类);

     (2)应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。

/* 需要用到的 Windows API 函数如下所列 */
  LoadLibrary();
  GetProcAddress();
  FreeLibrary();
 
范例代码:
摘自MSDN: http://msdn.microsoft.com/zh-cn/library/64tkc9y5(VS.80).aspx的范例代码,如下:
 
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...
 
HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
DWORD dwParam1;
UINT  uParam2, uReturnVal;
 
hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1");
   if (!lpfnDllFunc1)
   {
      // handle the error
      FreeLibrary(hDLL);
      return SOME_ERROR_CODE;
   }
   else
   {
      // call the function
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
   }
}
2)静态连接:
代码如下:
#include <iostream>
using namespace std;

#pragma comment(lib,"Testlib.lib") 

//.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息
extern "C" __declspec(dllimport) add(int x,int y); 
int main()
{
         int result = add(2,3); 
         cout << result << endl;
         return 0;
}

转载地址:http://vqutb.baihongyu.com/

你可能感兴趣的文章
linux下目录读权限与执行权限区别
查看>>
[think in java]知识点学习
查看>>
linux下线程调试 ulimit core
查看>>
linux 知识点拾遗
查看>>
java equal和==的区别
查看>>
c++中static的用法总结
查看>>
const的常见用法
查看>>
crontab使用手册
查看>>
虚继承与虚基类的本质
查看>>
函数式编程
查看>>
GitHub上整理的一些工具
查看>>
python range 与xrange的区别
查看>>
算法-最长递增子序列
查看>>
最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
查看>>
回文字符序列
查看>>
inline函数必须在头文件中定义吗?
查看>>
内存泄漏检查工具valgrind使用方法
查看>>
Solution of Codility
查看>>
java解析XML的四种方式及比较
查看>>
单例模式(java)详细
查看>>