vc6.0创建与调用dll

来源:互联网 发布:日系男装淘宝 知乎 编辑:程序博客网 时间:2024/05/26 14:10

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); 

/*

这是C格式导出函数;这种写法一般用在C++写的DLL中,指按C的规则导出这个函数,否则导出的函数会很怪;
加上 extern "C" 表示按标准C格式导出函数.如果去掉仅兼容C++;其中 int fun(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的Link里面加入:“cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib”我用的是opencv1.0

[html] view plain copy print?
  1. // object.cpp : Defines the entry point for the DLL application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "cv.h"  
  6. #include "highgui.h"  
  7.   
  8. extern "C"_declspec(dllexport)void detection (IplImage* pInpImg,CvHaarClassifierCascade * pCascade);  
  9.   
  10. BOOL APIENTRY DllMain( HANDLE hModule,   
  11.                        DWORD  ul_reason_for_call,   
  12.                        LPVOID lpReserved  
  13.                      )  
  14. {  
  15.     return TRUE;  
  16. }  
  17.   
  18.   
  19. void detection (IplImage* pInpImg,CvHaarClassifierCascade * pCascade)  
  20. {  
  21.        CvSeq * pFaceRectSeq;  
  22.        CvMemStorage * pStorage = 0;  
  23.        pStorage = cvCreateMemStorage(0);  
  24.   
  25.        //修改图片的大小   
  26.        IplImage * destImg;  
  27.        destImg=cvCreateImage(cvSize(640,478),IPL_DEPTH_8U,3);  
  28.        cvResize(pInpImg,destImg);  
  29.   
  30.         pFaceRectSeq = cvHaarDetectObjects(destImg,pCascade,pStorage,1.1,3,CV_HAAR_DO_CANNY_PRUNING,cvSize(20,20));  
  31.           
  32.         for(int i=0;i<(pFaceRectSeq?pFaceRectSeq->total:0);i++)  
  33.         {  
  34.             CvRect * r = (CvRect*)cvGetSeqElem(pFaceRectSeq,i);  
  35.             CvPoint pt1 = {r->x,r->y};  
  36.             CvPoint pt2 = {r->x+r->width,r->y+r->height};  
  37.             //CvPoint pt3 = {r->x+r->width/4,r->y+r->height/4};  
  38.               
  39.             cvRectangle(destImg,pt1,pt2,CV_RGB(0,255,0),3,4,0);  
  40.               
  41.         }  
  42.         cvNamedWindow("object",CV_WINDOW_AUTOSIZE); /*若有它就报错,可能是杀毒软件这类保护软件的问题,关闭它们即可*/  
  43.         cvShowImage("object",destImg);         
  44.     //  cvWaitKey(0);  
  45.           
  46. //      cvReleaseImage(&destImg);  
  47. //      cvReleaseImage(&pInpImg);  
  48. //      if(pStorage) cvReleaseMemStorage(&pStorage);  
  49. }  
  50.       

 

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

2.调用 DLL

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

 编辑cpp文件:

[html] view plain copy print?
  1. #include <stdio.h>           
  2. #include <stdlib.h>   
  3. #include <iostream.h>  
  4. #include <string.h>  
  5. #include "cv.h"  
  6. #include "highgui.h"  
  7.   
  8. typedef void (*DETECTION) (IplImage* ,CvHaarClassifierCascade * );  
  9.   
  10. int main(int argc,char ** argv)  
  11. {  
  12.     IplImage * pInpImg = 0;  
  13.     CvHaarClassifierCascade * pCascade = 0;  
  14.       
  15.     pInpImg = cvLoadImage("photo1.jpg",CV_LOAD_IMAGE_COLOR);  
  16.   
  17.     pCascade = (CvHaarClassifierCascade * )cvLoad(("cascade666.xml"),0,0,0);  
  18.   
  19.     HMODULE hModule = ::LoadLibrary("object.dll");  
  20.     DETECTION detect = (DETECTION)::GetProcAddress(hModule,"detection");  
  21.   
  22.     detect(pInpImg,pCascade);  
  23.     cvWaitKey(0);  
  24.     ::FreeLibrary(hModule);  
  25.   
  26.     if(pCascade)   
  27.         cvReleaseHaarClassifierCascade(&pCascade);  
  28.     cvReleaseImage(&pInpImg);  
  29.           
  30.     return 0;  
  31. }  

 

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

以上这种方法是显式连接

 

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;
}

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

 




0 0
原创粉丝点击