如何开始在可视化C++中编写 DLL

How do I get started writing DLLs in visual C++?

本文关键字:C++ DLL 可视化 何开始 开始      更新时间:2023-10-16

正如标题所说,尽管我想我真正的意思是"稍后使用它们"。

设置的设置

我遵循了这个答案:

https://stackoverflow.com/a/13219631/696407

这创建了一个非常简单的DLL

#include <stdio.h>
extern "C"
{
    __declspec(dllexport) void DisplayHelloFromMyDLL()
    {
        printf ("Hello DLL.n");
    }
}

我现在编译了一个 dll 以供发布:

  • DllTest.dll
  • DllTest.exp
  • DllTest.lib
  • Dll测试.pdb

当我通过 dumpbin 运行 DllTest.dll 时,我发现以下行:

1    0 00001000 DisplayHelloFromMyDLL = _DisplayHelloFromMyDLL

使用 DLL

要在新的解决方案中使用该功能,我相信我必须

  1. 在新解决方案中启动项目
  2. 将 DLL 的位置添加到项目下
    • 性能
      • 配置属性
        • 连接
          • 常规
            • 其他库目录
  3. 将 .lib 文件添加到
    • 性能
      • 配置属性
        • 连接
          • 输入
            • 其他依赖项

而且,在那里添加了 .lib 后,下一步是......hvæt?

我现在的代码:

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
    while(1)
    {
        DisplayHelloFromMyDLL();
    }
    return 0;
}

但这行不通。

编辑:我想"不起作用"是模糊的。函数Error: identifier "DisplayHelloFromMyDLL" is undefined

(附带问题:我的函数是叫DisplayHelloFromMyDLL();还是_DisplayHelloFromMyDLL();

编译器

需要 .h(与 #include 一起使用,并将文件夹添加到 .h 文件作为 C/C++> 常规>附加包含目录的配置>属性的相对路径)。除了用于链接器的 .lib 之外,您还需要.dll才能实际运行测试应用程序。

编辑:您可以制作两种类型的DLL。首先是类似 C 的 DLL,其函数具有签名,就好像它们是用 C 而不是用 C++ 编写的一样。所有Windows DLL(user32.dll,shell32.dll,version.dll)都是这样构建的。另一个是C++DLL,其函数是类的一部分。 MFC 和标准C++库就是这样。

如果要创建C++ DLL,则必须将属于接口的所有类声明为 DLL 项目中的__declspec(dllexport)类,并在使用 DLL 的所有项目中__declspec(dllimport)。通常使用相同的文件,但具有根据一个或另一个定义的宏。如果从 Visual Studio 项目模板创建 DLL,您将看到此代码。

您的情况实际上是更简单的情况,因为您需要类似 C 的 DLL。您不必摆弄这些__declspec垃圾,但是您需要在DLL项目中增加一个.def文件。这应该是 .def 文件的内容:

LIBRARY MyApi
EXPORTS
    DisplayHelloFromMyDLL

您的头文件(.h 文件)应如下所示:

#pragma once
#ifndef HELLO_DLL_INCLUDED
#define HELLO_DLL_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
void DisplayHelloFromMyDLL();
#ifdef __cplusplus
};
#endif
#endif // HELLO_DLL_INCLUDED

__declspec(dllimport)告诉编译器此函数(或类)是在其他地方定义的,链接器将找到它并链接它。 __declspec(dllexport)告诉编译器(和链接器)此函数(或类)应导出并成为 DLL 接口的一部分。如果类没有这些,那么它只是一个应该在同一项目中定义的类。

要使用你的.dll你需要两样东西,一个头文件和一个.lib。

头文件是为了让编译器知道某处有一个名为 DisplayHelloFromMyDLL() 的函数。在这一点上,它在哪里并不重要,只要你告诉编译器它在某个地方。链接器将处理 where 位。

.lib 文件用于链接器。它告诉链接器DisplayHelloFromMyDLL()存在于.dll中,并且(在您的情况下)dll 的名称是 DllTest.dll。当程序启动时,Windows 加载程序将使用此信息将.dll加载到进程中,并将执行任何地址修正,以确保在应用程序中调用DisplayHelloFromMyDLL()调用.dll中的函数。

您实际上不需要.dll来构建可执行文件,只需运行它即可。