创建Win32 DLL的步骤和使用

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

说明 这里的DLL只针对 Win32 DLL (非MFC)

一. 创建DLL步骤


1. 创建Win32 DLL


next, next,...


2. 修改一下DLL 的主函数


BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		break;
	case DLL_PROCESS_DETACH:
		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	}
	return TRUE;
}


3. 以下面的形式添加你想要导出的函数


// *.h
#pragma once
#ifdef __cplusplus
extern "C"{
#endif
/////////////////////////////////////////

int __stdcall TestDll(int nA, int nB);

/////////////////////////////////////////
#ifdef __cplusplus
}
#endif 


//*.cpp
#ifdef __cplusplus
extern "C"{
#endif
/////////////////////////////////////////

int __stdcall TestDll(int nA, int nB)
{
	return nA + nB;
}

/////////////////////////////////////////
#ifdef __cplusplus
}
#endif

4. 添加一个def文件


LIBRARY "MyDLL"
EXPORTS
	TestDll @ 1

在vs2010中使用.def文件导出函数时, 要在工程属性|链接器|输入|模块定义文件中, 加入自定义的.def文件名.
编译好dll后, 可用vs的命令提示查看导出函数  dumpbin -exports dllnames


5. 编译


你可以按照默认的, 也可以按照自己喜欢的(例如debug版的dll是*d.dll)



二. 使用DLL步骤


1. 创建一个测试工程, 把上面步骤的dll,lib和.h文件放到对应的位置


2. 包含对应的.h文件, 添加语句 #pragma comment(lib, "*.lib") 
// 这里的*.lib是对应DLL的lib名称或详细路径 (这方法叫做静态加载),
// 静态加载时, 可以在 项目|***属性|链接器|输入|附加依赖项中写入对应的 *.lib 来
// 代替写 #pragma comment(lib, "*.lib")

// *.lib文件的路径是基于工程的工作目录而定的, 而不是该cpp文件的.
// 看个人习惯吧, 各有各的好处.
//


3. 编译即可.


4. 你也可以使用LoadLibrary, GetProcAddress等API来调用DLL(这叫做动态加载).
静态加载需要lib和头文件, 而动态加载不需要lib, 但要知道导出函数的名称和参数, 也就是要知道函数的声明.
    
5. 动态加载的步骤:


typedef int (__stdcall *LPFUNCTestDll)(int, int);

HMODULE hSdt = LoadLibrary(_T("*.dll"));;
if(0 == hSdt)	// 加载失败
{
	return;
}

LPFUNCTestDll TestDll = (LPFUNCTestDll)GetProcAddress(hSdt,"TestDll");

TestDll(1, 2);// 调用

FreeLibrary(hSdt);

   
三. 其他说明


1. extern "C"的作用 (C一定要大写)
       默认c++编译器会对名字作修饰,有诸如@YAH,主要包括参数的类型和参数大小的信息。其中一个重要的原因就是重载函数,如果两个重载函数都需要导出,那么就要用修饰名来区分了。 
关于具体原因参照<<核心编程>>, 网上关于修饰名的介绍也很多.

      不使用extern "C"的话, 在出现重载函数时, 非C++开发的程序有可能找不到DLL中的导出函数, 如果你dll中没有重载函数的话, 我觉得不使用也行, 个人认为加入比较好.

      如果你的客户端,就是倒入dll的应用程序不用c++方式调用的话,那么就找不到这个函数了你能保证你的客户一定是用c++编译吗  如果它是vb的应用程序呢??   所以在dll里面,加上extern"C" 
   
      extern "C"的作用是,使编译器按照c的方式生成函数名, c的方式实际的函数名和你写的一样. 如果没有这个, 则按照c++的方式生成函数名, 这样实际的函数名(LoadLibrary方式GetProcAddress传入的函数名)和你写得函数名不一样, 这样你用LoadLibrary, GetProcAddress这种方式调用dll就不成功. 但是用引入库的方式调用, 则编译器自动转换函数名, 所以总是没有问题.


2. 除了使用.def文件导出函数外, 可以使用__declspec(dllexport)和__declspec(dllimport)
步骤如下:


a. *.h
// *.h
#pragma once
#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C"{
#endif
/////////////////////////////////////////

DECLDIR int __stdcall TestDll(int nA, int nB);

/////////////////////////////////////////
#ifdef __cplusplus
}
#endif


b. *.cpp
/////////////////////////////////////
#define DLL_EXPORT

#include "*.h"
#ifdef __cplusplus
extern "C"{
#endif
/////////////////////////////////////////

DECLDIR int __stdcall TestDll(int nA, int nB)
{
	return nA + nB;
}
/////////////////////////////////////////
#ifdef __cplusplus
}
#endif

3. 该方法我不是很常用, 但我记得有一次我写了一个DLL给其他开发语言调用使用def文件的就调用成功, 而使用__declspec(dllexport)和__declspec(dllimport)却不行, 具体原因也不太清楚了, 现在还是比较多使用.def文件导出函数.



vs2010 C++创建使用动态链接库(dll) 一、用C++创建动态链接库项目:  1、打开Microsoft Visual Studio 2010,选择File->New->Project。  2、在NewProject中选择Installed Templates->Visual C++->Win32。  3、选择Win32 Console Application,设置名称:simpledll,设置解决方案名:zdddll。  4、单 阅读详情

相关推荐

如何使用Visual Studio 2012的C++编写DLL

一、创建 新建项目,选择Win32项目。进入向导,选择DLL,完成。 系统会自动生成stdafx.h、targetver.h、dllmain.cpp、stdafx.cpp、Project.cpp五个文件。 二、添加预编译命令 点击stdafx.h,在最下方添加如下代码: #ifndef MY_DLL_FLAG #define MY_DLL_FLAG #ifdef LIBDLL #

u013453059的专栏 1851

创建使用一个Win32 DLL

创建使用一个Win32 DLL 创建使用一个Win32 DLL 创建使用一个Win32 DLL 创建使用一个Win32 DLL

win32动态DLL调用(*.dll)

VC++动态链接库(DLL)编程深入浅出(二)的例子

程序封装打包过程

1 新建工程,选择Win32项目 2 勾选 DLL 、导出符号,完成 3 在工程命名的cpp文件下编写功能函数 在每个功能函数定义行前面添加如 “BUILDDLL_API”的类声明符号,其中“BUILDDLL”为你建立的工程名。 4 在工程名命名的.h文件下声明功能函数 5 编写好后,进行编译,在工程目录下找到生成的.dll.lib文件 到这里动态...

一棵竖柳的博客 1万+

Win32 DLL创建使用

Win32 DLL创建使用 0 创建Win32 DLL 项目 VS新建》项目》Win32项目》确定》下一步》DLL、导出符号》完成 1 导出头文件 A.h #ifdef CHESS_LIB_EXPORTS   #define CHESS_LIB_API __declspec(dllexport)    #else   #define CHESS_LIB_API __declspec(...

C++ 爱好者 make_it_simple888 1952

Win32 dll 的简单创建使用

文章利用vc++6.0简单的创建dll工程,并生成dll文件。同时,在win32 控制台程序中进行了应用。

A_cainiao_A 1717

win32 DLL文件的生成调用

一、Win32 DLL生成调用(一)  函数1.        导出DLL文件[1]      方式1:使用关键字extern “C”_declspec(dllexport)在.h文件中:extern “C” 返回类型 _declspec(dllexport) 函数名(形参);[2]      方式2:使用模块定义文件.def在项目中添加定义文件,代码如下:; FloatCalDLL.def...

程序修行禹 2601

DLL进程的地址空间

DLL进程的地址空间一,MTMD的区别二,显示链接与隐式链接三,DLL进程的地址空间 DLL是Windows开发人员经常使用到的一种技术,比如我们经常会把相同功能的代码封装到一个模块中,然后供其他需要使用该模块的程序共同调用,可以降低代码的复用性,使用起来非常方便;而且,当我们需要对外部提供自己公司的接口时,也会考虑到使用dll,它可以将我们内部实现的代码进行封装保护,而不会暴露给使用者。本...

bajianxiaofendui的博客 1万+

DLL中产生对话框的方法一(Win32 DLL)

DLL中产生对话框的方法一(Win32 DLL)       什么是Dll?      Stands for "Dynamic Link Library." A DLL (.dll) file contains a library of functions and other information that can be accessed by a Windows

wangjieest的专栏 4094

创建调用Win32 DLL

一、生成Win32 DLL (1)创建Win32 DLL工程File->New->Projects->Win32 Dynamic Link Library,在"Project name" 中输入MyDll->OK->An empty DLL project->Finish->OK(2)添加头文件mydll.hFile->new->Files->C/C++ Header File,输入文

人生如棋 7280

DLL使用资源

DLL使用资源(一) 现在最常看见的关于DLL的问题就是如何在DLL使用对话框,这是一个很普遍的关于如何在DLL使用资源的问题。这里我们从Win32 DLLMFC DLL两个方面来分析并解决这个问题。 1.Win32 DLLWin32 DLL使用对话框很简单,你只需要在你的DLL中添加对话框资源,而且可以在对话框上面设置你所需要的控件。然后使用DialogBox或者

wang_harry的专栏 440

在VC中创建DLL文件的方法步骤

在VC中创建DLL文件的方法步骤 今天教大家在VC中创建DLL文件的方法步骤,一起来学习一下,并不是很难的,相信聪明的你一看就会。 一.Win32动态链接库 1.制作的步骤: (1)新建WIN32 Dynamic-link Library工程,工程名为MyDll,选择A sim...

chenqunan3231的博客 58

MFC动态链接库WIN32动态链接库

MFC动态链接库WIN32动态链接库        从这个网址抄过来的,希望主人不要介意http://hi.baidu.com/ecentury/blog/item/06edb20eb3f6c4f536d1229b.html2011-01-06 23:58<br />(1)DLL的构成<br />      每个应用程序都有一个入口函数WinMain,而每个DLL也有一个入口函数DllMain。DLL跟应用程序一样都含有资源、数据段代码段。DLL跟应用程序的差别主要是DLL有符号输入表符号输出表,以方

chinafujianchenyixia的专栏 189

win32 调用 含qt界面的DLL.win32程序

win32 调用 含qt界面的DLL.win32程序,https://blog.csdn.net/libin88211/article/details/38183791

python调用ctypes 调用win32_从Python ctypes加载带有通用Windows平台(UWP)调用win32dll...

我想从Python调用通用Windows平台(UWP)API。我试图通过使用ctypes调用包含调用UWPAPI函数的win32 dll来做到这一点。在总结一下这个过程:Python-&gt;cytpes-&gt;dll-&gt;UWP我一直在调试它。以下是的工作原理:创建win32 dll文件并使用Python ctypes模块生成包含UWP调用win32 dll文件(...

weixin_39609457的博客 616

DLL使用资源(一)

 在DLL使用资源(一)       在CSDN论坛上最常看见的关于DLL的问题就是如何在DLL使用对话框,这是一个很普遍的关于如何在DLL使用资源的问题。这里我们从Win32 DLLMFC DLL两个方面来分析并解决这个问题。1.Win32 DLL       在Win32 DLL使用对话框很简单,你只需要在你的DLL中添加对话框资源,而且可以在对话框上面设置你所需要的

961
上一篇: VS2005工具上面生成时选择Debug和Release 这个怎么没了
下一篇: 图像的灰度化原理和实现
小大小丑
博客等级 码龄18年 483粉丝 425原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值