博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VS2010 DLL库生成和使用
阅读量:6807 次
发布时间:2019-06-26

本文共 5000 字,大约阅读时间需要 16 分钟。

一、生成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();
        }

转载地址:http://devwl.baihongyu.com/

你可能感兴趣的文章
文思海辉:智慧数据避免企业成为大数据时代落伍者
查看>>
迅雷发布“星域CDN” 做条颠覆市场的鲶鱼
查看>>
英国《数字经济法案》
查看>>
Asp.net与Flex交互测试记录
查看>>
大厂前端高频面试问题与答案精选
查看>>
C# 7编程模式与实践
查看>>
如何在Kubernetes中暴露服务访问
查看>>
SignalR Core尝鲜
查看>>
11个Visual Studio代码性能分析工具
查看>>
火掌柜iOS端基于CocoaPods的组件二进制化实践
查看>>
从责任界定和问题预警角度 解读全栈溯源对DevOps的价值
查看>>
【mysql的编程专题①】流程控制与其他语法
查看>>
[译] 实例解析 ES6 Proxy 使用场景
查看>>
JavaScript_高程三_01
查看>>
解决 css 浮动后 父元素高度失效问题
查看>>
使用VisualSVN Server搭建SVN版本控制服务器
查看>>
OpenGL ES2 学习教程5——顶点属性
查看>>
谈谈BFC与ie特有属性hasLayout
查看>>
Git 命令速查表
查看>>
Coder Essential之编程语言学习知识点纲要
查看>>