一,简介

__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 中标记要导出的函数或变量,后者用于在客户端应用程序中标记要导入的函数。

04-20 14:44