Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126203
  • 博文数量: 10
  • 博客积分: 725
  • 博客等级: 军士长
  • 技术积分: 157
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-08 10:03
文章分类

全部博文(10)

文章存档

2011年(10)

我的朋友

分类:

2011-07-18 14:21:21

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

实例: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
#include

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函数的调用

源文件和上面代码不匹配,只是一个例子。

文件: VC_dll_Realese.rar
大小: 39KB
下载: 下载

阅读(298) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~