C++ 动态库链接

动态库在应用程序中使用非常多,以前只接触了静态库的使用,现在学习了下动态库的封装和调用,顺便做了个小游戏,这个游戏在大家聚会中经常玩,就是一个人在手机上输入一个在一定范围内的数(这里是程序自动生成的),让大家去猜,这个游戏的算法很简单,我就把它封装在了一个动态库的一个类中



首先是动态库的封装:

//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




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值