windows下的动态链接问题(.dll文件的编写与调用)

本文介绍了一个使用DLL动态链接库实现代码共享和重用的例子。通过C语言编写多个源文件并将其打包成DLL,主程序可以根据用户输入动态调用DLL中的不同功能。此方法避免了使用switch语句,展示了函数指针的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 目的:为了达到代码的共享和重用

实例:deposit.c save.c exit1.c dig.h dy.c
这里用到了工具DEV-C++

(deposit.c文件)
#include "dig.h"

void deposit(){
 printf("you deposit 5000$ /n"); 
}

(save.c文件)
#include "dig.h"

void save(){
 printf("you saved 1000$ /n"); 
}

(exit1.c文件)
#include "dig.h"
int exit1(){
     exit(0);   
}

(dig.h文件中声明了以上三个函数)
#ifdef BUILD_DLL 
#define EXPORT __declspec(dllexport) 
#else
#define EXPORT __declspec(dllimport) 
#endif 
EXPORT void save();
EXPORT void deposit();
EXPORT int exit1();

(dy.c是主函数,对以上函数的调用)

#include <stdio.h>
#include <windows.h>

main(){
 while(1){ 
 /*以下是对 .dll文件的调用 */ 
  HINSTANCE hInstance;
      void (*func)();
  hInstance = LoadLibrary("my.dll");//打开.dll文件
  
  showGUI();//显示登入界面
  char s[10];
  scanf("%s",&s); 
  func = ( void (*)() )GetProcAddress(hInstance,s);//找出输入的字符串s是否与.dll文件中函数名匹配
         if(!func){
                       printf("your input is wrong!/n");
                       continue;   
         }
  (*func)();
  continue;
  }
}
int showGUI(){
 FILE *login;
 char c;
 login = fopen("login.txt","r");
 if(!login){
  printf("file err:login/n");
  return; 
 }
 while(1){
  c = fgetc(login);
  if(c == EOF){
   break; 
  }
  printf("%c",c); 
 }
 fclose(login);
 return 0;
}

其中login.txt文件为银行登入的功能界面
*************
1.save     *
2.deposit   *
3.exit1     *
*************
这个函数实现的功能是,当用户输入deposit时,实现取款功能等等。特点是没有使用switch语句就可实现

编译过程:
1.编译save.c deposit.c exit1.c,得到save.o deposit.o exit1.o
gcc -c -DBUILD_DLL save.c deposit.c exit1.c
使用-DBUILD_DLL来设置宏BUILD_DLL
2.创建.dll文件(最重要步骤)
gcc -shared -o my.dll save.o deposit.o exit1.o -Wl,--out-implib,libmy.a
详细说明:
-shared 参数用来创建共享库.dll文件
-Wl等待下一条信息进行连接
--out-implib是给连接程序ld使用用于创建要连接dll需要的import library
3.编译dy.c得到dy.o
gcc -c dy.c
4.创建可执行文件dy.exe
gcc -o dy.exe dy.o -L./ -lmy
-L指定链接库路径
-lmy(-l my)指定dll的import library

然后输入  dy 执行
结果:输入save 打印 you saved 1000$
      输入deposit打印you deposit 5000$

在这个程序中用到了函数指针:
void (*func)();
void dig1();
void dig2();
当 func=dig1时,(*func)()就是对dig1函数的调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值