本文将创建一个简单的动态库-link,谱写控制台应用程序使用该动态链接库,该动态链接库为“JAVA调用动态链接库DLL之JNative学习”中使用的DLL,仅仅是项目及文件名不同。

创建动态链接库项目:
1、打开Microsoft Visual Studio 2010,选择文件->新建->项目。


2、在新建项目窗体中选择其他语言->Visual C++->Win32。


3、选择Win32 项目,设置名称:simpleDLL。设置解决方式名:simpleDLL。
4、单击确定。在出现的Win32 应用程序向导的概述对话框中点击下一步。


5、在应用程序设置中,选择应用程序类型下的DLL。


6、勾选附加选项下的空项目。
7、单击完毕创建项目。
向动态链接库加入类:
1、加入新类头文件。右键单击simpleDLL项目,加入->新建项,选择头文件(.h),设置名称为simpleDLL,单击加入。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

2、加入新类源文件。右键单击simpleDLL项目,加入->新建项,选择C++ 文件(.cpp),设置名称为simpleDLL。单击加入。


3、为新类加入内容。内容例如以下:

头文件simpleDLL.h:

//------------------ SimpleDLL.h ----------------

#pragma once;

//该宏完毕在dll项目内部使用__declspec(dllexport)导出
//在dll项目外部使用时。用__declspec(dllimport)导入
//宏DLL_IMPLEMENT在SimpleDLL.cpp中定义
#ifdef DLL_IMPLEMENT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
DLL_API int add(int x, int y); //简单方法
DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);
DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);

源文件simpleDLL.cpp:

//------------------ SimpleDLL.cpp ----------------

//注意此处的宏定义须要写在#include "SimpleDLL.h"之前
//以完毕在dll项目内部使用__declspec(dllexport)导出
//在dll项目外部使用时,用__declspec(dllimport)导入
#define DLL_IMPLEMENT #include "SimpleDLL.h"
#include<Windows.h>
#include <intrin.h>
#include <stdlib.h>
#include <string.h> int DLL_API add(int x, int y)
{
return x+y;
} DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId)
{
static wchar_t url[260] = { 0 };
wcscpy_s(url, L"http://中文");
wcscat_s(url, mgrIp);
wcscat_s(url, L":");
wchar_t szPort[20] = { 0 };
_ltow_s(mgrPort, szPort, 10);
wcscat_s(url, szPort);
return url;
} DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId)
{
static char url[260] = { 0 };
strcpy_s(url, "http://中文");
strcat_s(url, mgrIp);
strcat_s(url, ":");
char szPort[20] = { 0 };
_ltoa_s(mgrPort, szPort, 10);
strcat_s(url, szPort);
return url;
}

创建引用动态链接库的应用程序:
1、在解决方式上单击鼠标右键->加入->新建项目。


2、在加入新项目中选择其他语言->Visual C++->Win32。


3、选择Win32 控制台应用程序。设置名称:simpleDLLTest。

4、单击确定。在出现的Win32 应用程序向导的概述对话框中点击下一步。


5、在应用程序设置中。选择应用程序类型下的控制台应用程序。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
6、单击完毕创建项目。

在控制台应用程序中使用类库的功能:
1、为SimpleDLLTest.cpp加入内容。

例如以下所看到的:

// SimpleDLLTest.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include "../SimpleDLL/SimpleDLL.h" //加入头文件引用
#pragma comment(lib, "..\\..\\SimpleDLL\\Release\\SimpleDLL.lib") //加入lib文件引用
#include <process.h>
#include <locale.h> int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "chs"); //配置地域化信息为中文简体,否则打印出来的中文是乱码
wprintf(L"getPlayUrl: %s\r\n", getPlayUrl(L"127.0.0.1", 10087, 1)); printf("getUrl: %s\r\n", getUrl("127.0.0.1", 10087, 1));
system("pause");
return 0;
}

2、引用simpleDLL项目。

右键单击SimpleDLLTest项目。选择项目依赖项。


3、依赖于窗体中勾选SimpleDLL。单击确定。

4、设置SimpleDLLTest项目为活动项目。右键单击SimpleDLLTest项目,选择设为启动项目。


6、生成解决方式。

Debug执行结果例如以下:

注意:如今创建的DLL仅仅能由c++调用,C语言等其他语言是调用不了的!

我们来用工具看一下,在解决方式上单击鼠标右键。在Windows资源管理器中打开目录

我编译的是Release版本号,所以打开Release目录,找到SimpleDLL.dll文件。用Depends工具打开它

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

眼下编译的版本号对MSVCR100.DLL还有依赖。这样拷贝到其他没有安装VS2010的电脑上是用不了的;

在项目上单击鼠标右键,属性:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

在左側的配置属性中选择常规。在右側找到MFC的使用,选择在静态库中使用MFC

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

这里是改动MFC的使用。还有还有一种方法:vs2010公布时去除msvcp100.dll和msvcr100.dll图讲解明

再看函数,带有一些特殊字符。这样c++之外其他语言是调用不了的;我们须要在头文件的函数声明中加入extern "C"标志,代码例如以下:

//------------------ SimpleDLL.h ----------------

#pragma once;

//该宏完毕在dll项目内部使用__declspec(dllexport)导出
//在dll项目外部使用时。用__declspec(dllimport)导入
//宏DLL_IMPLEMENT在SimpleDLL.cpp中定义
#ifdef DLL_IMPLEMENT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
extern "C" DLL_API int add(int x, int y); //简单方法
extern "C" DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);
extern "C" DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);

又一次编译,再用Depends工具打开它,能够发现依赖项已经没有了。函数名称也正常了:

參考:演练:创建和使用动态链接库 (C++)

解决方式源代码下载:http://download.csdn.net/detail/testcs_dn/7411383

版权声明:本文博客原创文章。博客,未经同意,不得转载。

VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性的更多相关文章

  1. VS2010编写32位和64位dll环境配置,以及判断dll是多少位

    前言 最近在编写dll注入程序的时候,因为想注入到系统进程,结果发现总是注入失败.自闭了好长一会发现我忘记了我的系统是64位的,系统进程也是64位的,而我编写的待注入的DLL是32位了,所以才导致失败 ...

  2. VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

    转自:http://blog.csdn.net/testcs_dn/article/details/27237509 本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链 ...

  3. VS2010创建动态链接库并且使用动态链接库DLL

    1.编写动态链接库文件 dll和lib文件 例子: 在新建VS工程时选择DLL 空项目 ----------hello.h-------- #include <stdio.h> #prag ...

  4. 用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法

    问题: 在自己电脑上用VS2010编写的VC++程序(使用MFC库),不能在其他电脑上运行.双击提示: "无法启动此程序,因为计算机中丢失mfc100.dll 尝试重新安装该程序以解决此问题 ...

  5. C++编写 动态链接库dll 和 调用dll

    参考:https://jingyan.baidu.com/article/ff42efa92c49cfc19e2202fd.html 和htps://jingyan.baidu.com/article ...

  6. VS2010 开发 VB6.0 activeX控件 dll

    项目源码 https://download.csdn.net/download/csdn_z_s/10427764 开发环境 操作系统: win7 64位 旗舰版 Java语言开发环境:  Eclip ...

  7. [DLL] Dynamic link library (dll) 的编写和使用教程

    前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...

  8. 如何寫一個自定義控件/vs2010生成Dll文件并引用dll(C#)

    1.最簡單的例子 首先你先新建->項目->類庫.然後右鍵項目.添加一個用戶控件.設置其用戶控件繼承button. egg: namespace ClassLibrary1{    publ ...

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

    VS---<在VS2010中 使用C++创建和使用DLL>(002) 前面初认识了创建和调用DLL,在VS工程下可以通过在 同一工程.不同工程 下创建和调用DLL.现在,同一工程下创建和调 ...

随机推荐

  1. Django写的投票系统1(转)

    当然主要是从django的帮助文档里面来的,权当是翻译吧 这个投票系统的主要功能有 1.一个前台页面,可以让用户来投票 2.一个管理员页面,可以用来添加.修改.删除投票 首页第一步要确定你已经安装了D ...

  2. c++ cin>>详解

    参考地址:http://www.cnblogs.com/A-Song/archive/2012/01/29/2331204.html 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当 ...

  3. 屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能载入页面

    发如今家里的时候用Android App里的WebView打开站点非常慢,会有十几秒甚至更长时间的卡住. 可是在电脑上打开相同的网页却非常快. 查找这个问题的过程比較曲折,记录下来. 抓取Androi ...

  4. Mac 登录界面多了一个其它账户删除

    原因分析: 在安装一些软件时会自己主动启用root账户,可是在安装完毕后没有关闭root账户,这样就造成系统以为用户要使用root账户,所以在登录界面出现了一个"其它"账户 解决方 ...

  5. pygame系列_游戏中的事件

    先看一下我做的demo: 当玩家按下键盘上的:上,下,左,右键的时候,后台会打印出玩家所按键的数字值,而图形会随之移动 这是客观上面存在的现象. 那么啥是事件呢? 你叫我做出定义,我不知道,我只能举个 ...

  6. SDL2源码分析5:更新纹理(SDL_UpdateTexture())

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  7. C#属性总结

    1.私有字段和公有字段的比较 类中的私有字段只能在类的内部访问,而对类的公有字段的访问却不受限制. 在以前,为了封装,程序中会尽量少使用公有字段,因为使用公有字段的话,会让程序失去控制权.所以程序中会 ...

  8. Mercurial简介

    前言     目前所在的公司的版本控制使用的是Mercurial,它也有一个对应的客户端小乌龟,但是Mercurial跟我们之前使用的SVN有着本质的区别,对于其区别会在下一篇中介绍到,这次主要是带领 ...

  9. java 线程 新类库中的构件 countDownLatch 使用

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlhbmdydWkxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  10. IOS私人API用法

    先要使用class-dump 和dumpFrameworks.pl 工具 将ios的framework导出来. 下面是工具的下载地址: class-dump下载地址http://www.codethe ...