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函数的调用
源文件和上面代码不匹配,只是一个例子。
|