zoukankan      html  css  js  c++  java
  • Visual studio2010 编写dll 及 使用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.h和pow.dll和pow.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")

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

  • 相关阅读:
    关于Request.Form和动态添加服务器控件
    httpCookies
    简单的重写重置SessionID
    C# 内置类型表
    加密Web.Config(小技巧)
    C#委托实现系统回调
    C#中将字符串转成 Base64 编码(小技巧)
    关于跨域的SessionID的问题
    *.ashx文件
    Session中丢失的问题解决
  • 原文地址:https://www.cnblogs.com/qintangtao/p/2801490.html
Copyright © 2011-2022 走看看