我们知道提高开发效率的一个很重要的途径就是代码复用,我们经常将一些常用的功能构造成相对独立的模块,并在之后的项目重复使用,代码复用的方式有两种:
如图:
然后新建mymath.h和mymath.cpp文件。
mymath.h如下:
#pragma once #ifdef MATH_EXPORTS #define MATH_API __declspec(dllexport) #else #define MATH_API __declspec(dllimport) #endif namespace shun { class MATH_API Cmath { //类 public: int add(int a,int b); }; extern "C" MATH_API float pi; //变量 extern "C" MATH_API int getMax(int &,int &); //函数 }
#include "stdafx.h" #include "mymath.h" namespace shun { float pi=3.1415; //变量 int getMax(int& a, int& b) //函数 { return a > b ? a : b; } int Cmath::add(int a,int b) //类方法 { return a + b; } }
然后添加一个test.cpp文件,输入如下:
#include <iostream> #include "mymath.h" using namespace std; int main(char argc, char**argv) { int a = 1, b = 2; //类的使用 shun::Cmath cm; cout<<cm.add(1,2)<<endl; //变量 cout<<shun::pi<<endl; //函数 cout<<shun::getMax(a,b); getchar(); return 0; }运行一下我们发现调用dll项目了有木有。。
#include <iostream> #include "mymath.h" using namespace std; int main(char argc, char**argv) { int a = 1, b = 2; //类的使用 shun::Cmath cm; cout<<cm.add(1,2)<<endl; //变量 cout<<shun::pi<<endl; //函数 cout<<shun::getMax(a,b); getchar(); return 0; }
因为需要使用到windows api,所以要引入windows.h头文件。
添加test.cpp如下:
#include <windows.h> #include <iostream> using namespace std; typedef int (*Func)(int &, int &); int main(int argc, char *argv[]) { int a = 5, b = 10; HMODULE hDll = LoadLibrary("math.dll"); if (hDll != NULL) { Func getMax = (Func)GetProcAddress(hDll, "getMax"); //函数 if (getMax != NULL) { cout<<getMax(a, b)<<endl; } float* pPi = (float*)GetProcAddress(hDll,"pi"); //变量 if(pPi != NULL) { cout<<*pPi<<endl; } FreeLibrary(hDll); } getchar(); }
如果对于函数指针不太熟悉的话可以点这里:函数指针总结
//.h文件 extern "C" MATH_API int add_Interface(int &,int &); //函数 //.cpp文件 int add_Interface(int &a,int &b) { Cmath cm; return cm.add(a,b); }
我们知道,extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称。void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同)。
原文地址:http://blog.csdn.net/shun_fzll/article/details/39078971