C++ DLL导出的两种方式和链接的两种方式

第一种 导出方式

extern "C" _declspec(dllexport) int Plus(int x, int y);
extern "C" _declspec(dllexport) int Sub(int x, int y);
extern "C" _declspec(dllexport) int Mul(int x, int y);
extern "C" _declspec(dllexport) int Div(int x, int y);

int Plus(int x, int y)
{
    return x + y;
}

int Sub(int x, int y)
{
    return x - y;
}

int Mul(int x, int y)
{
    return x * y;
}

int Div(int x, int y)
{
    return x / y;
}

第二种 导出方式

在项目上添加一个def文件

// def文件里面EXPORTS
Plus @12
Sub @17
Mul @15 NONAME   // (此种方式只导出序号)
Div @16
// CPP文件里面int Plus(int x, int y)
{
    return x + y;
}

int Sub(int x, int y)
{
    return x - y;
}

int Mul(int x, int y)
{
    return x * y;
}

int Div(int x, int y)
{
    return x / y;
}

DLL使用

第一种 隐式链接

// 先把TestDll.lib 和 TestDll.dll放在main.cpp 同一目录下#include <stdio.h>
#pragma comment(lib, "TestDll.lib")

extern "C" _declspec(dllimport) int Plus(int x, int y);
extern "C" _declspec(dllimport) int Sub(int x, int y);
extern "C" _declspec(dllimport) int Mul(int x, int y);
extern "C" _declspec(dllimport) int Div(int x, int y);

int main()
{
    int d = Plus(2, 3);
    printf("%d", d);
    getchar();
    return 0;
}

第二种 显示链接

#include <stdio.h>
#include <windows.h>

int main()
{
    // 定义函数指针
    typedef int(*lpPlus)(int, int);
    typedef int(*lpSub)(int, int);
    typedef int(*lpMul)(int, int);
    typedef int(*lpDiv)(int, int);
    // 获取模块句柄
    HMODULE hMoudle = LoadLibrary(L"TestDll.dll");
    // 获取函数地址
    lpPlus MyPlus = (lpPlus)GetProcAddress(hMoudle, "Plus");
    lpSub MySub = (lpSub)GetProcAddress(hMoudle, "Sub");
    lpMul MyMul = (lpMul)GetProcAddress(hMoudle, "Mul");
    lpDiv Mydiv = (lpDiv)GetProcAddress(hMoudle, "Div");
    // 调用
    int d = MyPlus(2, 3);
    printf("%d", d);
    getchar();
    return 0;
}

原文地址:https://www.cnblogs.com/duxie/p/10859314.html

时间: 2024-10-05 04:43:41

C++ DLL导出的两种方式和链接的两种方式的相关文章

MFC DLL 导出函数的定义方式

一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解.要学习,这篇文章先总结DLL的导出函数的方法. 1. 首先说一下如何建立一个普通的DLL工程!(以VS2008为例) New Project  -->  Win32 标签 --> 填写工程名称 -->  点 OK,进入创建 Widzard  -->  Next 进入第二步 -->  Application

Android两种为ViewPager+Fragment添加Tab的方式

在Android开发中ViewPager的使用是非常广泛的,而它不仅仅能够实现简单的开始引导页,还可以结合Fragment并添加Tab作为选项卡或为显示大批量页面实现强大的顺畅滑动 下面介绍两种为ViewPager+Fragment添加Tab的方式: 第一种: 在MainActivity布局中定义一个ViewPager 在MainActivity中声明ViewPager并实现它的Adapter继承自FragmentPagerAdapter 首先需要通过重写有参的构造方法来获取FragmentMa

Android---10---TextView添加链接的两种方式

在TextView中显示带Html文本 显示丰富的内容:URL.字体大小.颜色等 在TextView中预定了一些类似于HTML的标签,通过标签可以使TextView控件显示不同颜色.大小.字体的文字 <font> 设置颜色和字体 <big> 设置大号 <small> 设置小号 <i>.<b> 斜体.粗体 <a> 链接地址 <img> 图片 使用这些标签可以用Html.fromHtml方法将这些标签的字符串转换成Charse

dll的概念、dll导出类

随笔- 64  文章- 0  评论- 37 dll的概念.dll导出类(转) 1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与动态链接库都是共享代码的方式.静态链接库把最后的指令都包含在最终生成的EXE文件中了:动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件. (2)静态链接库中不能再

C# 遍历DLL导出函数

C#怎样去遍历一个由C++或E语言编写的本地DLL导出函数呢 只是在这里我建议对PE一无所知的人 你也许应先补补这方面的知识.我不知道为什么PE方面的 应用在C#中怎么这么少.我查阅过相关 C#的知识大概仅仅见一个人写过关于PE的应用 还仅仅是从PE信息中推断运行文件是X86还是X64方式 编译,难道C#程序猿真的非常差 真的仅仅能会点Asp.Net / MVC?想想看雪论坛那些玩inline-asm / inline-hook的牛牛 真是感到有非常大差距 只是任何语言 在我看来事实上都差点儿相

DLL的概念、dll导出类(转贴)

1. DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用.静态链接库与动态链接库的区别:(1)静态链接库与动态链接库都是共享代码的方式.静态链接库把最后的指令都包含在最终生成的EXE文件中了:动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件.(2) 静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库.

Dll 导出函数那些破事

经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系. VC++支持两种语言:即C/C++,这也是造成DLL导出函数差异的根源 我们用VS2008新建个DLL工程,工程名为“TestDLL” 把默认的源文件后缀 .CPP改为.C(C文件) 输入测试代码如下: 01 int _stdcall MyFunction(int iVariant) 02 { 03 return 0; 0

C++ DLL导出类 知识大全

在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架.在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发. 参考了很多这方面的资料,对DLL有一个基本全面的了解.有一个问题让我有点困惑,普通的导入导出C++类的方式都是使用_declspec(dllexport) /_declspec(dllimport)来导入导出类,但是在公司的开发中我们没有导入导出,而是定义了一些只有纯虚函数的抽象类,然后定义了一个工厂类,将这个工厂类注册到框架的服务中心中,使用时从服务中心拿到这

dll导出函数(摘)

目录 1.DLL中导出函数的方式有两种 2.查看dll导出函数; 3.__declspec(dllexport)和.def文件的区别. 1.DLL中导出函数的方式有两种: 方式一:在每一个函数声明前添加标识符: __declspec(dllexport) 比如:__declspec(dllexport) int add(int a, int b){return a+b;} 在这种方式下,如果调用该dll的是一个c++程序(同一个编译器的版本)是没有问题的.但是,如果调用该dll是一个其它语言的程