如何开始在可视化C++中编写 DLL
How do I get started writing DLLs in visual C++?
正如标题所说,尽管我想我真正的意思是"稍后使用它们"。
设置的设置
我遵循了这个答案:
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
要在新的解决方案中使用该功能,我相信我必须
- 在新解决方案中启动项目
- 将 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();
?
需要 .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来构建可执行文件,只需运行它即可。
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Python ctypes:不会按预期加载 dll
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL