一、建立动态链接库:
(以下涉及到的md5.h文件,global.h文件和md5.cpp的详细内容请参考前一篇博文---MD5算法)
1.
2.
3.
#include "global.h"
#include "md5.h"
#ifndef LIB_H
#define LIB_H
extern "C" void __declspec(dllexport)Encode (unsigned char *output,UINT4 *input,unsigned int len);
extern "C" void __declspec(dllexport)MD5Init(MD5_CTX *);
extern "C" void __declspec(dllexport)MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
extern "C" void __declspec(dllexport)MD5Final(unsigned char digest[16], MD5_CTX *context);
extern "C" void __declspec(dllexport)MD5Transform (UINT4 state[4],unsigned char block[64]);
extern "C" void __declspec(dllexport)Decode (UINT4 *output,unsigned char *input,unsigned int len);
extern "C" void __declspec(dllexport)MD5_memcpy (POINTER output,POINTER input,unsigned int len);
extern "C" void __declspec(dllexport)MD5_memset (POINTER output,int value,unsigned int len);
#endif
4.建立文件md5.cpp,其内容为原来内容,只不过把原来的#include "global.h"
#include "md5.h"去掉了,然后加上了#include "lib.h"
5.编译然后在工程的Debug目录下生成了MD5DLL.dll和MD5DLL.lib文件(这两个重要)
二、编写测试的main函数
建立工程之前,先要把以上生成的MD5DLL.dll和MD5DLL.lib文件考到本工程目录下,现在开始编写main函数吧,now ,let's begin!!
#include <stdio.h>
#include <windows.h>
typedef unsigned char *POINTER;
typedef unsigned short int UINT2;
typedef unsigned long int UINT4;
typedef struct
{
} MD5_CTX;
typedef void (*pMD5Init)(MD5_CTX *context);
typedef void (*pMD5Update)(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
typedef void (*pMD5Final)(unsigned char digest[16], MD5_CTX *context);
int main(int argc, char *argv[])
{
}
编译后,就可看到动态链接库的使用成功,其结果与MD5算法中在md5.c中写main函数的效果一样。
三、另外一种调用方法:
#include <stdio.h>
#include <windows.h>
typedef unsigned char *POINTER;
typedef unsigned short int UINT2;
typedef unsigned long int UINT4;
typedef struct
{
UINT4 state[4];
UINT4 count[2];
unsigned char buffer[64];
} MD5_CTX;
extern "C" __declspec(dllimport) MD5Init(MD5_CTX *context);
extern "C" __declspec(dllimport) MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
extern "C" __declspec(dllimport) MD5Final(unsigned char digest[16], MD5_CTX *context);
int main(int argc, char* argv[])
{
int i;
unsigned char encrypt[200];
unsigned char decrypt[17];
MD5_CTX md5;
MD5Init(&md5);
printf("请输入一个字符串:");
scanf("%s",encrypt);
MD5Update(&md5,encrypt,strlen((char*)encrypt));
MD5Final(decrypt,&md5);
printf("得到的MD5码是:");
for(i=0;i<16;i++)
printf("%2x",decrypt[i]);
printf("n");
return 0;
}