动态库在应用程序中使用非常多,以前只接触了静态库的使用,现在学习了下动态库的封装和调用,顺便做了个小游戏,这个游戏在大家聚会中经常玩,就是一个人在手机上输入一个在一定范围内的数(这里是程序自动生成的),让大家去猜,这个游戏的算法很简单,我就把它封装在了一个动态库的一个类中
首先是动态库的封装:
//mybase.h
//这个是基类,对外提供这个游戏的接口(只有一个接口,因为这个游戏很简单)
#include <map>
class mybase
{
public:
virtual std::map<int,int> run(int)=0;//返回值是map类型,第一个是数字的下线,第二个是上限,参数就是玩家猜的那个数字
};
//这个是这个游戏的逻辑实现类,继承mybase基类
#include <map>
#include "mybase.h"
#pragma once
class Logic :public mybase
{
public:
Logic();
virtual std::map<int,int> run(int);
private:
int num;
int max;
int min;
};
//这是逻辑类的实现
#include "Logic.h"
#include "time.h"
#include "stdio.h"
#include <iostream>
using namespace std;
map<int,int> Logic::run( int a)
{
map<int,int> b;
if (a==num)
{
b.insert(pair<int,int>(-1,-1));
return b;
}
if (a>max||a<min)
{
cout<<"输入有误"<<endl;
b.insert(pair<int,int>(min,max));
return b;
}
if (a>num)
{
max=a;
}
if(a<num)
{
min=a;
}
b.insert(pair<int,int>(min,max));
return b;
}
Logic::Logic()
{
srand((int)time(0));
num=rand()%100;
max=100;
min=0;
}
现在功能都已经实现了,剩下的
就是对外开放一个创建这个类对象的接口。
//头文件是对外开放创建类对象的接口
#ifndef LOGIC_LOGIC
#define LOGIC_LOGIC
class Logic;
extern "C"_declspec(dllexport)Logic * createLogic();
#endif
// dllmain.cpp : 定义 DLL 应用程序的入口点。
//对外开放接口的实现
#include "stdafx.h"
#include "Logic.h"
#include "myExport.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern "C"_declspec(dllexport)Logic * createLogic()
{
return new Logic();
}
好了,动态库都创建好了,运行一下就会在相应的debug下生成相应的lib文件盒dll文件。我们现在只需要dll文件和那个基类的头文件,把这两个文件放到我们那个游戏主程序的debug里(基类的头文件放在代码的那个文件里)
接下来是主程序
// gameNumber.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "windows.h"
#include <iostream>
#include <map>
#include "myExport.h"
#include "mybase.h"
using namespace std;
typedef mybase * (*initLogic)();//这里创建了一个返回值是基类指针的函数指针类型
HINSTANCE m;
int _tmain(int argc, _TCHAR* argv[])
{
initLogic log;//创建一个函数指针
m=LoadLibrary("mydll.dll");//加载动态库
if (!m)
{
return false;
}
log=(initLogic)GetProcAddress(m,"createLogic");//用函数指针去获取动态库中创建类对象的函数
mybase *temp=log();//用获取的函数创建游戏的逻辑对象
bool btn=true;
cout<<"请输入一个0到100的数字"<<endl;
while (btn)
{
int n;
map<int,int> map1;
cin>>n;
map1=temp->run(n);
map<int,int>::iterator it=map1.begin();
if (it->first==-1)
{
cout<<"恭喜你答对了"<<endl;
btn=false;
}
else
{
cout<<"数字在"<<it->first<<"到"<<it->second<<"之间"<<endl;
}
}
system("pause");
return 0;
}
这是一个非常简单的例子,能过让我们初步的了解动态库的创建和使用。
参考链接:http://blog.csdn.net/zhangjingyangguang/article/details/6104828