程序开发中,经常会使用到动态库,那么动态库该如何实现和调用呢?本文通过一个简单的例子实现。
使用工具:VS2008
使用语言:C++
开发步骤:
#pragma once #ifdef MY_DLL_EXPORTS #define MY_DLL_API __declspec(dllexport) #else #define MY_DLL_API __declspec(dllimport) #endif class MY_DLL_API CDllFunc { public: CDllFunc(void); ~CDllFunc(void); public: void Show(void); };
#include "StdAfx.h" #include "DllFunc.h" #ifndef MY_DLL_EXPORTS #define MY_DLL_EXPORTS #endif CDllFunc::CDllFunc(void) { } CDllFunc::~CDllFunc(void) { } void CDllFunc::Show(void) { AfxMessageBox(_T("静态加载动态库")); }
extern "C" __declspec(dllexport) void CreateObject() { // *pObj = new CEcu; AfxMessageBox(_T("动态加载动态库")); }
新建一个对话框应用程序,添加两个按钮,分别用于静态和动态调用动态库
void CDllUseDemoDlg::OnBnClickedBtnDllInfo() { HINSTANCE hIn = NULL; hIn = LoadLibrary(_T("DllCreateInfoDemo.dll")); if(hIn != INVALID_HANDLE_VALUE) {} else { MessageBox(_T("Load DLL error")); return; } typedef void (*LPFNREGISTER)(); LPFNREGISTER pFun = NULL; char p[256] = {0}; CString str = _T("CreateObject"); int cnt = str.GetLength(); for(int i=0; i<cnt; i++) { p[i] = str.GetAt(i); } pFun = (LPFNREGISTER)GetProcAddress(hIn,p); (*pFun)(); FreeLibrary(hIn); }
#include"DllFunc.h" #pragma comment(lib,"DllCreateFuncDemo.lib")
void CDllUseDemoDlg::OnBnClickedBtnDllFunc() { CDllFunc dll; dll.Show(); }
原文地址:http://blog.csdn.net/bingdianlanxin/article/details/42341407