利用VC++6.0的depends工具打开dll动态链接库文件及函数封装
2012-11-18 15:21:54 来源:WEB开发网核心提示:以上的步骤就是做一个dll库的过程,也就是将我自己编写的函数集成在dll文件里,利用VC++6.0的depends工具打开dll动态链接库文件及函数封装(4),进一步说,就是不想别人看见我编的代码,还会为我们提供头文件,比如说windows.h但我们绝对不会知道LoadLibrary()函数的实现代码,只是以借口的形式
以上的步骤就是做一个dll库的过程,也就是将我自己编写的函数集成在dll文件里,进一步说,就是不想别人看见我编的代码,只是以借口的形式提供。全部重建后可以得到一个dll文件:
用depends工具打开:
可以发现列出的函数列表,就是我们上面的函数,dll文件只是以函数名的形式提供接口函数。也就是说,作为卖家,我可以将自己编写好的程序插件,以dll文件的形式的函数接口卖给买家。而买家完全不知道我的接口函数是怎样实现的。
接下来就是利用提供的接口函数,完成汉若塔程序。
首先我们得新建一个头文件t11.h这里包含一些基本的头文件
代码为:
#include"stdio.h"
#include"string.h"
#include"ctype.h"
#include"malloc.h"
#include"stdlib.h" //atoi(),exit();
#include"io.h" //eof()
#include"math.h"
#include"windows.h"
#include"string.h"
#include"ctype.h"
#include"malloc.h"
#include"stdlib.h" //atoi(),exit();
#include"io.h" //eof()
#include"math.h"
#include"windows.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Boolean;
typedef int Boolean;
int p=1;
我们再新建一个资源文件main_hrt.cpp也就是主函数所在文件,这里有个小技巧,就是编写完头文件后,就全部重建,会在对应的文件夹下生成一个Debug文件,然后我们将刚才自己做的dll文件拷贝到Debug文件夹下,将函数的头文件hrt_t.h拷贝到工程文件夹下。这也就是我们发下,微软提供dll文件里面的函数,还会为我们提供头文件。比如说windows.h但我们绝对不会知道LoadLibrary()函数的实现代码。想必大家有点头绪了吧。
代码为:
#include "windows.h"
#include"t11.h"
#include"hrt_t.h"
extern p; // 引用全局变量
typedef void(*lpFun)(Sqstack&); //宏定义函数指针类型
typedef void(*lpXy)(int,int);
typedef Status(*lpPush)(Sqstack&L,int,int);
typedef void(*lpHrt)(Sqstack &e,Sqstack &f,Sqstack &g,char (*b)[16],char (*a)[16],int n,char A,char B,char C);
void main()
{
Sqstack A,B,C;
int n;
HINSTANCE hDll = NULL;
lpFun lp = NULL;
lpXy lpxy = NULL;
lpPush lppush = NULL;
lpHrt lphrt = NULL;
hDll = LoadLibrary("hrt_HH.dll"); // 默认exe当前文件夹中找
if (hDll != NULL)
{
lp = (lpFun)GetProcAddress(hDll,"initstack");
lpxy = (lpXy)GetProcAddress(hDll,"gotoxy");
lppush = (lpPush)GetProcAddress(hDll,"push");
lphrt = (lpHrt)GetProcAddress(hDll,"hrt");
if (lp != NULL && lpxy!=NULL && lppush!=NULL &&lphrt!= NULL)
{
lp(A);
lp(B);
lp(C);
}
else
{
printf("链接库失败!");
getchar();
exit(0);
}
char a[][16]={"-","---","-----","-------","---------","-----------","-------------","---------------"}; // 定义盘子
char b[][16]={" "," "," "," "," "," "," "," "}; // 定义要覆盖对应的空格
printf("输入盘子数(<=8):");
scanf("%d",&n);
printf("\n\n\n\n\n");
if(n>8)
{
printf("输入不正确!");
getchar();
getchar();
exit(1);
}
for(int i=1;i<=8;i++)
printf("\t\t|\t\t\t|\t\t\t|\n");
printf("\t\t A\t\t\t B\t\t\t C\n");
#include"t11.h"
#include"hrt_t.h"
extern p; // 引用全局变量
typedef void(*lpFun)(Sqstack&); //宏定义函数指针类型
typedef void(*lpXy)(int,int);
typedef Status(*lpPush)(Sqstack&L,int,int);
typedef void(*lpHrt)(Sqstack &e,Sqstack &f,Sqstack &g,char (*b)[16],char (*a)[16],int n,char A,char B,char C);
void main()
{
Sqstack A,B,C;
int n;
HINSTANCE hDll = NULL;
lpFun lp = NULL;
lpXy lpxy = NULL;
lpPush lppush = NULL;
lpHrt lphrt = NULL;
hDll = LoadLibrary("hrt_HH.dll"); // 默认exe当前文件夹中找
if (hDll != NULL)
{
lp = (lpFun)GetProcAddress(hDll,"initstack");
lpxy = (lpXy)GetProcAddress(hDll,"gotoxy");
lppush = (lpPush)GetProcAddress(hDll,"push");
lphrt = (lpHrt)GetProcAddress(hDll,"hrt");
if (lp != NULL && lpxy!=NULL && lppush!=NULL &&lphrt!= NULL)
{
lp(A);
lp(B);
lp(C);
}
else
{
printf("链接库失败!");
getchar();
exit(0);
}
char a[][16]={"-","---","-----","-------","---------","-----------","-------------","---------------"}; // 定义盘子
char b[][16]={" "," "," "," "," "," "," "," "}; // 定义要覆盖对应的空格
printf("输入盘子数(<=8):");
scanf("%d",&n);
printf("\n\n\n\n\n");
if(n>8)
{
printf("输入不正确!");
getchar();
getchar();
exit(1);
}
for(int i=1;i<=8;i++)
printf("\t\t|\t\t\t|\t\t\t|\n");
printf("\t\t A\t\t\t B\t\t\t C\n");
更多精彩
赞助商链接