VS---《在VS2010中 使用C++创建和使用DLL》(002)
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实现。
**********************************************************************************************

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

**********************************************************************************************
**********************************************************************************************
//====================================================================
// 文件: DellDemo.h
//==================================================================== #ifndef _DLL_H_
#define _DLL_H_ #ifdef DLLProvider
#define EXPORTS_DELL_DEMO _declspec( dllexport )
#else
#define DLL_EXPORT_IMPORT _declspec(dllimport)
#endif
extern "C" DLL_EXPORT_IMPORT int Add (int a , int b);
#endif /*
#ifndef _MYCODE_H_
#define _MYCODE_H_
#ifdef DLLDEMO1_EXPORTS
#define EXPORTS_DEMO _declspec( dllexport )
#else
#define EXPORTS_DEMO _declspec(dllimport)
#endif
extern "C" EXPORTS_DEMO int Add (int a , int b);
#endif
*/
//====================================================================
// 文件: DellDemo.cpp
//==================================================================== #include "DellDemo.h"
int Add ( int a , int b )
{
return ( a + b );
}
/*
作者:WP @20160627
功能:学习制作DLL、调用DLL。
test_Dell.cpp : 定义控制台应用程序的入口点。
方法:
(1)加载时动态链接方式调用DLL---用到_declspec(dllimport)
(2)运行时动态链接方式调用DLL---用到LoadLibrary()
(3)以.def文件(模块定义文件)方式导出函数
*/ //-------------------------------(1)加载时动态链接方式调用DLL-------------------------
//在提供者那里, 方法被声明为__declspec(dllexport)
//在使用者那里,方法被声明为__declspec(dllimport)
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <stdio.h> //#include "..\\Dell_001\\DellDemo.h"
using namespace std; //注意:导入库文件的目录必须在本工程的目录下,也就是说要把生成的dll和lib文件都要拷贝到该工程的目录下,
//因为不再该目录下,尽管修改了路径,仍然提示找不到DllDemo.dll
#pragma comment(lib, "..\\debug\\Dell_001.lib") //添加lib路径
extern "C" _declspec(dllimport) int Add(int a, int b); //DLL输出:提供者申明 + 输出函数名 int _tmain(int argc, _TCHAR* argv[])
{
cout<<Add(, )<<endl;
while();//程序运行到这,方便看运行结果
return ;
}
/*
作者:WP @20160627
功能:学习制作DLL、调用DLL。
test_Dell.cpp : 定义控制台应用程序的入口点。
方法:
(1)加载时动态链接方式调用DLL---用到_declspec(dllimport)
(2)运行时动态链接方式调用DLL---用到LoadLibrary()
(3)以.def文件(模块定义文件)方式导出函数
*/ //-------------------------------(2)运行时动态链接方式调用DLL---用到LoadLibrary()-------------------------
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include<stdio.h> using namespace std; typedef int (*AddFunc)(int a, int b); int _tmain(int argc, _TCHAR* argv[])
{ HMODULE hDll = LoadLibrary(_T("Dell_002.dll"));
if (hDll != NULL)
{
AddFunc add = (AddFunc)GetProcAddress(hDll, "Add");
if (add != NULL)
{
cout<<add(, )<<endl;
}
FreeLibrary(hDll);
}
while();
}
DellDemo.def
LIBRARY "Dell_003"
EXPORTS
Add @;Export the Add function
/*
作者:WP @20160627
功能:学习制作DLL、调用DLL。
test_Dell.cpp : 定义控制台应用程序的入口点。
方法:
(1)加载时动态链接方式调用DLL---用到_declspec(dllimport)
(2)运行时动态链接方式调用DLL---用到LoadLibrary()
(3)以.def文件(模块定义文件)方式导出函数
*/ //-------------------------------(3)以.def文件(模块定义文件)方式导出函数-------------------------
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include<stdio.h> using namespace std; typedef int (*AddFunc)(int a, int b);
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE hDll = LoadLibrary("Dell_003.dll");
if (hDll != NULL)
{
AddFunc add = (AddFunc)GetProcAddress(hDll, MAKEINTRESOURCE());
if (add != NULL)
{
cout<<add(, )<<endl;
}
FreeLibrary(hDll);
}
while();
}
其中几点注意:
(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)的更多相关文章
- VS---《在VS2010中 使用C++创建和使用DLL》(003)
VS---<在VS2010中 使用C++创建和使用DLL>(003) 这里实现一下,之前写好的一个工程(定义一个函数f + main函数调用),转成DLL.调用DLL测试.在两个工程里,分 ...
- VS---《在VS2010中 使用C++创建和使用DLL》(001)
VS---<在VS2010中 使用C++创建和使用DLL>(001) 需要学习制作和使用动态库,现在知道:DLL调用有两种方式,一种是静态调用,另外一种是动态调用.详细的还不算明白,等后期 ...
- 在Visual Studio中使用C++创建和使用DLL
[什么是DLL(动态链接库)?] DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该 ...
- [原创]VS2010中创建动态链接库及其调用
[原创]VS2010中创建动态链接库及其调用 一.创建动态链接库 在VS2010中创建动态链接库的步骤如下: 1)生成->编译->生成MyDll 二.调用 当调用DLL中的方法,程序编译产 ...
- win7中VS2010中安装CSS3.0问题解决方法
win7中VS2010中安装CSS3.0问题解决方法 在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网 ...
- .NET vs2010中使用IrisSkin2.dll轻松实现winForm窗体换肤功能
IrisSkin2.dll是一款很不错的免费皮肤控件,利用它可以轻松的实现winForm窗体换肤! 网上很多朋友说在VS2010中不能使用IrisSkin2.dll,我这里提供一个取巧的办法. Iri ...
- 详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法
详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法 一 编译链接 1 在相应官网下载jsoncpp 2 解压得到jsoncpp-src-0.5.0文件 3 打开jsoncpp-src- ...
- VS2010中出现无法嵌入互操作类型
针对word或excel操作时,出现VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法 问了度娘,解决方法如出一辙:选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作类型” ...
- VS2010中打开VS2013/VS2012项目
VS2010中打开VS2013/VS2012项目 (2014-04-03 23:47:53) 转载▼ 分类: IT VS低版本打开高版本创建的项目时会提示"选择的文件是解决方案文件,但是 ...
随机推荐
- Go单引号和双引号区别
首先做个测试,看下面那个选项是正确的: A. str:='abc'+'123'B. str:="abc"+"123"C. str:='123'+"ab ...
- Python3 Selenium自动化web测试 ==>FAQ:PyCharm中脚本不执行main函数内容解决方案
FAQ: 情景:之前写好可以正常执行的python脚本,突然main函数下的代码不运行 原因:pycharm中,会设置py脚本按照unittest的方式运行,也就是只运行用例,不运行main函数下代码 ...
- C语言tips_2 关于scanf 读取规则小结以及与getchar 的区别
第一点:scanf默认回车和空格是输入不同组之间的间隔和结束符号. 也就是说他不会读取 空格 和 换行符.而是把他们当作一个 数据被读取完成的标志!他的停止标志则为,当%d之类的数据输入结束之后,自动 ...
- NDK学习笔记-文件的拆分与合并
文件的拆分与合并在开发中经常会用到,上传或是下载的时候都有这样的运用 文件拆分的思路 将文件大小拆分为n个文件 那么,每个文件的大小就是等大小的 如果文件大小被n除不尽,那么就使用n+1个文件来拆分 ...
- C#,CLR,IL,JIT概念 以及 .NET 家族
C#,CLR,IL,JIT概念 以及 .NET 家族 Monitor 类通过向单个线程授予对象锁来控制对对象的访问.对象锁提供限制访问代码块(通常称为临界区)的能⼒.当 ⼀个线程拥有对象的锁时,其 ...
- C++零散知识笔记本
目录 1.符号 1.1符号输出 1.2运算符 2.基本内置类型 wchar_t 3.内置类型所占字节数 内置类型的简写 4.变量的本质 变量与指针的故事 (1)malloc函数 (2)new关键字 5 ...
- Flutter、Weex、RN,Native对比
- confluence导出PDF格式文件不显示中文解决
由于confluence导出PDF格式文件需要应用字体文件,下载字体文件在confluence管理员界面安装即可. 我这里使用从simhei.ttf楷体,可以从windowns主机里下载(c:/win ...
- 搭建Leanote笔记
mongo\leanote #查询Linux开放的端口 netstat -nupl (UDP类型的端口) netstat -ntpl (TCP类型的端口) #下载安装MongoDB wget http ...
- AtCoder AISing Programming Contest 2019 Task D. Nearest Card Game
题目分析在代码注释里. int main() { #if defined LOCAL && !defined DUIPAI ifstream in("main.in" ...