vs2008创建动态库和使用动态库的方法

2023-10-26

一、创建动态库

打开vs2008,新建一个项目,选择win32->控制台应用程序->输入名称。

点击确定

点击下一步,选择DLL->勾选空项目,点击完成,至此工程创建完毕。

向工程中添加.h文件,声明接口函数,声明函数前加上关键字__declspec(dllexport),以便被外部引用,为了防止重名可加入namespace命名空间,这里不加了。添加.cpp文件,在.cpp文件中定义函数。

下面分别是.h和.cpp文件的代码,用于模拟socket通讯流程。

SocketClient.h代码如下

#pragma one

__declspec(dllexport) int SocketInit(void **handle);
__declspec(dllexport) int SocketSend(void *handle, char *SendBuf, int SendLen);
__declspec(dllexport) int SocketRec(void *handle, char *RecBuf, int *RecLen);
__declspec(dllexport) int SocketFree(void *handle);

SocketClient.cpp代码如下

#include "SocketClient.h"
#include  <stdio.h>
#include <stdlib.h>
#include <string.h>

int SocketInit(void **handle){
    int ret = 0;
    *handle = (void *)malloc(4097);//多分配一个空间,存放字符串结尾
    if (*handle == NULL){
        ret = -1;
    }
    return ret;
}
int SocketSend(void *handle, char *SendBuf, int SendLen){
    int ret = 0;
    if ((handle == NULL) || (SendLen > 4096)){
        ret = -1;
    }else{
        memcpy((char *)handle, SendBuf, SendLen);
        memset((char *)((char *)handle + SendLen ), 0 ,1);//字符串结尾加0
    }
    return ret;
}
int SocketRec(void *handle, char *RecBuf, int *RecLen){
    int ret = 0;
    if ((handle == NULL) || (RecBuf == NULL)){
        ret = -1;
    }else{
        *RecLen = strlen((char *)handle);//若不是字符串,此处可能会导致异常
        memcpy(RecBuf, (char *)handle, *RecLen );
        RecBuf[*RecLen] = 0;
    }
    return ret;
}
int SocketFree(void *handle){
    int ret = 0;
    if (handle == NULL){
        ret = -1;
    }else{
        free(handle);
    }
    return ret;
}

编译完之后,在Debug(Release)文件夹下会生成两个文件SocketClient.dll和SocketClient.lib,一会测试需要用到这两个文件。

二、使用动态库

打开vs2008,再新建一个项目,选择win32->控制台应用程序->输入名称。点确定后,点击下一步。选择控制台应用程序,勾选空项目。

 

在测试工程SocketClientTest目录下新建一个include文件夹,把动态库工程SocketClient的SocketClient.h、SocketClient.lib和拷贝到include文件夹。

把动态库工程工程SocketClient的SocketClient.dll拷贝SocketClientTest工程目录中的Debug文件夹下(注:如果是用Release模式编译,则放到Release文件夹)。后期如果只更改了.dll文件中的函数实现,只需更新这个文件即可。

 

配置测试工程SocketClientTest的工程属性,C/C++ -> 常规 –> 附加包含目录(存放SocketClient.h和SocketClient.lib的目录)。

 

链接器 –> 常规 –>附加包含目录(存放SocketClient.h和SocketClient.lib的目录)。

 

 

链接器 –> 输入 –>附加依赖项(SocketClient.lib)。

 

配置完测试工程后,在测试工程总添加.cpp文件,用于测试动态库,如下图,在.cpp文件中引用动态库的头文件。

测试工程的.cpp代码如下

 SocketClientTest.cpp

#include <iostream>
#include  <stdio.h>
#include <string.h>
#include "SocketClient.h"//添加dll的头文件

void main()
{
    void *handle = NULL;
    char RecBuf[4096];
    int    RecLen;
    if (SocketInit(&handle)){
        printf("SocketInit error\n");
    }     
    if (SocketSend(handle, "aabbccddeeff", strlen("aabbccddeeff"))){
        printf("SocketSend error\n");
    }
    if (SocketRec(handle, RecBuf, &RecLen)){
        printf("SocketRec error\n");
    }else{
        printf("RecBuf[%d] = \"%s\"\n", RecLen, RecBuf);
    }
    if (SocketFree(handle)){
        printf("SocketFree error\n");
    }
    system("pause");
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vs2008创建动态库和使用动态库的方法 的相关文章

  • 常用的工具

    进程 1 IDA 交互式反汇编器专业版 Interactive Disassembler Professional 简称为IDA IDA Pro是一款支持交互 可编程的 扩展插件 支持多种处理器的逆向工程利器 我一般用来看看库依赖 2 Pr
  • 如何选择PLC?主要从这8个方面入手

    在PLC系统设计中 首先要确定系统方案 下一步是PLC的设计选择 PLC的选择主要是确定PLC制造商和PLC的具体型号 系统方案需要分布式系统 远程I O系统和网络通信 那么如何选择PLC呢 1 PLC厂家的选择 确定PLC制造商主要应考虑
  • windows powershell快捷键

    复制ctrl c 鼠标右键 粘贴ctrl v 鼠标右键 删除整行命令esc 删除光标前一个单词ctrl backsapce 删除光标后一个单词ctrl delete 删除光标前一个字符backsapce 删除光标后一个字符delete 删除
  • 无符号16位整形数组转float---Java

    代码 public float int16tofloat int a if 0 a length 2 a length lt 0 return null int len a length 2 float c new float len fo
  • 【程序】【必须】PID位置环控制,代码+调参

    前面两篇博文已经实现了电机测速和PID速度环控制 在这篇博文中 我们主要说明位置环的代码怎么写以及PID参数怎么调 1 位置环代码实现 写完速度环后位置环就很简单了 在串级PID中 内环的控制量一般是外环控制量的微分 在我们这里 外环是控制
  • 2022.6.1 C++——类型设计与实例化对象

    对象的创建与使用 对象的创建与使用 1 直接定义类的实例 对象 2 C 对象模型讨论 3 this指针的作用 对象是类的实例 声明一种数据类型只是告诉编译系统该数据类型的构造 并没有预定内存 类只是一个样板 图纸 以此样板可以在内存中开辟出
  • 使用ubuntu系统做程序开发

    本人是在台式机上安装的ubuntu16 04长期稳定版来做的开发环境 ubuntu安装后的操作 由于在安装完后 第一件事就是联网 说下我公司网需要的是固定ip 需要在网络设置ipv4 必须注意 是 设置好了马上生效的 需要重新开启打开后 才
  • 视频技术阐释

    目录 一 视频定义 二 视频原理 三 视频中的图像表达原理 四 视频的基础参数 帧 长宽比 分辨率 帧率 码率 重采样率 色深 五 视频的高低频 六 视频编码与格式 七 视频评价 八 视频开发库 九 视频协议 十 常用视频编辑软件 一 视频
  • 数值求解一维定态薛定谔方程

    背景 学习量子化学原理与应用课程时 一维定态薛定谔方程经常归结为解二阶偏微分方程 因此 学习数值解法一方面能够验证解析解 另一方面也能够应对更多更复杂的势垒函数对应方程的解 参考资料 https github com FelixDesroc
  • 人类的行为与程序计算

    胡言乱语 引子 人类从出生伊始都在面临着生活中的种种问题 人类无时无刻不在进行着问题的解决过程 程序从设计之初也是用来解决生活中特定问题的 那么人类行为与程序计算理论之间又有什么相似性呢 人类 人类所面临的问题 人类解决问题的过程 人类解决
  • C语言 程序 杨辉三角实现

    9 杨辉三角形 在屏幕上显示杨辉三角形 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 问题分析与算法设计 杨辉三角形中的数 正是 x y 的N次方幂展开式各项的系数 本题作为程序设计中具有代表性的题
  • java实现信息的增删改查功能的网页设计(1)

    仅供参考 不可转载 如遇其他情况概不负责 后果自负 切记 该项目运用的技术 spring springMVC ibatis 本网页只有一个页面 包过信息的增 删 改 查功能 只有部分代码 仅供参考 因该项目比较大 所以仅提供了一个页面内的增
  • 怎样在 Markdown 中使程序代码带上行号

    在图灵社区使用 Markdown 写文章时 如果在一段文字的每行开头加上四个空格 或者一个制表符 Tab 这段文字就会被视为程序代码 这样 就会自动识别所用的编程语言 进行代码染色 语法高亮显示 但是 如果这段程序很长的话 就有两个小问题
  • Testing-《软件测试》读书笔记(四)

    静态测试是指测试非运行部分 检查和审查 白盒测试是指访问代码 能够查看和审查 静态白盒测试实在不执行的条件下有条理地仔细审查软件设计 体系结构和代码 从而找出软件缺陷的过程 有时也成为结构分析 静态白盒测试的原因 首先是尽早发现软件缺陷 另
  • 如何创建你的第一个西门子200PLC程序

    更多关于西门子S7 200PLC内容请查看 西门子200系列PLC学习课程大纲 创建西门子200PLC程序分五步 1 打开Micro WIN软件 2 新建工程 3 打开程序编辑器 4 输入程序指令 5 保存程序 我们以下图程序为例讲解西门子
  • ABB工件坐标系计算实现原理与代码

    三大重要数据 ABB机器人的三大重要数据分别是工件数据 wobjdata 工具数据 tooldata 和负载数据 loaddata 下面介绍如何利用空间上的任意三点 不在同一直线上 来自定义工件数据 wobjdata
  • Java语言与面向对象的程序设计

    这几天很迷茫 听老师介绍了一款软件 中国大学MOOC 刚好我是软件专业的学生 索性听了北京大学老师的一节关于Java的讲课 果断被震撼到了 他们的讲课给人一种很深刻 深入 的感觉 我今天就把老师讲到的东西记了下来 以便于有兴趣的朋友阅读 J
  • kotlin高阶函数开发一个程序,统计文本中字符串出现的个数

    一 高阶函数是Kotlin的核心部分 下面来使用下高阶函数写一个程序 注意 我这里的File使用的是 与src同级的文件 你可以根据自己的需要 修改文件地址 代码实例 package net println kotlin chapter5
  • HTML(HBuilder)作业题10- 用户登录(jquery)

    问 简单的用户登录怎么弄 答 1 利用jquery 2 利用if 注释 用鼠标离开区域开始判断 可以自行尝试修改成click单击按钮 HBuilder
  • IntelliJ IDEA 编译程序出现非法字符的解决方法

    最近编码完成后总是报非法字符 项目启动不起来 网上有很多说是File gt Setting gt File Encoding 将IDE Encoding和Project Encoding 都设置为UTF 8就行 可是我试了不行 后来看到另外

随机推荐

  • 【HTML基础】HTML文字效果标签+超齐全颜色表(可直接复制使用)

    CSDN话题挑战赛第2期 参赛话题 学习笔记 文字段落样式效果 文字效果 1 添加文字 2 标题文字效果 效果展示 标题字标签的属性 3 空格 4 特殊字符 5 注释 6 设置文字样式属性 7 上 下标 颜色表 英语单词 十六进制数值 汇总
  • js函数写法

    目录 1 函数声明 1 1 命名函数表达式 1 2 匿名函数表达式 常用 简化为 函数表达式 2 函数用法 3 arguments实参列表和形参属性 3 1 arguments 3 2 形参属性 3 3 举例任意数求和 3 4 易错点 1
  • Redis 学习笔记(十一)基数统计(HyperLogLog)

    Redis 学习笔记 十一 基数统计 HyperLogLog 1 介绍 HyperLogLog命令是redis在2 8版本中加入的 Redis中HyperLogLog是用来做基数统计的 HyperLogLog 的优点是 在输入元素的数量或者
  • Win10 编译运行Fortran77程序,开发环境搭建

    有个朋友说我讲的blas中的fortran语法有个地方不正确 非说他自己的理解是对的 怎么肯能 f77都看了十几年了 拿出证据来才行 朋友却说自己不知道怎么编译f77程序 好吧 那还这么自信呀 首先 可以使用intel的 parallel
  • 虚拟机部署前后端操作

    虚拟机部署前后端讲解 1 虚拟机部署后端 1 1后端打包 1 2启动dsgc tomcat 1 3部署war包 1 4打开swagger测试 1 4错误原因整理 2 虚拟机部署前端 2 1配置后端代理地址 2 2启动nginx 2 3测试前
  • 机器学习聚类——实验报告

    机器学习实验报告 实验报告pdf可在该网址下载 一 实验目的与要求 二 实验内容与方法 2 1 聚类算法学习与回顾 2 1 1 聚类任务 1 聚类任务的概念 2 符号定义 3 性能度量 2 1 2 K means的算法模型 1 优化问题 2
  • CSMA/CD算法过程模拟——数组模拟信道(C/C++)

    代码完成于2021 11 12 整体思路 用两个数组分别模拟 A gt B 和B gt A间通讯的信道 A B两主机各自拥有独立线程 线程move用来模拟信道中信号的移动 线程show用于打印信道 其中线程move和show detach
  • CTFSHOW-sql注入

    web171 最简单的sql注入 先演示基本操作 payload 1 union select 1 2 database 得到数据库名为ctfshow web 1 union select 1 2 group concat table na
  • 我的一个基于stm32的独立按键扫描方式

    这两天完成了一个stm32的工程 在解决按键时写出了一个独立按键的扫描函数 应该有前辈已经出来了 的其实质就是普通的扫描方式修改的 优点是将按键相关参数封装为一个结构体 每加一个按键都不需要在函数中增加语句 废话少说 先看扫描函数 Func
  • 提高java反射速度的方法method.setAccessible(true)

    java代码中 常常将一个类的成员变量置为private 在类的外面获取此类的私有成员变量的value时 需要注意 测试类 public class AccessibleTest private int id private String
  • 插入排序 冒泡 选择 快速

    package test public class Demo5 3 param args public static void main String args int arr1 1 6 0 1 9 3 2 44 33 77 用插入法定义一
  • DataBinding使用笔记

    1 封装Activity Fragment Dialog 要使用泛型
  • 把前端NPM和Yarn的依赖和缓存的存储位置改到D盘

    执行 npm config set prefix D App lib node npm global npm config set cache D App lib node npm cache Path 环境变量添加D App lib no
  • maven 工程结构 和 archetype 模板

    文章目录 一 maven 工程结构 1 1 jar 工程结构 1 2 war 工程结构 二 archetype 模板 2 1 推荐的 archetype 模板 2 2 自定义 archetype 模板 2 2 1 自定义模板示例 有没有好奇
  • 网安态势感知详细介绍

    定义 态势感知 Situation Awareness SA 能够检测出超过20大类的云上安全风险 包括DDoS攻击 暴力破解 Web攻击 后门木马 僵尸主机 异常行为 漏洞攻击 命令与控制等 利用大数据分析技术 态势感知可以对攻击事件 威
  • FPGA开发流程简述

    FPGA开发流程简述 一 概述 FPGA Field Programmable Gate Array 是一种可编程逻辑器件 以其灵活性和高性能而被广泛应用于嵌入式系统和数字电路设计 在进行FPGA开发时 需要经历一系列的流程来完成设计 验证
  • HashTable原理和底层实现

    1 概述 上次讨论了HashMap的结构 原理和实现 HashSet and HashMap源码剖析 https blog csdn net qq 27574367 article details 88526194 本文来对Map家族的另外
  • BERT :Pre-training of Deep Bidirectional Transformers for Language Understanding论文阅读笔记(NAACL 2019)

    目录 原文翻译 BERT 用于语言理解的深度双向Transformer预训练 原文链接 https aclanthology org N19 1423 pdf 摘要 1 引言 2 相关工作 2 1 基于特征的方法 2 2 微调方法 2 3
  • 基于arduino的串口控制数码管(5611AH)显示数字(初学,入门级附代码)

    基于arduino的串口控制数码管 5611AH 显示数字只有干货 首先先要介绍一下数码管了 这里图片为5611AH 这种数码管主要分为共阴极和共阳极两种 这里用的是共阴极的 注意区分 话不多说 直接上图片 此图为模拟图 当然我有实物 实物
  • vs2008创建动态库和使用动态库的方法

    一 创建动态库 打开vs2008 新建一个项目 选择win32 gt 控制台应用程序 gt 输入名称 点击确定 点击下一步 选择DLL gt 勾选空项目 点击完成 至此工程创建完毕 向工程中添加 h文件 声明接口函数 声明函数前加上关键字