如何开始使用 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++ 编写的大型项目的链接时间?