看流星社区

 找回密码
 注册账号
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 453|回复: 21

dll文件的隐式调用和显式调用

[复制链接]

该用户从未签到

发表于 2020-1-10 15:10:30 | 显示全部楼层 |阅读模式
隐式调用

隐式调用有两种方法:

1、需要dll文件、lib文件和头文件

示例:


  1. //Dll1.h
  2. _declspec(dllimport) int add(int a,int b);
  3. _declspec(dllimport) int subtract(int a,int b);

  4. //导出一个c++类
  5. class _declspec(dllimport) Point
  6. {
  7. public:
  8.         void output(int x,int y);
  9. };
复制代码


  1. //Dll1.cpp
  2. #include <WINDOWS.H>
  3. #include <stdio.h>
  4. #include "Dll1.h"
复制代码



  1. //利用extern "C" _declspec(dllexport)可以修改导出函数的名称,
  2. //在dumpbin中看到的函数名称就是原函数名,但不能用于类函数中
  3. _declspec(dllexport) int add(int a,int b)
  4. {
  5.         return a+b;
  6. }
  7. _declspec(dllexport) int subtract(int a,int b)
  8. {
  9.         return a-b;
  10. }

  11. //导出一个c++类
  12. void Point::output(int x,int y)
  13. {
  14.         HWND hwnd=GetForegroundWindow();
  15.         HDC hdc=GetDC(hwnd);
  16.         char buf[20];
  17.         memset(buf,0,20);
  18.         sprintf(buf,"x=%d,y=%d",x,y);
  19.         TextOut(hdc,0,0,buf,strlen(buf));
  20.         ReleaseDC(hwnd,hdc);
  21. }
复制代码


将以下三个文件拷贝

1.jpg

调用示例:

&#160; 先将以上三个文件拷贝到工程目录下(在这里我建立了一个名为dy的工程)

  1. //dy.h
  2. #include "Dll1.h"  
  3. #pragma comment(lib,"Dll1.lib")
复制代码


  1. //dy.cpp
  2. #include "stdio.h"
  3. #include "dy.h"
  4. int main()
  5. {
  6.         printf("%d",add(1,2));
  7.         return 0;
  8. }
复制代码


输出:3


2、在项目中附加依赖的lib文件

拷贝上述三个文件到工程目录

流程:项目---> 属性--->配置属性-->链接器---->输入---附加依赖项 加入库名

2.jpg

3.jpg

代码如下:
  1. //dy.cpp
  2. #include "stdio.h"
  3. //#include "dy.h"
  4. extern int add(int,int);
  5. int main()
  6. {
  7.         printf("%d",add(1,2));
  8.         return 0;
  9. }
复制代码


显式调用

只需拷贝dll文件,编译时什么都不需要,在需要使用dll中的函数时,通过LoadLibrary()和FindProcAdress()这两个API调用。

在需要使用的时候DLL才被占用,使用完毕即被解除占用。DLL中有哪些函数可以通过Depends工具查询。


  1. #include"stdio.h"
  2. #include "stdlib.h"
  3. #include "windows.h"

  4. int main()
  5. {
  6.         HINSTANCE hInst;
  7.         hInst=LoadLibrary(L"Dll2.dll");
  8.         typedef int (*ADDPROC)(int a,int b);
  9.         ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"add");
  10.         if (!Add)
  11.         {
  12.                 return -1;
  13.         }

  14.         int a=5,b=2;
  15.         printf("a+b=%d\n",Add(a,b));
  16.         return 0;
  17. }
复制代码


该用户从未签到

发表于 2020-1-11 10:29:19 | 显示全部楼层
楼主加油,我们都看好你哦。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2020-4-2 23:30

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表