VS---《在VS2010中 使用C++创建和使用DLL》(002)

  前面初认识了创建和调用DLL,在VS工程下可以通过在 同一工程、不同工程 下创建和调用DLL。现在,同一工程下创建和调用DLL,实现三种方式的创建和调用DLL:

(1)加载时动态链接方式调用DLL---用到_declspec(dllimport)

(2)运行时动态链接方式调用DLL---用到LoadLibrary()

(3)以.def文件(模块定义文件)方式导出函数

   按其它方式,也可以分为:

(1)静态调用DLL:添加“XXX.lib”,然后#include "XXX.h",把XXX.lib(引入库文件)、XXX.DLL(动态库文件)、XXX.h(头文件)全部放到工程目录下。

(2)动态调用DLL:通过LoadLibrary、GetProcAddress、FreeLibrary实现。

**********************************************************************************************

**********************************************************************************************

**********************************************************************************************

**********************************************************************************************

  1. //====================================================================
  2. // 文件: DellDemo.h
  3. //====================================================================
  4.  
  5. #ifndef _DLL_H_
  6. #define _DLL_H_
  7.  
  8. #ifdef DLLProvider
  9. #define EXPORTS_DELL_DEMO _declspec( dllexport )
  10. #else
  11. #define DLL_EXPORT_IMPORT _declspec(dllimport)
  12. #endif
  13. extern "C" DLL_EXPORT_IMPORT int Add (int a , int b);
  14. #endif
  15.  
  16. /*
  17. #ifndef _MYCODE_H_
  18. #define _MYCODE_H_
  19. #ifdef DLLDEMO1_EXPORTS
  20. #define EXPORTS_DEMO _declspec( dllexport )
  21. #else
  22. #define EXPORTS_DEMO _declspec(dllimport)
  23. #endif
  24. extern "C" EXPORTS_DEMO int Add (int a , int b);
  25. #endif
  26. */
  1. //====================================================================
  2. // 文件: DellDemo.cpp
  3. //====================================================================
  4.  
  5. #include "DellDemo.h"
  6. int Add ( int a , int b )
  7. {
  8. return ( a + b );
  9. }
  1. /*
  2. 作者:WP @20160627
  3. 功能:学习制作DLL、调用DLL。
  4. test_Dell.cpp : 定义控制台应用程序的入口点。
  5. 方法:
  6. (1)加载时动态链接方式调用DLL---用到_declspec(dllimport)
  7. (2)运行时动态链接方式调用DLL---用到LoadLibrary()
  8. (3)以.def文件(模块定义文件)方式导出函数
  9. */
  10.  
  11. //-------------------------------(1)加载时动态链接方式调用DLL-------------------------
  12. //在提供者那里, 方法被声明为__declspec(dllexport)
  13. //在使用者那里,方法被声明为__declspec(dllimport)
  14. #include <iostream>
  15. #include <windows.h>
  16. #include <tchar.h>
  17. #include <stdio.h>
  18.  
  19. //#include "..\\Dell_001\\DellDemo.h"
  20. using namespace std;
  21.  
  22. //注意:导入库文件的目录必须在本工程的目录下,也就是说要把生成的dll和lib文件都要拷贝到该工程的目录下,
  23. //因为不再该目录下,尽管修改了路径,仍然提示找不到DllDemo.dll
  24. #pragma comment(lib, "..\\debug\\Dell_001.lib") //添加lib路径
  25. extern "C" _declspec(dllimport) int Add(int a, int b); //DLL输出:提供者申明 + 输出函数名
  26.  
  27. int _tmain(int argc, _TCHAR* argv[])
  28. {
  29. cout<<Add(, )<<endl;
  30. while();//程序运行到这,方便看运行结果
  31. return ;
  32. }
  1. /*
  2. 作者:WP @20160627
  3. 功能:学习制作DLL、调用DLL。
  4. test_Dell.cpp : 定义控制台应用程序的入口点。
  5. 方法:
  6. (1)加载时动态链接方式调用DLL---用到_declspec(dllimport)
  7. (2)运行时动态链接方式调用DLL---用到LoadLibrary()
  8. (3)以.def文件(模块定义文件)方式导出函数
  9. */
  10.  
  11. //-------------------------------(2)运行时动态链接方式调用DLL---用到LoadLibrary()-------------------------
  12. #include <iostream>
  13. #include <windows.h>
  14. #include <tchar.h>
  15. #include<stdio.h>
  16.  
  17. using namespace std;
  18.  
  19. typedef int (*AddFunc)(int a, int b);
  20.  
  21. int _tmain(int argc, _TCHAR* argv[])
  22. {
  23.  
  24. HMODULE hDll = LoadLibrary(_T("Dell_002.dll"));
  25. if (hDll != NULL)
  26. {
  27. AddFunc add = (AddFunc)GetProcAddress(hDll, "Add");
  28. if (add != NULL)
  29. {
  30. cout<<add(, )<<endl;
  31. }
  32. FreeLibrary(hDll);
  33. }
  34. while();
  35. }

DellDemo.def

  1. LIBRARY "Dell_003"
  2. EXPORTS
  3. Add @;Export the Add function
  1. /*
  2. 作者:WP @20160627
  3. 功能:学习制作DLL、调用DLL。
  4. test_Dell.cpp : 定义控制台应用程序的入口点。
  5. 方法:
  6. (1)加载时动态链接方式调用DLL---用到_declspec(dllimport)
  7. (2)运行时动态链接方式调用DLL---用到LoadLibrary()
  8. (3)以.def文件(模块定义文件)方式导出函数
  9. */
  10.  
  11. //-------------------------------(3)以.def文件(模块定义文件)方式导出函数-------------------------
  12. #include <iostream>
  13. #include <windows.h>
  14. #include <tchar.h>
  15. #include<stdio.h>
  16.  
  17. using namespace std;
  18.  
  19. typedef int (*AddFunc)(int a, int b);
  20. int _tmain(int argc, _TCHAR* argv[])
  21. {
  22. HMODULE hDll = LoadLibrary("Dell_003.dll");
  23. if (hDll != NULL)
  24. {
  25. AddFunc add = (AddFunc)GetProcAddress(hDll, MAKEINTRESOURCE());
  26. if (add != NULL)
  27. {
  28. cout<<add(, )<<endl;
  29. }
  30. FreeLibrary(hDll);
  31. }
  32. while();
  33. }

其中几点注意:
(1)Module-Definition File(.def)文件的格式如下:
    LIBRARY语句说明.def文件对应的DLL;
    EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号有一定的作用)。
    
模块定义文件中的库文件名应和工程名一致。
LIBRARY  "DllDemo"   //这里的字符串名和工程名要一致, 注意这句注释不能放进xxx.def文件中,否则报错
EXPORTS
Add @1;Export the Add function

(2)字符集的问题(是Unicode字符集还是多字节集),两种方案,一种修改字符集为多字节集,二是将字符串前面加 _T("").
  error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”

在使用VS2010编写运行时动态链接dll文件时出现的一个问题,问题解决得益于此文章:http://blog.sina.com.cn/s/blog_6a2236590100xbgl.html
通过调用这个函数:
LoadLibrary出现的该问题。
原因 :工程只支持UNICODE字符
解决方法:
1、在解决方案资源管理器中的工程上右键属性->配置属性-->常规--->字符集---->使用多字节符字符集
2、也就是宽字符,所以下面这行代码,应该编译有错误
hinst=LoadLibrary("InTheHand.Net.Personal.dll");
也就是:
cannot convert parameter 1 from 'char [27]' to 'const unsigned short *'
改为:
hinst=LoadLibrary(L"InTheHand.Net.Personal.dll");
或者
hinst=LoadLibrary(_T("InTheHand.Net.Personal.dll"));

感谢:http://blog.sina.com.cn/s/blog_6a2236590100xbgl.html ; https://www.cnblogs.com/holyprince/p/4236586.html

VS---《在VS2010中 使用C++创建和使用DLL》(002)的更多相关文章

  1. VS---《在VS2010中 使用C++创建和使用DLL》(003)

    VS---<在VS2010中 使用C++创建和使用DLL>(003) 这里实现一下,之前写好的一个工程(定义一个函数f + main函数调用),转成DLL.调用DLL测试.在两个工程里,分 ...

  2. VS---《在VS2010中 使用C++创建和使用DLL》(001)

    VS---<在VS2010中 使用C++创建和使用DLL>(001) 需要学习制作和使用动态库,现在知道:DLL调用有两种方式,一种是静态调用,另外一种是动态调用.详细的还不算明白,等后期 ...

  3. 在Visual Studio中使用C++创建和使用DLL

    [什么是DLL(动态链接库)?] DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该 ...

  4. [原创]VS2010中创建动态链接库及其调用

    [原创]VS2010中创建动态链接库及其调用 一.创建动态链接库 在VS2010中创建动态链接库的步骤如下: 1)生成->编译->生成MyDll 二.调用 当调用DLL中的方法,程序编译产 ...

  5. win7中VS2010中安装CSS3.0问题解决方法

    win7中VS2010中安装CSS3.0问题解决方法   在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网 ...

  6. .NET vs2010中使用IrisSkin2.dll轻松实现winForm窗体换肤功能

    IrisSkin2.dll是一款很不错的免费皮肤控件,利用它可以轻松的实现winForm窗体换肤! 网上很多朋友说在VS2010中不能使用IrisSkin2.dll,我这里提供一个取巧的办法. Iri ...

  7. 详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法

    详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法 一 编译链接 1 在相应官网下载jsoncpp 2 解压得到jsoncpp-src-0.5.0文件 3 打开jsoncpp-src- ...

  8. VS2010中出现无法嵌入互操作类型

    针对word或excel操作时,出现VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法 问了度娘,解决方法如出一辙:选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作类型” ...

  9. VS2010中打开VS2013/VS2012项目

    VS2010中打开VS2013/VS2012项目 (2014-04-03 23:47:53) 转载▼   分类: IT VS低版本打开高版本创建的项目时会提示"选择的文件是解决方案文件,但是 ...

随机推荐

  1. UE4 RHI与条件式编译

    RHI即RenderHardwareInterface, 即渲染硬件接口, 是UE为实现跨平台而实现的一套API. 每个RHI接口都为OpenGL, Vulkan, DX11等做了不同的实现. 在引擎 ...

  2. Java工程师学习指南第5部分:Java网络编程与NIO

    本文整理了微信公众号[Java技术江湖]发表和转载过的Java网络编程相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧. 深度解读 Tomcat 中的 NIO 模型 [Java基本功]浅 ...

  3. layer.msg弹窗后没有自动关闭——问题解决

    layer.msg弹窗后没有自动关闭,里面也没有配time: -1 layer.msg("信息体", {time: -1}); 后面发现是jquer和layer版本不对,之前自己用 ...

  4. golang的time包:时间字符串和时间戳的相互转换

    本博客转自: https://blog.csdn.net/mirage003/article/details/86073046 package main import ( "log" ...

  5. [转帖] 飞腾FT2000+ CPU的进展(2019.6)

    中国长城:拟进一步收购飞腾股权,强化信息基础设施国产化平台地位 2019-06-26 09:28 http://www.sohu.com/a/323065095_100016383 今年年中的事情 浪 ...

  6. scrapy-redis数据去重与分布式框架

    数据去重 生成指纹:利用hashlib的sha1,对request的请求体.请求url.请求方法进行加密,返回一个40位长度的16进制的字符串,称为指纹 fp = hashlib.sha1() fp. ...

  7. redis单机连接池

    一.配置文件 1. db.properties配置文件#IP地址 redis.ip = 127.0.0.1 #端口号 redis.port= #最大连接数 redis.max.total= #最大空闲 ...

  8. 2019牛客暑期多校训练营(第三场)F Planting Trees 单调队列

    F Planting Trees 题目链接 https://ac.nowcoder.com/acm/contest/883/F 题目描述 The semester is finally over an ...

  9. linux下shell 脚本 中windows换行符换成linux换行符

    sed -i 's/\r//' filename window下默认是 \r\n linux下是\n unix下是\r

  10. 第11章:使用Python打造MySQL专家系统

    1.Python语言高级特性 1).深入浅出Python生成器 1).生成器函数:与普通函数定义类似,使用yield语句而不是return语句返回结果.yield语句一次返回一个结果,在每个结果中间挂 ...