本文回顾学习一下Windows动态链接库:dll与exe相互调用问题。一般滴,exe用来调用dll中的类或函数,但是dll中也可以调用exe中的类或函数,本文做一些尝试总结。
dll程序:
Calculator.h
1234567891011121314151617181920212223242526272829303132333435
// Calculator.h: interface for the Calculator class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ALCULATOR_H__D072BBB5_615B_45A9_9864_80C2291FA695__INCLUDED_)
#define AFX_ALCULATOR_H__D072BBB5_615B_45A9_9864_80C2291FA695__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class IHelper;
class Helper;
class _declspec(dllexport) Calculator
{
public:
Calculator();
~Calculator();
void registerHelper(IHelper *iHelper);
void registerHelper(Helper *helper);
int add(int num1, int num2);
int sub(int num1, int num2);
private:
IHelper *m_iHelper;
Helper *m_helper;
};
extern "C" _declspec(dllexport) Calculator *getCalculator();
#endif // !defined(AFX_ALCULATOR_H__D072BBB5_615B_45A9_9864_80C2291FA695__INCLUDED_)
Calculator.cpp
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
// Calculator.cpp: implementation of the Calculator class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Calculator.h"
#include "../vs_dll_caller/Helper.h"
#include "../vs_dll_caller/Helper.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Calculator::Calculator()
{
}
Calculator::~Calculator()
{
}
void Calculator::registerHelper(IHelper *iHelper)
{
m_iHelper = iHelper;
}
void Calculator::registerHelper(Helper *helper)
{
m_helper = helper;
}
int Calculator::add(int num1, int num2)
{
m_iHelper->print("do add!");
return num1 + num2;
}
int Calculator::sub(int num1, int num2)
{
m_iHelper->print("do sub!");
return num1 >= num2 ? num1 - num2 : -1;
}
Calculator *getCalculator()
{
return new Calculator();
}
exe程序:
IHelper.h
1234567891011
#pragma once
/************************************************************************/
// 抽象类 */
// 该类在exe中,方便dll中调用
/************************************************************************/
class IHelper
{
public:
virtual void print(const char *str) = 0;
};
Helper.h
1234567891011121314151617181920212223242526
// Helper.h: interface for the Helper class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_HELPER_H__9234DC8C_56CC_4765_BDA6_276F30C52221__INCLUDED_)
#define AFX_HELPER_H__9234DC8C_56CC_4765_BDA6_276F30C52221__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "iHelper.h"
class Helper
: public IHelper
{
public:
Helper();
virtual ~Helper();
virtual void print(const char *str);
};
#endif // !defined(AFX_HELPER_H__9234DC8C_56CC_4765_BDA6_276F30C52221__INCLUDED_)
Helper.cpp
1234567891011121314151617181920212223242526
// Helper.cpp: implementation of the Helper class.
//
//////////////////////////////////////////////////////////////////////
#include "Helper.h"
#include
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Helper::Helper()
{
}
Helper::~Helper()
{
}
void Helper::print(const char *str)
{
std::cout << str << " ";
}
main.cpp
12345678910111213141516171819202122232425262728293031323334353637383940414243
#include
#include
#include
#include "Helper.h"
#include "../vs_dll/Calculator.h"
typedef Calculator*(*Cal)();
int main()
{
std::cout << "Hello World!\n";
// 隐式调用
std::cout << "\n隐式调用" << std::endl;
Calculator cal;
// 回调指针给dll
IHelper *helper = new Helper();
cal.registerHelper(helper);
int num_add = cal.add(3, 2);
std::cout << "cal.add = " << num_add << std::endl;
int num_sub = cal.sub(3, 2);
std::cout << "cal.sub = " << num_sub << std::endl;
// 显式调用
std::cout << "\n显式调用" << std::endl;
HMODULE hDll = ::LoadLibrary("../Debug/vs_dll.dll");
if (hDll != NULL)
{
Cal cal = (Cal)GetProcAddress(hDll, "getCalculator");
Calculator *pCal = cal();
// 回调指针给dll
IHelper *helper = new Helper();
pCal->registerHelper(helper);
int num_add = pCal->add(3, 2);
std::cout << "pCal->add = " << num_add << std::endl;
int num_sub = pCal->sub(3, 2);
std::cout << "pCal->sub = " << num_sub << std::endl;
}
std::cin.get();
return 0;
}
总结:一般滴,dll是用来被exe调用的,如果dll要调用exe中的类,可以给dll注册一个该类的指针即可,而且该指针为抽象类指针。