当前位置: 首页 > news >正文

C++封装dll和lib 供C++调用

头文件interface.h

#pragma once
#ifndef INTERFACE_H
#define INTERFACE_H
#define _CRT_SECURE_NO_WARNINGS
#define FENGZHUANG_API _declspec(dllexport)
#include <string>
namespace FengZhuang {class FENGZHUANG_API IInterface {public:static IInterface* CreateInterface();virtual void Init() = 0;virtual void Destroy() = 0;virtual const char* GetName() = 0;virtual void Log(int index, const std::string& windowName, bool includeDate,const char* format, ...) = 0;};
}
#endif

source.cpp文件:

#include "interface.h"
#include <iostream>
#include <ctime>
//以下是log里面需要的头文件
#include <fstream> //打开写入std::ofstream file 需要的
#include <chrono> //std::chrono 获取时间需要的
#include <cstdarg>//va_start需要的头文件namespace FengZhuang {class FHello : public IInterface {public:FHello();void Init() override;void Destroy() override;const char* GetName() override;void Log(int index, const std::string& windowName, bool includeDate,const char* format, ...) override;private:char name[1024];};FHello::FHello(){memset(name, 0, 1024);strcpy(name, "hello");}void FHello::Init(){printf("FHello::Init\n");}void FHello::Destroy(){printf("FHello::Destroy\n");}const char* FHello::GetName() {return "FHello";}void FHello::Log(int index, const std::string& windowName, bool includeDate,const char* format, ...) {std::string filename = std::to_string(index) + windowName + ".txt";// 打开文件以追加写入日志std::ofstream file(filename, std::ios::app);if (!file.is_open()){std::cerr << "无法打开日志文件:" << filename << std::endl;return;}// 获取时间戳auto now = std::chrono::system_clock::now();std::time_t currentTime = std::chrono::system_clock::to_time_t(now);std::tm timeInfo;
#ifdef _WIN32localtime_s(&timeInfo, &currentTime);
#elselocaltime_r(&currentTime, &timeInfo);
#endifchar timeBuffer[128];if (includeDate){//std::strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %T", &timeInfo);//%T ==%H:%M:%Sstd::strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %H:%M:%S", &timeInfo);}else{//std::strftime(timeBuffer, sizeof(timeBuffer), "%T", &timeInfo);std::strftime(timeBuffer, sizeof(timeBuffer), "%H:%M:%S", &timeInfo);}// 格式化日志消息va_list args;va_start(args, format);char buffer[256];vsnprintf(buffer, sizeof(buffer), format, args);va_end(args);// 在控制台和文件中输出日志消息std::printf("%s %s", timeBuffer, buffer);file << timeBuffer << " " << buffer;}IInterface* IInterface::CreateInterface(){return new FHello();}
} // namespace FengZhuang

下面是自己项目内测试代码:

int main() {FengZhuang::IInterface* IF = FengZhuang::IInterface::CreateInterface();IF->Destroy();IF->Log(1, "窗口1", 1, " %d行 窗口:%s x:%d \n", __LINE__, "窗口1", 123);delete IF;
}

其他C++使用者调用方法;

设置库需要3步
1.VC++目录-外部包含目录,添加外部库目录,就是库的头文件 #include "interface.h"的位置
2.VC++目录-库目录,
3.连接器–附加依赖项,就是lib库的名称

#include "interface.h"
int main() {FengZhuang::IInterface* IF = FengZhuang::IInterface::CreateInterface();IF->Init();IF->Destroy();IF->Log(1,"窗口1",0," %d行 窗口:%s x:%d \n",__LINE__, "窗口1",123);delete IF;return 0;
}

成功调用!!这是C++可以调用的方式,还要写个C和易语言以及python可以调用的方式。

http://www.lryc.cn/news/245968.html

相关文章:

  • ffmpeg播放器实战(播放器流程)
  • Android 13.0 开机过滤部分通知声音(莫名其妙的通知声音)
  • Adversarial Attack and Defense on Graph Data: A Survey(2022 IEEE Trans)
  • css中flex两列布局(一列自适应其他固定)
  • 【深度学习】gan网络原理实现猫狗分类
  • ⑨【Stream】Redis流是什么?怎么用?: Stream [使用手册]
  • 浙江启用无人机巡山护林模式,火灾扑救效率高
  • Starrocks异步物化视图的使用以及注意事项
  • SpringBoot整合Sharding-Jdbc实现分库分表和分布式全局id
  • 「江鸟中原」有关HarmonyOS-ArkTS的Http通信请求
  • vuex的使用笔记
  • 汇编:关于栈的知识
  • uniapp使用map标签
  • MacOS14 Sonoma 安装 Flutter 开发环境
  • 【Web】PHP反序列化刷题记录
  • C++标准模板库 STL 简介(standard template library)
  • Linux篇:文件系统
  • AI - Crowd Simulation(集群模拟)
  • <JavaEE> Java中线程有多少种状态(State)?状态之间的关系有什么关系?
  • 正则表达式 通配符 awk文本处理工具
  • 三、ts高级笔记,
  • 二十一、数组(6)
  • flask依据现有的库表快速生成flask实体类
  • .NET6 开发一个检查某些状态持续多长时间的类
  • 链表K个节点的组内逆序调整问题
  • 安卓隐私指示器学习笔记
  • 【Jenkins】jenkins发送邮件报错:Not sent to the following valid addresses:
  • CSS3制作3D爱心动画
  • Python Opencv实践 - 全景图片拼接stitcher
  • echarts 几千条分钟级别在小时级别图标上展示