dll库“__declspec”属性关键字总结,dllexport,dllimport
一,简介
__declspec 是在 Windows 平台上用于控制导出和导入符号的属性关键字,在 C/C++ 中经常用于 DLL 开发。
__declspec(dllexport) 和 __declspec(dllimport) 是其常见用法,用于在编写 DLL 时标记函数或变量的可见性。
二,介绍
2.1 __declspec(dllexport)
- 在编写 DLL 时用于标记函数或变量,表示它们应该被导出,以便其他模块可以访问。
- 用于将函数或变量从 DLL 中导出,使其可供外部使用。
- 在函数或变量声明之前使用,告诉编译器将其放入导出表中。
- 可以与 extern “C” 一起使用以确保按照 C 语言的命名规则导出。
示例:
#include <Windows.h>
extern "C" __declspec(dllexport) void HelloWorld() {
MessageBox(NULL, "Hello from DLL!", "Message", MB_ICONINFORMATION);
}
extern “C” __declspec(dllexport) void HelloWorld() 这行代码是在 C++ 中定义一个函数,并使用了两个关键字来修饰函数的声明:
1,extern “C”:
- extern “C” 是 C++ 中的语法,用于指定采用 C 语言的命名和调用约定。
- 这个修饰符告诉编译器,函数的名称应该按照 C 语言的命名规则进行处理,这样可以确保函数在链接时使用 C 标准的调用约定。
- 这在编写 DLL 时特别有用,因为 C 语言调用约定是最常见的。
2,__declspec(dllexport):
- __declspec(dllexport) 是 Windows 平台上的扩展属性关键字,在 C/C++ 中用于标记函数或变量,表示它们应该被导出,以便其他模块可以访问。
- 这个关键字告诉编译器,这个函数将会被放入 DLL 的导出表中,从而使得其他程序可以调用这个函数。
综上所述,extern “C” __declspec(dllexport) 这段代码用于定义一个被导出的函数,并确保它的命名和调用约定符合 C 语言的标准,以便其他模块可以正确地访问和调用这个函数。
2.2 __declspec(dllimport):
- 在编写客户端应用程序时用于标记函数或变量,表示它们应该从 DLL 中导入。
- 用于告知编译器在链接时从 DLL 中获取函数或变量的地址。
- 在函数或变量声明之前使用,告诉编译器这些函数或变量是从外部 DLL 中导入的。
示例:
using System;
using System.Runtime.InteropServices;
public class Example {
[DllImport("user32.dll")]
public static extern int MessageBox(int hWnd, string text, string caption, int type);
public static void Main() {
MessageBox(0, "Hello World!", "Message", 0);
}
}
在这段代码示例中,[DllImport(“user32.dll”)] 是 C# 中的属性,用于指示编译器在运行时将指定的函数从外部的 user32.dll 动态链接库(DLL)中加载并调用。
具体含义如下:
DllImport 属性:
- DllImport 是 System.Runtime.InteropServices
命名空间中的属性,用于告诉运行时系统去加载并调用指定的非托管函数,这些函数通常存在于 DLL 中。 - [DllImport(“user32.dll”)] 指示了要调用的函数位于名为 user32.dll 的 Windows 用户界面 DLL
中。 - 在这个示例中,我们通过 DllImport 来调用 MessageBox 函数,它是 Windows API 中用于显示消息框的函数。
因此,这段代码的目的是从 user32.dll 中导入 MessageBox 函数,使得 C# 中的 Example 类可以调用这个非托管的 Windows API 函数,从而在应用程序中显示消息框。
三,总结
__declspec(dllexport) 和 DllImport 通常一起使用,前者用于在 DLL 中标记要导出的函数或变量,后者用于在客户端应用程序中标记要导入的函数。