VC编写DLL几种方法的简介

一、动态链接库介绍(DLL) 

1.     Non-MFC DLL: 指的是不用MFC的类库,直接用C语言写的DLL,其输出的函数一般用的是标准C接口,并能被非MFC或MFC编写的应用程序所调用。 

2.     Regular DLL:和下述的Extension Dlls一样,是用MFC类库编写的。明显的特点是在源文件里有一个继承CWinApp的类。

        又可细分成静态连接到MFC和动态连接到MFC。但静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。 

         静态链接到MFC的动态链接库:这种DLL在链接过程中会将使用到的MFC类库复制一份到最终的DLL文件中,最终生成的DLL比较庞大且加载时不是很方便,但它可以在没有MFC类库DLL文件的机器上使用。 

          动态链接库使用共享MFC DLL:这种DLL不会将用到的MFC类库复制到最终生成的DLL中,因此最终的DLL比较小,加载也很方便,但在没有MFC类库DLL文件的机器上无法使用,必须有MFC类库的支持。 

 3.Extension DLL: 

MFC扩展DLL,可以实现从MFC所继承下来的类的重新利用,可以导出C++类以及MFC派生类,使用这种DLL必须有MFC类库的支持,也就是说它只被用MFC类库所编写的应用程序所调用。 

 

二、编写Non-MFC dll 

1、打开visual studio 2008 

2、file->new->Project… 

3 、在弹出的“New project”窗口中,prject types子窗口中选择 visual C++,Templates子窗口中选择Win32 Project,然后在name处输入 pow,location处输入F:/vc2008dll,点击“OK” 

4、在弹出的“win32 application wizard - pow”窗口中,点击“Next”; 

5、在弹出的“win32 application wizard - pow”窗口中,Application type选项中选择DLL,Additional options选项中选择Export symbols,点击“Finish” 

工程会自动生成对应的文件和代码,生成了pow.h和pow.cpp 

6、在pow.h的文件末尾添加pow函数的声明 

POW_API int pow(const int& x,const int& y);  

//POW_API是自动生成的一个宏,它的作用是表明该函数是导入还是导出的 

7、在Pow.cpp中添加pow函数的实现 

POW_API int pow(const int& x,const int& y) 

{    int z=1;

    for(int i=0;i<y;i++) 

        z*=x;

    return z; 

}

编译后会在debug目录里生成pow.dll和pow.lib两个文件,其中pow.lib是动态链接库进行静态链接时使用visual studio 2008默认的编译dll的调用约定是cdecl,若用其它程序调用该dll请注意调用约定,否则某些dll中的函数会抛出异常。修改vs2008的调用约定-project-->properties-->configuration properties-->C/C++-->advanced-->calling convention-->选择对应的方式!

 

三、静态调用Non-MFCdll 

方式一 

1、创建一个Win32 Console Application工程,工程名为test1。 

2、将pow.hpow.dllpow.lib拷贝到F:/c++/test1/test1目录下,把Pow.dll拷贝一份放到F:/c++/test1/Debug目录里防止直接运行exe时找不到dll。 

3、将pow.h添加到test1工程中 

4、修改test.Cpp文件如下: 

#include "stdafx.h" 

#include <iostream> 

#include "pow.h"

#pragma comment(lib,"pow.h")

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 

{     char a;  

     cout <<pow(3,3); 

     cin>>a; 

     return 0; 

 方式二 

1、创建一个Win32 Console Application工程,工程名为test2。 

2、将pow.dll和pow.lib拷贝到F:/c++/test2/test2目录下,把Pow.dll拷贝一份放到F:/c++/test2/Debug目录下防止直接运行exe时找不到dll。 

3、新建一个头文件命名为test2.h 

其文件如下: 

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

//不使用pragma comment,而直接在工程的Setting->Link页的Object/Moduls栏填入notmfcdll.lib也可 

__declspec(dllexport) int pow(const int& x,const int& y);  

4、修改test.Cpp文件如下: 

#include "stdafx.h" 

#include "test2.h" 

 int _tmain(int argc, _TCHAR* argv[])

   int a=0; 

   a=pow(3,6); 

   printf("%d",a); 

   char b; 

   b=getchar(); 

     return 0; 

三、动态调用Non-MFCdll 

1、创建一个Win32 Console Application工程,工程名为test3。 

2、将pow.dll拷贝到F:/c++/test3/test3目录下,把Pow.dll拷贝一份放到F:/c++/test/Debug目录下防止直接运行exe时找不到dll。 

3、修改test3.Cpp文件如下: 

#include <stdafx.h> 

#include <stdio.h> 

#include <windows.h> 

typedef  int (*MYPROC)( int, int); 

int _tmain(int argc, _TCHAR* argv[])

{     int a=0; 

     char b; 

    HINSTANCE hInst;    

     MYPROC  myproc; 

    //加载动态函数库 

    hInst = LoadLibrary(L"pow.dll"); 

     if( hInst != NULL) 

    { 

        myproc = (MYPROC)GetProcAddress( hInst,"pow" );//得到DLL中的函数的指针 

         a=myproc(2,3); 

         printf("%d",a); 

        FreeLibrary(hInst);//卸载DLL

   }

     else

     {

         a=1;

         printf("%d",a);

     }

    b=getchar(); 

     return 0;

按F5运行程序,抛出异常,调试发现GetProcAddress函数返回为空。 

因为visual studio 2008编译的dll导出函数是c++格式,而显示调用GetProcAddress函数是按照C格式查找函数,所以需修改pow.h文件,将导出函数包含在extern "C"{}中,如下: 

extern "C" 

POW_API int pow(int x, int y);  

重新编译动态函数,将生成的pow.dll重新拷贝到调用dll的程序中就可以了! 

导出函数包含在extern "C"{}中,使用静态调用方式二的方法调用该dll时格式也许调整如下: 

修改头文件test2.h 即可,其文件如下: 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值