如何开始使用 Visual C++ 编写 DLL?

Posted

技术标签:

【中文标题】如何开始使用 Visual C++ 编写 DLL?【英文标题】:How do I get started writing DLLs in visual C++? 【发布时间】:2013-09-06 09:30:30 【问题描述】:

正如标题所说,虽然我猜我真正的意思是“以后再使用它们。”

设置

我已经遵循了这个答案:

https://***.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 DllTest.pdb

当我通过 dumpbin 运行 DllTest.dll 时,我发现这一行:

1    0 00001000 DisplayHelloFromMyDLL = _DisplayHelloFromMyDLL

使用 DLL

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

    在新解决方案中启动项目 将DLL的位置添加到项目下 属性 配置属性 链接器 一般 其他库目录 在下面添加 .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();?)

【问题讨论】:

【参考方案1】:

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

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

如果您想创建一个 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 接口的一部分。如果类都没有,那么它只是一个应该在同一个项目中定义的类。

【讨论】:

@medivh 然后制作一个。它所需要的只是:void DisplayHelloFromMyDLL(); 新项目中的编译器不知道DisplayHelloFromMyDLL是什么,你需要提供这个信息。 .h 文件不是必需的,严格来说,但很有用。文件 .h .lib 和 .dll 通常组合在一起。 @medivh,我更新了答案。未解决,因为在头文件的函数声明中缺少extern "C" 不相关,但是,不要忘记标题中的包含保护 @medivh,我添加了解释。它不是 .NET,但在使用 DLL 处理 .def 文件无法处理的情况时使用。【参考方案2】:

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

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

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

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

【讨论】:

以上是关于如何开始使用 Visual C++ 编写 DLL?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Lisp:如何调用外部 C++ DLL 中的函数

如何在 Visual C++ 中制作 dll,我想用 C# 进行交互

如何在 Visual C++ 中使用 python

如何减少用本机 Visual C++ 编写的大型项目的链接时间?

Visual C++:插件 DLL 使用的第 3 方 DLL 的位置?

尝试使用 Visual Studio 2010 调试 dll (C++) 时出现错误消息