前言
前端时间整理私类生成DLL文件,遇到一些问题,结合自己的实践,整理出来,奉献给大家。
编程环境:Win10+VS2015
一、第一步:创建DLL项目
选择项目名称DllStone
默认Unicode字符集,这样就生成DLL的基础文件,DllStone.h和DllStone.cpp
//DllSTone.h
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLLSTONE_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DLLSTONE_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef DLLSTONE_EXPORTS
#define DLLSTONE_API __declspec(dllexport)
#else
#define DLLSTONE_API __declspec(dllimport)
#endif
// 此类是从 DllStone.dll 导出的
class DLLSTONE_API CDllStone {
public:
CDllStone(void);
// TODO: 在此添加您的方法。
};
extern DLLSTONE_API int nDllStone;
DLLSTONE_API int fnDllStone(void);
// DllStone.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "DllStone.h"
// 这是导出变量的一个示例
DLLSTONE_API int nDllStone=0;
// 这是导出函数的一个示例。
DLLSTONE_API int fnDllStone(void)
{
return 42;
}
// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 DllStone.h
CDllStone::CDllStone()
{
return;
}
二、第二步:添加私类定义及库函数
分别在DllStone.h包含文件中,添加CDllStone类函数定义
CString GetStringFromInt(int n);
以及 CString类的包含文件#include <afx.h>
#ifdef DLLSTONE_EXPORTS
#define DLLSTONE_API __declspec(dllexport)
#else
#define DLLSTONE_API __declspec(dllimport)
#endif
#include <afx.h>
// 此类是从 DllStone.dll 导出的
class DLLSTONE_API CDllStone {
public:
CDllStone(void);
// TODO: 在此添加您的方法。
CString GetStringFromInt(int n);
};
extern DLLSTONE_API int nDllStone;
DLLSTONE_API int fnDllStone(void);
在CDllStone.cpp执行文件中,添加CString CDllStone::GetStringFromInt(int n)
#include "stdafx.h"
#include "DllStone.h"
// 这是导出变量的一个示例
DLLSTONE_API int nDllStone=0;
// 这是导出函数的一个示例。
DLLSTONE_API int fnDllStone(void)
{
return 42;
}
// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 DllStone.h
CDllStone::CDllStone()
{
return;
}
CString CDllStone::GetStringFromInt(int n)
{
CString str;
str.Format(_T("%d"),n);
return str;
}
同时,增加其他成员变量及函数,方法类似,略。
三、第三步:编译
1、完成以上步骤后编译,显示:错误 C1189 #error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]。
修改配置代码生成->运行库为 MTd(Debug)/MT(Release)
2、继续编译,显示错误 C1189 #error: WINDOWS.H already included. MFC apps must not #include <windows.h>。这是因为在DllStone.h中加入#include <afx.h>所致,把DllStone.h的#include <afx.h>,调整到stdafx.h文件#include <windows.h>之前。
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#include <afx.h>
#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
// Windows 头文件:
#include <windows.h>
3、继续编译,显示错误LNK2005 _DllMain@12 已经在 dllmain.obj 中定义 ,打开项目属性对话框, C/C++ ->预处理器->预处理器定义中,去掉 _USRDLL项。编译生成DllStone.lib和DLLStone.dll两个文件,封装DLL完成。
四、第四步:DLL应用
1、在应用程序中加入 #include “DllSTone.h”//注意文件路径,最好将DllStone.h文件拷贝到项目子目录下。
2、添加lib依赖项。Release模式方法相同.
3、加载DLL函数
HINSTANCE hDLL = LoadLibrary(L"DllStone.dll");
if (hDLL == NULL)
{
MessageBox(_T("DllStone.DLL加载失败"),_T("操作提示"),MB_OK|MB_ICONSTOP);
}
CDllStone MyDll;
CString str = MyDll.GetStringFromInt(12);
大功告成!