vs2010 dll 만들기 및 호출


vs2010 dll 만들기
간단한 예는 다음과 같습니다.
1. 새 프로젝트'Win32 Dynamic-Link Library'프로젝트 이름'Dll 1', 확인 후'빈 DLL 프로젝트'를 선택하고'완성'을 클릭합니다.우선 두 개의 파일을 새로 만듭니다,colorRate.h와colorRate.cpp.
1) "colorRate.h"파일의 내용
#include 
#include 
#include 
using namespace std;

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

2) "colorRate.cpp"의 내용
#include "colorRate.h"
#include 
#include    
#include     
#include 
#include 
#include 

//         
_declspec(dllexport) int colorStr(string strWord,map &mapWords)
{
	//map 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 
#include 
#include 
#include 
#include    
#include   
#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 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 프로젝트""를 선택하여""완료""를 클릭합니다."
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); 
/*
C 형식 내보내기 함수입니다.이런 쓰기 방법은 일반적으로 C++가 쓴 DLL에서 사용하는데 C의 규칙에 따라 이 함수를 내보내는 것을 가리킨다. 그렇지 않으면 내보내는 함수가 매우 이상할 것이다.extern "C"를 더하면 표준 C 형식으로 함수를 내보냅니다.C++만 호환되는 것을 제거하면;그 중에서 intfun (int a, int b) 이 부분 코드는 우리가 dll로 실현하고자 하는 함수 원형 성명이다
다른 것도 추가하고 싶으면 extern "C"declspec(dllexport) int fun1(int a, int b);
*/ 
DllMain은 DLL의 기본 입구 함수로 C 언어의main 함수와 유사하며 이 예는 수정하지 않고 DllMain 뒤에 추가합니다.
void detection (IplImage* pInpImg,CvHaarClassifierCascade * pCascade)
{
     ....... }
예: (dll을 만드는 예)
Opencv에 사용되는 물건이기 때문에 settings의 링크에 "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;itotal: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 파일을 프로젝트의 루트 디렉터리에 복사하고 카스캐드 666.xml,photo1.jpg도 루트 디렉터리에 있습니다.
cpp 파일을 편집하려면 다음과 같이 하십시오.
#include          
#include  
#include 
#include 
#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를 당신이 사용할 프로젝트에 넣고 프로젝트에 #pragmacomment(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("call add in dll:%d",result); } FreeLibrary(hDll); }
 
===========================================================================
2. 새 프로젝트'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 int Max(int a, int b) {if(a>=b)return a;else return b;}int Min(int a, int b) { printf("Min is called"); 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 int main () {int a; a = Min (8, 10), printf (비교 결과% d, a), return 0;이상의 방법은 정적 호출입니다. 편폭 동적 호출 때문에 저는 쓰지 않겠습니다.

좋은 웹페이지 즐겨찾기