看了好多网上写的关于dll文件生成和实用的资料发现多尔不全,都是抄来抄去,有的干脆就是搬用msdn上的原文,实在没有创意和可看的东西。于是本着学和实用的目的自己实践的东西分享给大家。

大前提:使用VS2010作为dll生成工具

概述:主要通过构建一个解决方案中的一个项目来演示如何定义和生成dll文件,在同一个方案中在创建一个项目主要用来进行生成dll的使用。

简易结构图:

testdll(解决方案名)

  |——makedll(生成dll项目名)

  |——testdll(使用dll项目名)

makedll项目:

先使用VS自动创建win32dll项目,手动添加dll.h 和 dll.cpp(生成项目时自动就有了)

dll.h源码:

 #ifndef TEST20140529_H
#define TEST20140529_H #include <iostream>
#include <string> #pragma warning( disable : 4251 ) //1 can export class type
#ifdef TEST20140529_EXPORTS
#define TESTCLASS_API _declspec(dllexport)
#else
#define TESTCLASS_API _declspec(dllimport)
#endif // TEST20140529_EXPORTS //2 can't export class type
//#ifdef TEST20140529_EXPORTS
//#define TESTCLASS_API extern "C" _declspec(dllexport)
//#else
//#define TESTCLASS_API extern "C" _declspec(dllimport)
//#endif // TEST20140529_EXPORTS class TESTCLASS_API TestClass
{
private:
int m_nVar;
std::string m_strVar;
public:
void set(int );
void printfValue();
void set_str(const std::string &);
void printf_str();
};
TESTCLASS_API void printfValue(const int &); #undef TESTCLASS_API #endif // TEST20140529_H

dll.cpp源码:

 // test20140529.cpp : 定义 DLL 应用程序的导出函数。
// #include "stdafx.h"
#include "test20140529.h" void TestClass::set(int v)
{
m_nVar = v;
}
void TestClass::printfValue()
{
std::cout << m_nVar << std::endl;
}
void TestClass::set_str(const std::string &str)
{
m_strVar = str;
}
void TestClass::printf_str()
{
std::cout << m_strVar << std::endl;
}
void printfValue(const int &v)
{
std::cout << v << std::endl;
}

还有一个可选的文件.def,这个文件添加不添加对于调用它的其他C++项目而言没有影响,但是对于其他语言来说可能比较有用,为了更通用,所以也研究了一下并写出来实践。

dll.def源码:

 LIBRARY

 EXPORTS

 printfValue = ?printfValue@@YAXABH@Z                                                                                    @
cls_printfValue = ?printfValue@TestClass@@QAEXXZ @
cls_printf_str = ?printf_str@TestClass@@QAEXXZ @
cls_set = ?set@TestClass@@QAEXH@Z @
cls_set_str = ?set_str@TestClass@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@@@std@@@Z @

解释:前面的是导出名称(必不可少),后面的是系统自定义的名称(可选),@数字是导出的顺序。

更详细的可以参见msdn: http://msdn.microsoft.com/en-us/library/28d6s79h.aspx

这个dll的创建主要也就这么多。

注:这个项目的配置: [配置属性]-[c/c++]-[预处理器] 选项里 选择系统生成宏TEST20140529_EXPORTS(类似的都会有这么个宏),有了它就省去了自定义宏的麻烦。

testdll项目:

概述:这个项目简单主要实现dll文件的调用。

直接在main文件里面实现使用就可以。

main.cpp源码:

 #include <iostream>
#include "../test20140529/test20140529.h" #pragma comment(lib, "../Debug/test20140529.lib") int main()
{
//
int v = ;
printfValue(v); //
TestClass obj;
obj.set(v);
obj.printfValue(); //
TestClass obj2;
obj2.set_str("haha");
obj2.printf_str(); //
TestClass obj3;
obj3.set_str("nono");
obj3.printf_str(); return ;
}

注:这个项目主要是对头文件的引用和lib库文件的调用。

好了,太晚了,该下班了。

补充:由于时间仓促说的可能不是特别明白,特别将能够正常运行的示例上传上来做个参考。

我的博客的文件:test20140529.rar

生成dll文件的示例的更多相关文章

  1. WPF调用C++生成的dll文件(示例)

    注:笔者使用的VS版本为2019.1.打开VS2019,选择文件 -> 新建 -> 项目 2.选择项目 新建项目时选择C++“控制台应用”语言:C++平台:Windows项目类型:空项目 ...

  2. 如何利用.snk文件生成DLL文件中的Publickeytoken

    1.在该路径下C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin查找是否有sn.exe. 没有的话,从网上下载,注意需要的版本. 2.打开c ...

  3. (Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译

    Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目 ...

  4. JNI中使用cl命令生成DLL文件

    问题描述:     在使用JNI调用DLL时,首先需要生成DLL文件 问题解决:     (1)现在使用VS2008的cl.exe程序,生成DLL文件 (1.1)cl.exe环境搭建 注:   cl. ...

  5. vs2012中程序集生成无法自动在网站Bin目录下生成Dll文件?(已解决!)

    最近,突然发现生成程序集后,网站bin目录下dll没有更新,也没有自动生成dll文件,通过近半个小时的摸索和实验,找到了解决方法: 1.右键网站,不是项目,选择[属性页],在左侧[引用]中如果没有,就 ...

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

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

  7. c# 类如何生成dll文件及引用

    1.打开“工具”菜单下的“外部工具”子菜单: 2.点击“添加按钮,增加一个菜单,菜单内容填写如下: 注意参数那里为:/k "C:\vs2010\VC\vcvarsall.bat" ...

  8. C# 怎么生成DLL文件(转)

    有两种方法:     但是一般这个使用     打开VS2008,依次点击:菜单->文件->新建项目->项目类型visual C#(这里假设为该项目所取的名字是DllBuild)-& ...

  9. vs工程生成dll文件及其调用方法

    转载:https://blog.csdn.net/weixin_44536482/article/details/91519413 vs工程生成dll文件及其调用方法                  ...

随机推荐

  1. Opencl API解释(二)

    欢迎关注,转载引用请注明 http://blog.csdn.net/leonwei/article/details/8909897 这里将更深入的说明一些OpenCL API的功能 1. 创建buff ...

  2. 【转】漫谈ANN(2):BP神经网络

    上一次我们讲了M-P模型,它实际上就是对单个神经元的一种建模,还不足以模拟人脑神经系统的功能.由这些人工神经元构建出来的网络,才能够具有学习.联想.记忆和模式识别的能力.BP网络就是一种简单的人工神经 ...

  3. [转]在MacOS和iOS系统中使用OpenCV

    OpenCV 是一个开源的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法. 最近试着在MacOS和iOS上使用OpenCV,发现网上关于在MacOS和iOS上搭建OpenCV的资料很 ...

  4. select * from table where 1=1让您茅塞顿开(转)

    在很多网站上,都经常看到select * from table where 1=1这样的一种查询语句: 这是一种怎样的查询语句呢?首先说明,1=1不是查询语句中的任何关键词,所以,请您放心,不管你会不 ...

  5. 博客搬家到CSDN:http://blog.csdn.net/yeweiouyang

    博客搬家到CSDN:http://blog.csdn.net/yeweiouyang

  6. tar打包和解压命令

    如果你有一个大文件 想下载下来 但是又太大 可以压缩一下 然后打包 #压缩 tar -czvf ***.tar.gz tar -cjvf ***.tar.bz2 #解压缩 tar -xzvf ***. ...

  7. jquery.qrcode.min.js生成二维码 通过前端实现二维码生成

    主体代码: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <tit ...

  8. Java NIO使用及原理分析 (四)

    在上一篇文章中介绍了关于缓冲区的一些细节内容,现在终于可以进入NIO中最有意思的部分非阻塞I/O.通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有 可供读取的数据.同样,写入调用将会阻塞直至 ...

  9. C#实现FTP文件夹下载功能【转载】

    网上有很多FTP单个文件下载的方法,前段时间需要用到一个FTP文件夹下载的功能,于是找了下网上的相关资料结合MSDN实现了一段FTP文件夹下载的代码. 实现的思路主要是通过遍历获得文件夹下的所有文件, ...

  10. qt 与mysql建立交互式连接

    void QSqlDatabase::setConnectOptions(const QString & options = QString())Sets database-specific ...