dll动态库创建方法:
1,创建空项目,属性选择DLL不是EXE。(创建EXE需要main函数不然会有如下报错)
2,创建头文件.h,头文件里声明可以被调用的动态库的函数,关键字为_declspec(dllexport),表示动态库中可以被调用的函数,是对外的接口,具体实现语法:_declspec(dllexport)+空格+函数声明。然后创建源文件.cpp,在源文件对头文件的函数进行具体实现,并指定包含项目头文件的目录路径,否则会导致包含的头文件找不到。下面为我写的一个实现写文件功能的函数:
头文件如下:
#pragma once
#ifndef WRITE_H
#define WRITE_H
#include <stdio.h>
#include <string.h>
_declspec(dllexport) void write();
//这种写在动态库中的函数,在被项目调用是是看不到具体定义的,由关键字declspec(dllexport)调用,也有可能是宏定义修改后的关键字
#endif
源文件如下:
#include "TaskManDef.h "//写的实现需要项目文件中的一些宏定义,需要包含对应的头文件、lib库路径和名称(调用lib后会对应调用项目的DLL?),项目头文件一般写到最前面
#include<stdio.h>
#include "write.h"
void write()
{
em_report rpt;
rpt.clocal = { 1,11 };
rpt.tlocal = { 1,2,3,4,5 };
rpt.nameid = 0xA1;
rpt.appid = 0x01;
//rpt.namestr[MAX_REPORT_NAME_LEN] = "装置";
rpt.rptinftype = em_gosvtype;
rpt.namestr[0] = '装';
rpt.namestr[1] = '置';
rpt.namestr[2] = '本';
rpt.namestr[3] = '地';
rpt.namestr[4] = '\0';
FILE* fp = NULL;
char ch;
//打开文件
fp = fopen("MNTLOG_A.cime", "a"); //w是对文件进行写操作 ,a模式打开文件不会覆盖原文件内容
//第一个双引号里面放的是文件具体路径,第二个是对文件进行的操作
//判断文件是否成功打开
if (fp == NULL)
{
printf("文件打开失败");
} //如果文件能成功打开,函数返回值不为NULL
else
{
fprintf(fp, "\n%d ", rpt.appid);
fprintf(fp, "%d ", rpt.nameid);
fprintf(fp, "%s ", rpt.namestr);
fprintf(fp, "%d ", rpt.rptinftype);
}
//关闭文件
fclose(fp);
}
指定包含头文件路径(包含项目头文件目的是为了使用项目定义好的一些宏,结构体等元素):
(1).注意这里用相对路径更好,\是Windows下的目录划分符号,/是uinx下的目录划分符号,..\代表上一级目录.\代表当前目录.代表根目录。
(2).相对路径时,是相对于添加的h和cpp文件而言的,所以要正确访问到头文件,必须把上述文件放在对应目录,这里的包含头文件目录和vcproject文件位置无关。
在cpp文件完成函数的具体实现,并在编译后生成LIB和DLL文件
3,在项目中调用动态库,lib原则上指定路径和名字即可,但是一般集中放在lib文件夹中,DLL需要放在debug下的main函数对应的exe文件同目录下。
lib文件路径
声明调用的lib名称
DLL文件放在主函数对应的EXE文件中:
注:1)如果要添加新项目,可以先创建好项目文件,然后把vcproject文件放在需要的位置,通过添加现有项目加到解决方案中。