VC++编写DLL导出函数及其调用方法

DLL (Dynamic Link Library)动态链接库,是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件,其优点主要有:1. 有助于节省内存;2. 有助于资源共享;3. 不需编译的软件系统升级;4. 支持多语言程序。当然,有的时候我们也可以将一些核心的或者不愿意公开提供的函数编写为DLL,从而起到隐藏和保护的作用。

下面结合实例详细说明在Visual Studio 2008 SP1 IDE中如何创建、编写和导出VC++ MFC DLL,以及如何调用生成的DLL。(完整实例可在我的CSDN资源中下载:http://download.csdn.net/detail/margin1988/8336697

(1)打开Visual Studio 2008 SP1 IDE,创建VC++ MFC DLL工程,如图所示:

(2)在自动生成的“工程名.cpp”(如:FirstDLL.cpp)文件中,编写要导出的函数(注:在该项目属性中工程字符集选择了“使用多字节字符集”):

/**函数:int calculateLineNum(CString filePath)
	功能:用于计算文本文件的行数
	描述:只需要指定文本文件的路径,若找到,则返回其行数,若没找到,则返回0 */
extern "C" _declspec(dllexport) int calculateLineNum(CString filePath){
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	CStdioFile file;
	CString str;
	int lineNum=0;
	if (file.Open(_T(filePath),CFile::modeRead | CFile::typeText))
	{
		file.SeekToBegin();
		while (file.ReadString(str))
		{
			lineNum++;
		}
		file.Close();
	}
	return lineNum;
}

(3)点击“生成解决方案”,生成了供程序调用的DLL文件和Lib文件(该例中只是导出了一个函数,不需要.h文件);

(4)生成DLL及其导出函数的调用方法:

1)将.dll和.lib文件拷贝到你的工程的目录下;

2)在程序中预定义和导入库和函数:

#pragma comment(lib, "FirstDLL.lib")
extern "C" _declspec(dllimport) int calculateLineNum(CString filePath);

3)或者,也可以在工程的属性中添加链接:

然后,程序中就只需要这一句:

extern "C" _declspec(dllimport) int calculateLineNum(CString filePath);

4)调用DLL中的导出函数:

CString path="ReadMe.txt";
int num = calculateLineNum(path);

时间: 2024-11-15 22:04:12

VC++编写DLL导出函数及其调用方法的相关文章

使用 __declspec(dllimport) 能够优化对DLL导出函数的调用.

使用 __declspec(dllimport) 能够优化对DLL导出函数的调用. 不使用时: [DLL] #ifdef THEDLL_EXPORTS #define THEDLL_API __declspec(dllexport) #else #define THEDLL_API __declspec(dllimport) #endif // THEDLL_API int fntheDll(void); [EXE] #include "..\\theDll\\theDll.h" #p

Dll 导出函数那些破事

经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系. VC++支持两种语言:即C/C++,这也是造成DLL导出函数差异的根源 我们用VS2008新建个DLL工程,工程名为“TestDLL” 把默认的源文件后缀 .CPP改为.C(C文件) 输入测试代码如下: 01 int _stdcall MyFunction(int iVariant) 02 { 03 return 0; 0

C# 遍历DLL导出函数

C#怎样去遍历一个由C++或E语言编写的本地DLL导出函数呢 只是在这里我建议对PE一无所知的人 你也许应先补补这方面的知识.我不知道为什么PE方面的 应用在C#中怎么这么少.我查阅过相关 C#的知识大概仅仅见一个人写过关于PE的应用 还仅仅是从PE信息中推断运行文件是X86还是X64方式 编译,难道C#程序猿真的非常差 真的仅仅能会点Asp.Net / MVC?想想看雪论坛那些玩inline-asm / inline-hook的牛牛 真是感到有非常大差距 只是任何语言 在我看来事实上都差点儿相

dll导出函数(摘)

目录 1.DLL中导出函数的方式有两种 2.查看dll导出函数; 3.__declspec(dllexport)和.def文件的区别. 1.DLL中导出函数的方式有两种: 方式一:在每一个函数声明前添加标识符: __declspec(dllexport) 比如:__declspec(dllexport) int add(int a, int b){return a+b;} 在这种方式下,如果调用该dll的是一个c++程序(同一个编译器的版本)是没有问题的.但是,如果调用该dll是一个其它语言的程

jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法

jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法 在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们发现程序执行完后并没有获取到我们想要的值,这时很有可能是因为你用的是ajax的异步调用async:true(默认情况),如: function ManageCommentText(text) { var result = text; $.ajax({ data: "get", url: &qu

C#调用C++ dll导出函数提示找不到指定模块

在X64系统上,用VS2013编写了一个C++动态链接库,里面提供了一个导出函数SGFYS. 编译为DLL之后,我们用C#对其动态链接库进行调用,调用代码如下: 此时会被提示,试图加载不正确的格式.我们对该.NET项目属性进行配置,右键该项目--属性--生成--目标平台修改为(x86) 之后再次调用,已经可以被正确调用. 此时我们将该程序放到XP下运行,会报错“找不到指定模块”. 我们用 Dependency walker加载该DLL,发现缺少依赖MSVCR120D.DLL 导致上述问题的原因是

C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)

第一种就直接导出函数名如下代码: #ifdef__cplusplus #define TEXPORT extern "c" _declspec(dllexport) #dlse #define TEXPORT _declspec(dllexport) TEXPORT BOOL FUN();//这就是要导出函数 这种方法查看DLL时能看到函数名. 第二种是就导出序号如下代码: bool _stdcall fun(); 在工程右键添加新项目点模块定义文件.DEF, 在在DEF文件里写 LI

MFC DLL 导出函数的定义方式

一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解.要学习,这篇文章先总结DLL的导出函数的方法. 1. 首先说一下如何建立一个普通的DLL工程!(以VS2008为例) New Project  -->  Win32 标签 --> 填写工程名称 -->  点 OK,进入创建 Widzard  -->  Next 进入第二步 -->  Application

使用Visual Studio自带工具dumpbin查看动态链接库(.dll)导出函数

当我们需要查看一个dll或exe文件中的包含的函数或是依赖的函数之类的信息,可以使用Visual Studio自带的工具dumpbin来实现,使用方法为: 1/ 启动Visual Studio 命令行工具: 2/ 查看导出函数,执行 dumpbin /exports (dll或者exe文件路径) 3/ 查看依赖性,执行 dumpbin /dependents (dll或者exe文件路径) 4/ 可以使用 /out:(文件名)参数将打印信息输出到文本文件中.