C++ dll的创建和使用

在介绍Dll之前先了解下常见三种函数调用约定。

参考:https://www.cnblogs.com/yejianyong/p/7506465.html

我们使用的VS默认使用的函数调用约定是__cdel,而Windows API默认的调用约定是__stdcall。我们在使用一个dll的接口时,一定要确保你使用接口时的调用约定和接口定义时的调用约定一致。因为不同的调用约定,函数的栈内存释放的方式不同。

然后我们再了解下extern C的作用,参考https://www.cnblogs.com/carsonzhu/p/5272271.html

如果我们使用C++进行程序开发,开发过程中使用到了C语言写的库函数,则我们就需要使用extern C 来修饰,来告诉编译器,这部分代码使用C语言语法进行编译链接。

例如:

#ifdef __cplusplus

extern "C" {

#endif

#include "legacy_C_header.h"

#ifdef __cplusplus

}

#endif

这个就是它允许你在你的C ++代码中使用这个C头文件,因为宏“__cplusplus”将被定义。

下面我们开始学习C++Dll的创建和使用

C++创建的dll既可以给C++工程使用也可以给C#工程使用。

C++导出函数,在DLL中有一张导出表,记录着需要导出的函数,这些函数可供外部程序调用,即这些函数都是该DLL的入口点(类似main函数)。不在导出表中的函数,为该DLL私有的函数,外部程序不能调用它们。

C++工程调用C++导出函数或者导出类

导出函数的几个方法参考https://www.cnblogs.com/findumars/p/8660427.html

在函数声明时,直接使用__declspec(dllexport)声明函数

或者是直接使用def文件指定导出的函数

使用导出函数库时,我们可以直接在VS上配置,指定库目录和动态库对应的lib文件名,以及C/C++常规中的包含目录,该目录指定头文件。

也可以直接在代码中使用#pragma comment,具体语法可以参考https://blog.csdn.net/wfq_1985/article/details/7456591

使用如下:

#pragma comment(lib, "..\\CplusplusDll\\Debug\\CplusplusDll.lib")

当你不知道头文件只知道你使用的函数类型时,则可以使用如下函数:

typedef int(*func)(int, int);

HINSTANCE hInstance = LoadLibrary(L"..\\CplusplusDll\\Debug\\CplusplusDll.dll");

LPCSTR pc = "[email protected]@[email protected]";

func getmax = (func)GetProcAddress(hInstance, pc);

int max = getmax(a, b);

使用微软VS提供的dumpbin –exports xxx.dll 可以查看你的函数名,同时你一定要确保你的调用约定和GetMax函数定义的一致。这里使用的是func的约定使用默认值一般是__cdel,函数GetMax定义的地方也是__cdel。如果是__stdcall则需要显示声明{typedef int(__stdcall*func)(int, int);}

注意,不建议直接使用这种方法对类的成员函数进行调用。

对于C++导出类,C++工程在调用时和导出函数一致,除了不能使用LoadLibrary函数进行动态加载外,VS配置和#progma预编译指令都可以使用。

#include "../CplusplusDll/CMath.h"

#pragma comment(lib, "..\\CplusplusDll\\Debug\\CplusplusDll.lib")

CMath m;

int sum = m.add(5, 6, 7);

对于C#工程,如何调用C++导出函数呢?使用DllImport属性,在System.Runtime.InteropServices命名空间下定义。参考https://www.cnblogs.com/xingboy/p/11158487.html,使用如下

[DllImport(@"CplusplusDll.dll",CallingConvention = CallingConvention.Cdecl,EntryPoint = "[email protected]@[email protected]")]

public extern static int getMax(int a, int b);

int a = getMax(2, 3);

对于非托管的C++类,C#是无法直接使用,但是C#支持托管的C++代码的使用。所以非托管的C++类,可以通过托管类包装,进行导出,C++托管类使用的数据类型必须都是托管的,详情可以以下链接:https://blog.csdn.net/weixin_34167819/article/details/91974250

原文地址:https://www.cnblogs.com/merlinzjl/p/11795857.html

时间: 2024-10-05 06:13:23

C++ dll的创建和使用的相关文章

Delphi中DLL的创建和使用【转】

Delphi中DLL的创建和使用     1.DLL简介:   2.调用DLL:   3.创建DLL:   4.两个技巧:   5.初始化:   6.例外处理.            1.DLL简介     DLL是Dynamic-Link   Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用程序或者其他DLL调用.DLL为应用程序间的资源共享提供了方便,同时也是多语言混合编程的

C#中调用c++的dll具体创建与调用步骤,亲测有效~

使用的工具是VS2010哦~其他工具暂时还没试过 我新建的工程名是my21dll,所以会生成2个同名文件.接下来需要改动的只有画横线的部分 下面是my21dll.h里面的... 下面的1是自动生成的不用动,或者也可以不要,因为只是一个宏而已下面可以做相应修改. 下面的2是自动生成的类,我没用就注释掉了 下面的3是自动生成的一个测试函数,原来函数最前面是extern,记住精髓是要改成EXTERN_C 下面的4是我自己写的一个测试函数,用来求和 下面是my21dll.cpp里面的 号3对应上面号3的

DLL的创建与使用

一.动态链接库(DLL) 动态链接库提供了一种方法,使进程可以调用不属于其执行代码的函数.函数的可执行代码位于一个.dll文件中,该文件包含一个或多个已被编译.链接并使用它们的进程分开存储的函数. 优点: 1.扩展了 应用程序的特性 2.可以使用多种编程语言来编写 3.简化项目的管理 二.依赖项 当某个程序或DLL使用其他DLL或DLL函数时,就会创建依赖项,因此程序就不会再独立了,依赖项如果被破坏,该程序可能出现问题. 三.入口点 在创建DLL时,可以有选择地指定入口点的函数.当进程或线程将它

VS中 DLL的创建及函数导出(参考MSDN)

新建一个DLL工程: 新建 - 项目 - vc++ - win32 - win32控制台应用程序,工程名假设取为 MathFuncsDll 向导中选择DLL,取消预编译头 完成. 此时会有dllmain.cpp, MathFuncsDll.cpp 两个cpp文件及生成的 stdafx.h, targetver.h stdafx.cpp, 后面这三个文件其实是没用的,可以删掉,然后把dllmain.cpp 中的#include "stdafx.h"改成#include <windo

DLL的创建和使用

1 #ifndef MYDLL_H 2 #define MYDLL_H 3 4 #ifdef DLL_IMPLEMENT_ 5 #define DLL_APL __declspec(dllexport) 6 #else 7 #define DLL_API __declspec(dllimport) 8 #endif 9 10 //导出函数接口 11 extern "C" 12 { 13 int DLL_API add(const int &a, const int &b

DLL 的创建及调用,效果及源码

源码地址:http://files.cnblogs.com/tiankaileo/DLL.rar

DLL中创建对话框之加载资源【备忘一】

HINSTANCE hinst = GetModuleHandle(0);        HRSRC hr = ::FindResource(hinst, MAKEINTRESOURCE(IDD_MEMDIALOG), RT_DIALOG);        LoadResource(hinst, hr);        m_hWnd=CreateDialog(hinst, MAKEINTRESOURCE(IDD_MEMDIALOG), 0, DlgProc);

VS2010 C++创建DLL步骤

VS2010中 C++创建DLL图解 一.DLL的创建 创建项目: Win32->Win32项目,名称:MyDLL 选择DLL (D) ->完成. 1.新建头文件testdll.htestdll.h代码如下:#ifndef TestDll_H_#define TestDll_H_#ifdef MYLIBDLL#define MYLIBDLL extern "C" _declspec(dllimport) #else#define MYLIBDLL extern "

delphi 创建DLL文件 及其调用和注意事项

首先创建一个DLL文件,项目自带的代码为: library ProjectPnr; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or fu