静态调用:
需要dll文件,lib文件,头文件
lib文件在编译时用到,在主程序加载时,会装载dll,主程序运行期,dll不能卸载
动态调用:
需要dll文件
使用LoadLibrary-> GetProcAddress调用,只有在LoadLibrary执行时,dll才被装载,dll可以随时被卸载
动态调用代码例子
#ifndef _IKPERSON_H_
#define _IKPERSON_H_
#ifdef DLL_EXPORT
#define DLL_API extern "C" __declspec(dllexport)
#else
#define DLL_API extern "C" __declspec(dllimport)
#endif
/*
设计这个接口类的作用:
能采用动态调用方式使用这个类
*/
class IKPerson
{
public:
virtual ~IKPerson(void) //对于基类,显示定义虚析构函数是个好习惯(注意,为什么请google)
{
}
virtual int GetOld(void) const = 0;
virtual void SetOld(int nOld) = 0;
virtual const char* GetName(void) const = 0;
virtual void SetName(const char* szName) = 0;
};
/* 导出函数声明 */
DLL_API IKPerson* _cdecl GetIKPerson(void);
typedef IKPerson* (__cdecl *PFNGetIKPerson)(void);
#endif
#pragma once
#define DLL_EXPORT
#include "ikperson.h"
class CKChinese :
public IKPerson
{
public:
CKChinese(void);
~CKChinese(void);
virtual int GetOld(void) const;
virtual void SetOld(int nOld);
virtual const char* GetName(void) const;
virtual void SetName(const char* szName);
private:
int m_nOld;
char m_szName[64];
};
#include "StdAfx.h"
#include "KChinese.h"
CKChinese::CKChinese(void) : m_nOld(0)
{
memset(m_szName, 0, 64);
}
CKChinese::~CKChinese(void)
{
}
int CKChinese::GetOld(void) const
{
return m_nOld;
}
void CKChinese::SetOld(int nOld)
{
this->m_nOld = nOld;
}
const char* CKChinese::GetName(void) const
{
return m_szName;
}
void CKChinese::SetName(const char* szName)
{
strncpy(m_szName, szName, 64);
}
/* 导出函数定义 */
IKPerson* __cdecl GetIKPerson(void)
{
IKPerson* pIKPerson = new CKChinese();
return pIKPerson;
}
// callclassExportDll.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#include "../../classExportDll/classExportDll/IKPerson.h"
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE hDll = ::LoadLibrary(_T("classExportDll.dll"));
if (NULL != hDll)
{
PFNGetIKPerson pFun = (PFNGetIKPerson)::GetProcAddress(hDll, "GetIKPerson");
if (NULL != pFun)
{
IKPerson* pIKPerson = (*pFun)();
if (NULL != pIKPerson)
{
pIKPerson->SetOld(103);
pIKPerson->SetName("liyong");
cout << pIKPerson->GetOld() << endl;
cout << pIKPerson->GetName() << endl;
delete pIKPerson;
}
}
::FreeLibrary(hDll);
}
return 0;
}