如何用VS2010编写动态链接库DLL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用VS2010编写动态链接库DLL相关的知识,希望对你有一定的参考价值。

打开Visual Studio 2010

2
新建项目:文件》新建》项目

选择Visual c++》Win32 项目》输入项目名称,选择保存目录,单击“确定”按钮

进入Win32应用程序向导,单击“下一步”按钮

应用程序类型选择DLL,附加选项选择空项目,单击“完成”按钮

添加新类头文件:在项目的头文件目录上单击鼠标右键》添加》新建项

已安装的模板选择Visual C++》头文件》输入文件名称,单击“添加”按钮

添加新类源文件:在项目的源文件目录上单击鼠标右键》添加》新建项

已安装的模板选择Visual C++》c++文件》输入文件名称,单击“添加”按钮

为新类添加内容。内容如下:
头文件simpleDLL.h:

源文件simpleDLL.cpp:

生成解决方案,OK,下一篇讲如何用VS2010编写动态链接库DLL的单元测试用例,调用DLL测试正确性
参考技术A  1、 创建引用动态链接库的应用程序:在解决方案上单击鼠标右键》添加》新建项目
 2、 在添加新项目中选择其它语言->Visual C++->Win32,选择Win32 控制台应用程序,设置名称:simpleDLLTest
 3、 单击确定,在出现的Win32 应用程序向导的概述对话框中点击下一步
 4、 在应用程序设置中,选择应用程序类型下的控制台应用程序,单击完成创建项目
 5、 在控制台应用程序中使用类库的功能:1、为SimpleDLLTest.cpp添加内容。如下所示:
 6、 引用simpleDLL项目。右键单击SimpleDLLTest项目,选择项目依赖项;依赖于窗口中勾选SimpleDLL,单击确定
 7、设置SimpleDLLTest项目为活动项目。右键单击SimpleDLLTest项目,选择设为启动项目
  生成解决方案。

第19讲——动态链接库

1,建立一个win32的dll项目,编译。在vs的安装目录下的E:\visual stdio 2015\VC\bin执行vcvars32.bat,使得dumpbin.exe可用。使用dumpbin -exports ConsoleApplication1.dll可以查看动态链接库的导出函数。如果要导出函数,则在动态链接库的函数名前要加_declspec(dllexport),如_declspec(dllexport) int add(int a, int b)

2,在要调用动态链接库的工程里 先声明 extern int add(int a, int b);然后再使用,并且在工程中要加入动态链接库生成的ConsoleApplication1.dll 和ConsoleApplication1.lib。 _declspec(dllexport)标识符声明的函数效率更高,相对于用extern

3,可以用dependency walker查看动态链接库中导出的函数

4,如果动态链接库项目中源程序自己要使用动态链接库函数,则在动态链接库头文件中使用预编译宏

#ifdef DLL1_API
#else
#define DLL1_API _declspec(dllexport)
#endif // DLL1_API

动态链接库源文件中使用

#define DLL1_API _declspec(dllexport)
#include "dll1.h"

5,自己搜MSDN时找到的一种在各种字符串类型之间进行转换的方法  https://msdn.microsoft.com/zh-cn/library/ms235631(v=VS.100).aspx

如char 和wchar_t之间的转换

char *orig = "Hello, World!";
size_t newsize = strlen(orig) + 1;
wchar_t * wcstring = new wchar_t[newsize];
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, wcstring, newsize, orig, _TRUNCATE);

6,在MFC中可以调用GetForegroundWindow(),返回指向前台窗口(使用用户当前)的窗口。

7,为了防止在不同的编译器中以及C++编写的动态链接库能被用c写的程序调用,则在导出函数前要加extern “C” 如#define DLL1_API extern "C" _declspec(dllexport)

8,如果导出函数的调用约定使用了标准调用约定_stdcall 可以通过模块定义文件的方式来解决名字改编的问题。模块定义文件的后缀名是.def,模块定义文件可以按如下所示写:

LIBRARY DLL2

EXPORTS
add
subtract

9,对动态链接库的使用可以有隐式连接(通过头文件和加入链接库.lib),和动态加载(LoadLibrary函数,GetProcAddress函数获取导出函数的地址)。如:

HINSTANCE hinst;
hinst = LoadLibrary(_T("DLL2.dll"));
typedef int(*addProc)(int a, int b);
addProc pdd = (addProc)GetProcAddress(hinst, "add");

10,MAKEINTRESOURCE()宏,可以将动态链接库序号转化为字符串

11, DLLMain动态链接库入口函数

12,在不需要动态链接库的时候,可以用FreeLibrary();

以上是关于如何用VS2010编写动态链接库DLL的主要内容,如果未能解决你的问题,请参考以下文章

如何用VS2010编写动态链接库DLL

如何用c/c++编写和调用dll动态链接库。

怎么在C#中添加用C语言开发的动态链接库dll文件(vs2010)?

怎么在C#中添加用C语言开发的动态链接库dll文件(vs2010)

vs2010创建和使用动态链接库(dll)

vc动态链接库的调用 LoadLibrary()路径问题