zoukankan      html  css  js  c++  java
  • VS2010 DLL库生成和使用

    一、生成dll文件(VS2010 Win32 程序)

    CreateDll.h

    // 下列 ifdef 块是创建使从 DLL 导出更简单的
    // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 CREATEDLL_EXPORTS
    // 符号编译的。在使用此 DLL 的
    // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
    // CREATEDLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
    // 符号视为是被导出的。
    #ifdef CREATEDLL_EXPORTS
    #define CREATEDLL_API __declspec(dllexport)
    #else
    #define CREATEDLL_API __declspec(dllimport)
    #endif

    // 此类是从 CreateDll.dll 导出的
    class CREATEDLL_API CCreateDll {
    public:
        CCreateDll(void);
        // TODO: 在此添加您的方法。
    };

    extern CREATEDLL_API int nCreateDll;

    CREATEDLL_API int fnCreateDll(void);

    CREATEDLL_API int printMax(int& x, int& y);

    CREATEDLL_API int printMax(int& x, int& y, int& z);

    // CreateDll.cpp : 定义 DLL 应用程序的导出函数。
    //

    #include "stdafx.h"
    #include "CreateDll.h"
    #include <iostream>
    using namespace std;

    // 这是导出变量的一个示例
    CREATEDLL_API int nCreateDll = 0;

    // 这是导出函数的一个示例。
    CREATEDLL_API int fnCreateDll(void)
    {
        cout<<"the default function"<<endl;
        return 42;
    }

    CREATEDLL_API int printMax(int& x, int& y)
    {
        cout<<"among("<<x<<","<<y<<")the bigger is:"<<(x > y ? x : y)<<endl;
        return 0;
    }

    CREATEDLL_API int printMax(int& x, int& y, int& z)
    {
        cout<<"among("<<x<<","<<y<<","<<z<<")the max is:"<<((x > y ? x : y)> z ? (x > y ? x : y) : z)<<endl;
        return 0;
    }


    // 这是已导出类的构造函数。
    // 有关类定义的信息,请参阅 CreateDll.h
    CCreateDll::CCreateDll()
    {
        cout<<"the default class."<<endl;
        return;
    }

    CreateDll.def

    LIBRARY CreateDLL  
    EXPORTS  
    pMaxA2 = ?printMax@@YAXAAH0@Z  
    pMaxA3 = ?printMax@@YAXAAH00@Z  

    二、使用Dll文件(VS2010 Win32 程序):

    // UseDll.cpp : 定义控制台应用程序的入口点。
    //

    #include "stdafx.h"
    #include <Windows.h>
    #include <iostream>
    using namespace std;

    typedef void(* FUNA)(int&, int&);
    typedef void(* FUNB)(int&, int&, int&);

    int _tmain(int argc, _TCHAR* argv[])
    {
        const char* dllName = "CreateDLL.dll";  
        /*const char* funName1 = "printMax";  
        const char* funName2 = "printMax";  */

        /*const char* funName1 = "?printMax@@YAXAAH0@Z";  
        const char* funName2 = "?printMax@@YAXAAH00@Z";  */

        const char* funName1 = "pMaxA2";  
        const char* funName2 = "pMaxA3";  

        int x(100), y(200), z(300);  
        HMODULE hDLL = LoadLibraryA(dllName);  
        if(hDLL != NULL)  
        {  
            //怎样获取类:

            //怎样获取参数:

            FUNA fp1 = FUNA(GetProcAddress(hDLL,funName1));  
            if(fp1 != NULL)  
            {  
                std::cout<<"Input 2 Numbers:";  
                std::cin>>x>>y;  
                fp1(x,y);  
            }  
            else  
            {  
                std::cout<<"Cannot Find Function "<<funName1<<std::endl;  
            }  
            FUNB fp2 = FUNB(GetProcAddress(hDLL,funName2));  
            if(fp2 != NULL)  
            {  
                std::cout<<"Input 3 Numbers:";  
                std::cin>>x>>y>>z;  
                fp2(x,y,z);  
            }  
            else  
            {  
                std::cout<<"Cannot Find Function "<<funName2<<std::endl;  
            }  
            FreeLibrary(hDLL);  
        }  
        else  
        {  
            std::cout<<"Cannot Find "<<dllName<<std::endl;  
        }  
        system("pause");
        return 0;
    }

    二、生成DLL和在C#中使用:

    1、在stdafx.h中加入以下内容:

    #ifndef DLL_EXPORT
    #define DLL_EXPORT 1
    #endif

    2、ExportDll.h文件:

    #ifndef __EXPORTDLL_H__
    #define __EXPORTDLL_H__

    //#ifdef EXPORTDLL_EXPORTS
    #ifdef  DLL_EXPORT
    #define DLL_API __declspec(dllexport)
    #else
    #define DLL_API __declspec(dllimport)
    #endif

    //////////////////////////////////////////////////////////////////////////
    //函数定义

    extern "C" DLL_API int InitObject();

    extern "C" DLL_API int UninitObject();

    extern "C" DLL_API int ReadXML();

    extern "C" DLL_API int WriteXML();

    #endif
    3、ExportDll.cpp文件:

    // ExportDll.cpp : 定义 DLL 应用程序的导出函数。
    //

    #include "stdafx.h"
    #include "ExportDll.h"
    #include <string>
    #include <iostream>
    using namespace std;

    //////////////////////////////////////////////////////////////////////////
    //声明类

    class Object
    {
    private:
        string xml;
    public:
        Object(const char* xmlName);

        bool ReadXML();
        bool WriteXML();

        ~Object();
    };

    //////////////////////////////////////////////////////////////////////////
    //定义类

    Object::Object(const char* xmlName)
    {
        xml = xmlName;
    }

    bool Object::ReadXML()
    {
        cout<<"Read"<<xml<<endl;
        return true;
    }

    bool Object::WriteXML()
    {
        cout<<"Write"<<xml<<endl;
        return true;
    }

    Object::~Object()
    {
        //xml = nullptr;
    }

    //////////////////////////////////////////////////////////////////////////
    //定义全局变量

    Object* obj =  nullptr ;

    //////////////////////////////////////////////////////////////////////////
    //导出函数

    extern  Object* obj;

    extern "C" DLL_API int InitObject()
    {
        if (obj != nullptr)
        {
            return -1;
        }
        const char* xml = "Dll.Xml";
        obj = new Object(xml);
        //delete obj;
        if (nullptr == obj)
        {
            return -1;
        }
        return 0;
    }

    extern "C" DLL_API int ReadXML()
    {
        if (nullptr == obj)
        {
            return -1;
        }
        obj->ReadXML();
        return 0;
    }

    extern "C" DLL_API int WriteXML()
    {
        if (nullptr == obj)
        {
            return -1;
        }
        obj->WriteXML();
        return 0;
    }

    extern "C" DLL_API int UninitObject()
    {
        if (nullptr == obj)
        {
            return -1;
        }
        delete obj;
        cout<<obj<<endl;
        obj = nullptr;
        return 0;
    }
    4、将相应的lib、dll文件拷贝到工作目录下:

    5、 [DllImport("ExportDll.dll", CharSet = CharSet.Unicode, EntryPoint = "InitObject", CallingConvention = CallingConvention.Cdecl)]
            public static extern int InitObject();
            [DllImport("ExportDll.dll", CharSet = CharSet.Unicode, EntryPoint = "ReadXML", CallingConvention = CallingConvention.Cdecl)]
            public static extern int ReadXML();
            [DllImport("ExportDll.dll", CharSet = CharSet.Unicode, EntryPoint = "WriteXML", CallingConvention = CallingConvention.Cdecl)]
            public static extern int WriteXML();
            [DllImport("ExportDll.dll", CharSet = CharSet.Unicode, EntryPoint = "UninitObject", CallingConvention = CallingConvention.Cdecl)]
            public static extern int UninitObject();

            static void Main(string[] args)
            {
                int a = InitObject();
                int b = ReadXML();
                int c = WriteXML();
                int d = UninitObject();
                d = UninitObject();
                d = InitObject();
                d = InitObject();
                d = UninitObject();
            }

  • 相关阅读:
    来了!GitHub for mobile 发布!iOS beta 版已来,Android 版即将发布
    五角场之殇。曾与张江、漕河泾、紫竹齐名。如今,上海四大IT科技园是否还在?
    Visual Studio Online 的 FAQ:iPad 支持、自托管环境、Web 版 VS Code、Azure 账号等
    VS Code 1.40 发布!可自行搭建 Web 版 VS Code!
    Visual Studio Online,带来四种开发模式,未来已来。
    基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)
    css伪元素::before与::after使用基础示例
    gcc生成静态链接库与动态链接库步骤,并链接生成可执行文件的简单示例
    shell求水仙花数
    shell实现简单的数组排序
  • 原文地址:https://www.cnblogs.com/shenchao/p/3201666.html
Copyright © 2011-2022 走看看