详解dll动态库的开发与调用及文件的读写小程序

详解dll动态库的开发与调用及文件的读写小程序

首先我们先来学习一下动态库的调用,先找到动态库的.dll和.lib文件并将其导入到同源文件相同级别的文件夹下面,然后在添加进其头文件,并右击项目处,然后点击链接,链接我们的lib文件(一定要是全名称包括扩展名),然后我们就可以调用动态库的函数了。

Dll是我们具体的函数, lib使我们的函数描述文件。

#include <stdio.h>
#include <stdlib.h>
/*
  该代码是对文件读写操作的使用
*/
#pragma warning(disable:4996)
#define MAX_DATA_LEN 4096
//进行加密的函数
int FileSymEnc(char * from, char * to); 

void main() { 

  char * from = "C:/Users/Administrator/Desktop/结构体的拷贝问题.docx";
  char * to = "C:/Users/Administrator/Desktop/副本结构体的拷贝问题.docx";
  //下面调用函数进行文件的读写
  int re = FileSymEnc(from, to);
  if (re == 0) {
    printf("文件读写错误!");
  }
  system("pause");
} 

int FileSymEnc(char * from, char * to) {
  //返回值,以确定执行状态,-0代表失败,1代表成功
  int re = 1;
  //写了几个
  int writtenLen = 0;
  //准备写几个
  int plainlen = 0;
  //在堆区分配4k内存空间
  unsigned char * buff = malloc(MAX_DATA_LEN);
  buff = memset(buff, 0, MAX_DATA_LEN);
  FILE * f = fopen(from, "rb");
  FILE * t = fopen(to, "wb");
  if (f == NULL) {
    printf("打开读文件错误!");
    goto END;
  }
  if (t == NULL) {
    printf("打开写文件错误!");
    goto END;
  } 

  while (!feof(f))
  { 

    writtenLen = fread(buff, 1, MAX_DATA_LEN, f);
    //判读是否读到了文件末尾,如果读到了则跳出循环
    if (feof(f))
    {
      plainlen = writtenLen;
      break;
    } 

    if (writtenLen != MAX_DATA_LEN) {
      //没有读取成功
      printf("文件读入失败!");
      re = 0;
      goto END;
    }
    //读取成功进行文件的写入
    writtenLen = fwrite(buff, 1, MAX_DATA_LEN, t);
    if (writtenLen != MAX_DATA_LEN) {
      printf("文件写入失败!");
      re = 0;
      goto END;
    }
  } 

  //外面处理不到4K的写入问题,我们本不用进行格外的小数据读写,主不过这和我们的加密方式相关连得
  writtenLen = fwrite(buff, 1, plainlen, t);
  if (writtenLen != plainlen) {
    printf("文件写入失败!");
    re = 0;
    goto END;
  } 

END:
  //堆分配的内存进行释放
  if (buff != NULL) {
    free(buff);
    buff = NULL;
  }
  //进行文件的关闭操作 

  if (f != NULL) {
    fclose(f);
    f = NULL;
  }
  if (t != NULL) {
    fclose(t);
    f = NULL;
  }
  return re;
}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Visual Studio中根据系统区分引用64位、32位DLL动态库文件的配置方法

    原来使用Win7的32位系统,进行C#工程的开发,后来重装系统,换成了win7的64位系统 调试原来的工程,由于在其中引用了"SQLite"的32位的dll,导致在64为位下程序无法运行(但是编译可以通过) 后来通过修改工程文件(.csproj),在其中设置引用的条件,解决了问题 打开引用了SQLite的工程(例如叫做info)的工程文件(info.csproj),找到对SQLite引用的语句,类似如下的代码 复制代码 代码如下: <Reference Include="

  • 详解dll动态库的开发与调用及文件的读写小程序

    详解dll动态库的开发与调用及文件的读写小程序 首先我们先来学习一下动态库的调用,先找到动态库的.dll和.lib文件并将其导入到同源文件相同级别的文件夹下面,然后在添加进其头文件,并右击项目处,然后点击链接,链接我们的lib文件(一定要是全名称包括扩展名),然后我们就可以调用动态库的函数了. Dll是我们具体的函数, lib使我们的函数描述文件. #include <stdio.h> #include <stdlib.h> /* 该代码是对文件读写操作的使用 */ #pragma

  • 详解Linux动态库生成与使用指南

    Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件. 在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用. 程序执行时,再去加载动态库文件.如果动态库已经加载,则不必重复加载,从而能节省内存空间. Linux下生成和使用动态库的步骤如下: 编写源文件. 将一个或几个源文件编译链接,生成共享库. 通过 -L<path> -lxxx 的gcc选项链接生成的libxxx.so

  • C++ DLL动态库的创建与调用(类库,隐式调用)

    目录 1.创建库工程 2.添加头文件 3.添加cpp文件 4.编译dll工程 5.创建调用工程 6.调用工程 添加cpp文件 1.创建库工程 2.添加头文件 ClassDll.h // 宏定义 防止.h文件重复编译 #ifndef _DLLCLASS_H #define _DLLCLASS_H // dll库文件 定义 宏(DLLCLASS_EXPORTS) 使用 _declspec(dllexport) // 使用dll库文件时 _declspec(dllimport)(不定义宏就行) #if

  • 详解C++ 动态库导出函数名乱码及解决

    刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都"乱码"了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法.此 DLL 中的所有文件都是用命令行上定义的 DLLEXPORT_EXPORTS // 符号编译的.在使用此 DLL 的 // 任何其他项目上不应定义此符号.这样,源文件中包含此文件的任何其他项目都会将 // DLLEXPORT_API 函数视为是从 D

  • Java通过调用C/C++实现的DLL动态库——JNI的方法

    由于项目的需要,最近研究了java 调用DLL的方法,将如何调用的写于此,便于日后查阅: 采用的方法是JNI: Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互. 下面是从网上摘取的JNI工作示意图: 总体说明:先在JAVA中建立一个类,通过javac生成.class,再由javah生成.h:然后将.h复制到VC下,由VC实现具体函, 并编译通过后生成DLL,将DLL放入JAVA工程中使用,完毕. 下面说说具体步骤(含实

  • 如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单

    需求:根据医保中心的文档和提供的dll动态库调用相关接口下载医保中心的账单. 文档:对调用dll动态库的描述,调用哪个dll文件,同时了解清楚调用这个dll文件中的哪个函数. 分析:结合文档及相关介绍弄清楚相关接口调用流程,从以上可以看出接口调用的是SiInterface.dll文件,然后先调用INIT函数进行初始化,然后再调用BUSINESS_HANDLE函数在医保局签到,然后在次调用BUSINESS_HANDLE函数下载账单,同时根据文档分析出每次调用函数的出入参.(具体的调用流程及每个函数

  • 详解Java动态字节码技术

    对 Debug 的好奇 初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处使用它的 Evaluate 功能直接执行某些命令,进行一些计算或改变当前变量. 刚开始语法不熟经常写错代码,重新打包部署一次代码耗时很长,我就直接面向 Debug 开发.在要编写的方法开始处打一个断点,在 Evaluate 框内一次次地执行方法函数不停地调整代码,没问题后再将代码复制出来放到 IDEA 里,再进行下一个方法的编写,这样就跟写 PHP 类似的

  • 详解Struts2动态方法调用

    动态方法就是一个Action对应多个请求,减少Action的数量 1.指定method属性 <action name="addAction" method="add" class="com.venn.action.HelloWorldAction"> <result>/jsp/add.jsp</result> </action> 2.感叹号(!)方式(不推荐使用) <action name=&

  • 详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)

    最近疫情比较严重,很多公司依靠阿里旗下的办公软件钉钉来进行远程办公,当然了,钉钉这个产品真的是让人一言难尽,要多难用有多难用,真的让人觉得阿里的pm都是脑残才会设计出这种脑残产品,不过吐槽归吐槽,该用还得用,虽然钉钉别的功能很鸡肋,但是机器人这个功能还是让人眼前一亮,属于比较极客的功能,它可以将第三方服务的信息聚合到钉钉群中,实现信息的自动化同步,例如:通过聚合Github.Gitlab等源码管理服务,实现源码更新同步:通过聚合Trello.JIRA等项目协调服务,实现项目信息同步:同事,支持W

  • 详解C标准库堆内存函数

    概述 C标准库堆内存函数有4个:malloc.free.calloc.realloc,其函数声明放在了#include <stdlib.h>中,主要用来申请和释放堆内存. 堆内存的申请和释放(wiki,chs),需要发起系统调用,会带来昂贵的上下文切换(用户态切换到内核态),十分耗时.另外,这些过程可能是带锁的,难以并行化. 对于操作系统而言,内存管理的基本单位是页(通常为4K),而不是需要4 Bytes时,就给你分配4 Bytes,释放4 Bytes时,就给你释放4 Bytes. 因此,为了

随机推荐