天天看点

vs2010 创建dll 及调用

vs2010 创建dll

简单例子如下:

1、新建项目 “Win32 Dynamic-Link Library” 项目名称“Dll_1”,确定后选择“一个空的DLL工程”点击“完成”。

首先新建两个文件,colorRate.h和colorRate.cpp。

1)"colorRate.h" 文件里的内容

#include <string>
#include <map>
#include <algorithm>
using namespace std;

_declspec(dllexport) int colorStr(string strWord,map<string, int> &mapWords);
_declspec(dllexport) int colorStrRate(string strWord,map<string, int> &mapWords);
           

2)"colorRate.cpp"里的内容

#include "colorRate.h"
#include <stdio.h>
#include <iostream>   
#include <fstream>    
#include <string>
#include <map>
#include <algorithm>

//统计车颜色占的比例
_declspec(dllexport) int colorStr(string strWord,map<string, int> &mapWords)
{
	//map<string, int> mapWords; // 存放词以及频率     
	if (strWord=="01")
	{
		strWord="蓝";
		mapWords[strWord]++;  	
	}
	else if (strWord=="02")
	{
		strWord="黑";
		mapWords[strWord]++; 
	}	
	else if (strWord=="03")
	{
		strWord="白";
		mapWords[strWord]++;  
	}	
	else 
	{
		strWord="其它";
		mapWords[strWord]++; 
	}
}
           

3)调用dll    新建一个win32控制台应用程序

(1)把生的 .lib文件、dll文件、dll的头文件拷贝到另一个工程(要调用DLL的项目)的目录下

另一个项目的调用代码如下:

#pragma once
#include "stdafx.h"
#include <string>
#include <map>
#include <algorithm>
#include <stdio.h>
#include <iostream>   
#include <fstream>  
#include "include_cpp/libxl.h"
#include "colorRate.h"
using namespace std;
using namespace libxl;

using namespace std;
#pragma comment(lib,"colorRateDll.lib")
int _tmain(int argc, _TCHAR* argv[])
{
	Book *book=xlCreateBook();
	bool f=book->load("E:\\数据分析\\liu-1106.xls");
	cout << book->sheetCount() << endl;
	Sheet *sheet =book->getSheet(0); 

	char str[1024]={0};
	const char *strname; 
	const char *strname1;
	int recordNum=14931;
	int tt=2;// 哪一行
	string strWord;
	map<string, int> mapWords;

	for (int i=tt;i<10;i++)
	{
		strname =(const char *) sheet->readStr(i,20);	//读第20列	
		strWord = strname ? strname : ""; 
		colorStr(strWord,mapWords);
	}


	return 0;
}
           

以上的方法是静态调用

1.使用 VC6.0 生成 DLL

新建项目 “Win32 Dynamic-Link Library”,输入项目名称如:object,确定后选择 “A simple DLL project” 点击“完成”。

 以下为cpp文件自动生成的代码:

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule, 

                       DWORD  ul_reason_for_call, 

                       LPVOID lpReserved

)

{

    return TRUE;

}

编辑cpp文件:

在#include "stdafx.h"的下一行加入

extern "C" __declspec(dllexport) void detection (IplImage* pInpImg,CvHaarClassifierCascade * pCascade); 

DllMain 是 DLL 的默认入口函数,类似于C语言的main函数,该例子无需修改此处,在 DllMain 的后面加入:

void detection (IplImage* pInpImg,CvHaarClassifierCascade * pCascade)

{

     .......

}

例子:(创建dll的例子)

因为里面用到opencv的东西,所以要在settings的Link里面加入:“cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib”我用的是opencv1.0

// object.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

extern "C"_declspec(dllexport)void detection (IplImage* pInpImg,CvHaarClassifierCascade * pCascade);

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}


void detection (IplImage* pInpImg,CvHaarClassifierCascade * pCascade)
{
	   CvSeq * pFaceRectSeq;
	   CvMemStorage * pStorage = 0;
	   pStorage = cvCreateMemStorage(0);

	   //修改图片的大小 
	   IplImage * destImg;
	   destImg=cvCreateImage(cvSize(640,478),IPL_DEPTH_8U,3);
	   cvResize(pInpImg,destImg);

		pFaceRectSeq = cvHaarDetectObjects(destImg,pCascade,pStorage,1.1,3,CV_HAAR_DO_CANNY_PRUNING,cvSize(20,20));
		
		for(int i=0;i<(pFaceRectSeq?pFaceRectSeq->total:0);i++)
		{
			CvRect * r = (CvRect*)cvGetSeqElem(pFaceRectSeq,i);
			CvPoint pt1 = {r->x,r->y};
			CvPoint pt2 = {r->x+r->width,r->y+r->height};
			//CvPoint pt3 = {r->x+r->width/4,r->y+r->height/4};
			
			cvRectangle(destImg,pt1,pt2,CV_RGB(0,255,0),3,4,0);
			
		}
		cvNamedWindow("object",CV_WINDOW_AUTOSIZE); /*若有它就报错,可能是杀毒软件这类保护软件的问题,关闭它们即可*/
		cvShowImage("object",destImg);       
	//	cvWaitKey(0);
		
// 		cvReleaseImage(&destImg);
// 		cvReleaseImage(&pInpImg);
// 		if(pStorage) cvReleaseMemStorage(&pStorage);
}
	
           

这就是我们想用 DLL 实现的函数的定义,build 之后就会在 debug 目录下生成我们想要的 dll 文件

2.调用 DLL

新建一个 Win32 Console Application 工程,把刚才生成的 dll 文件拷贝到工程的根目录下,同时把cascade666.xml,photo1.jpg也放在根目录下。

 编辑cpp文件:

#include <stdio.h>         
#include <stdlib.h> 
#include <iostream.h>
#include <string.h>
#include "cv.h"
#include "highgui.h"

typedef void (*DETECTION) (IplImage* ,CvHaarClassifierCascade * );

int main(int argc,char ** argv)
{
	IplImage * pInpImg = 0;
	CvHaarClassifierCascade * pCascade = 0;
	
	pInpImg = cvLoadImage("photo1.jpg",CV_LOAD_IMAGE_COLOR);

	pCascade = (CvHaarClassifierCascade * )cvLoad(("cascade666.xml"),0,0,0);

	HMODULE hModule = ::LoadLibrary("object.dll");
	DETECTION detect = (DETECTION)::GetProcAddress(hModule,"detection");

	detect(pInpImg,pCascade);
	cvWaitKey(0);
	::FreeLibrary(hModule);

	if(pCascade) 
		cvReleaseHaarClassifierCascade(&pCascade);
	cvReleaseImage(&pInpImg);
		
	return 0;
}
           

然后,运行就可以看到结果了

以上这种方法是显式连接

1,隐式连接.将制作好的.dll.lib.h三个文件COPY到你要用的工程下,然后在工程中加入#pragma comment(lib,"somedll.lib")

somedll.lib 其中somedll是你要调用的库的名字..然后直接调用你的funa就可以了

2.显式连接

typedef int (* lpFuna)(int,int);

int main(int argc, char* argv[])

{

HINSTANCE hDll;

lpFuna Funa;

hDll = LoadLibrary("a.dll");

if (hDll != NULL)

{

Funa = (lpFuna)GetProcAddress(hDll,"Funa");

if(Funa!=NULL)

{

int result = Funa(2,3);

printf("\ncall add in dll:%d",result);

}

FreeLibrary(hDll);

}

===========================================================================

二、新建项目 “Win32 Dynamic-Link Library” 项目名称“Dll_1”,确定后选择“一个空的DLL工程”点击“完成”。

首先新建两个文件,MyDll.h和MyDll.cpp。

"MyDll.h" 文件里的内容

extern "C" _declspec(dllexport) int Max(int a, int b);

extern "C" _declspec(dllexport) int Min(int a, int b);

"MyDll.cpp"里的内容

#include"MyDll.h"

#include <stdio.h>

int Max(int a, int b)

{

if(a>=b) return a;

else return b;

}

int Min(int a, int b)

{

printf("Min is called\n\n");

if (a >= b) return b;

else return a;

}

然后把生的 .lib文件拷贝到另一个工程(要调用的DLL项目)的目录下,把.dll文件拷贝到另一个工程(要调用的DLL项目)的debug目录下

另一个项目的调用代码如下:

#pragma comment(lib,"MyDll.lib")

extern "C"_declspec(dllimport) int Max(int a,int b);

extern "C"_declspec(dllimport) int Min(int a,int b);

#include <stdio.h>

int main()

{

int a;

a = Min(8,10);

printf("比较的结果为%d\n",a);

return 0;

}

以上的方法是静态调用,由于篇幅 动态调用我就不写了。。