[C.C++] 关于C链接由C编译的动态库所存在的问题与解决方法

2581 2
鹰眼(流星) 2023-1-16 23:36:19 | 显示全部楼层 |阅读模式
本帖最后由 鹰眼(流星) 于 2023-1-16 23:49 编辑

      链接动态库是各大语言之间互相调用的重要操作,本身上也有许多不可或缺的功能——C程序对C动态库的调用并不是无意义的,如果说程序是一艘航母,那么动态库就是航母上的各类飞机。切入正题,关于(某种方式)C链接由C编译的动态库所存在哪些问题呢?


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
复制代码
      标红部分为引用的头文件,用于链接动态库的函数出自stdlib.h头文件中,应该有不少人在用。
      接下来的为DLL动态库C部分源代码(1)与主程序与动态库有密切联系的代码(2):
(1)
a += b;
printf("%d", a);
return 0;
(2)
printf("%d", the_ondy(1,1));
      红色部分为使用动态链接的函数。
      由于某个问题的影响,该部分代码有监控程序的进度,接下来有两种情况:
      1.控制台错误显示结果,则证明连接时变量a,b的数据发生错误,可解决;
      2.控制台未显示结果,则证明未成功链接动态库,须另寻他方;
      3.控制台只显示一次结果,则证明返回值未被主程序接收,可解决。
见图片:

      结果为第三种情况,证明返回值未被主程序接收!!!
解决方法:
      将返回值那行代码替换,并将函数切换为void类型:
  1. void ondy(int a, int b){
  2.         a += b;
  3.         printf("%d", a);
  4.        FILE *fp = fopen(".\\Z001", "wb+");
  5.         fwrite(&a, sizeof(int), 1, fp);
  6.         rewind(fp);
  7.         fclose(fp);
复制代码
      将主程序使用动态链接的部分(上方展示过)替换为:
the_ondy(1, 1);
FILE *fp = fopen(".\\z001", "rb+");
int n;
rewind(fp);
fread(&n, sizeof(int), 1, fp);
printf("%d", n);
fclose(fp);
      运行结果:

      将文件作为中转站进行传输,虽然解决了问题但麻烦了许多,如果大家有更好的方案,希望大家一起分享。







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
鹰眼(流星) 2023-1-16 23:54:26 | 显示全部楼层
我这辈子都不会再用一次“插入代码”功能了,
麻烦红盟的开发团队看一下,使用“插入代码”功能会导致乱码。
匿名  发表于 2023-1-17 00:59:39
鹰眼(流星) 发表于 2023-1-16 23:54
我这辈子都不会再用一次“插入代码”功能了,
麻烦红盟的开发团队看一下,使用“插入代码”功能会导致 ...

我QQ号被盗了手机号被改了QQ钱包也被注销了,能不能帮我找回来,找不回也没关系,谢谢你们了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行