c++ - 如何在创建 DLL 时禁用 VC++ 中的语言扩展?

标签 c++ dll

我在 VC++ 中创建 DLL 时遇到问题。我不想使用语言扩展来获得可移植代码。但是,默认使用 stdafx.h 似乎需要语言扩展。

我正在尝试重写 dllmain.cpp 以移除对 stdafx.h 的依赖。我首先删除了预编译 header 的使用。我仍然遇到相同的编译错误:

c:\program files (x86)\microsoft sdks\windows\v7.0a\include\driverspecs.h(142): error C2008: '$' : unexpected in macro definition
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\driverspecs.h(294): error C2008: '$' : unexpected in macro definition
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\driverspecs.h(295): warning C4005: '__' : macro redefinition
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\driverspecs.h(142) : see previous definition of '__'

到目前为止,我的 dllmain.cpp 看起来像这样:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "WTypes.h"

#define DLL_PROCESS_ATTACH   1    
#define DLL_THREAD_ATTACH    2    
#define DLL_THREAD_DETACH    3    
#define DLL_PROCESS_DETACH   0    
typedef void far            *LPVOID;

int WINAPI DllMain( HINSTANCE hModule,
                       int  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return 1;
}

我在这里使用的方法是否正确?我可以摆脱对 WTypes.h 的最后依赖 (HINSTANCE) 吗?

非常感谢

最佳答案

通常不会以任何方式修改 Visual Studio C++ 生成的 DLL 入口函数,因为它包含允许 Windows 操作系统将 DLL 加载到内存中并对其进行初始化的基础。

我读到的所有内容都表明 DLLMain() 应该尽可能少地执行包括初始化在内的操作,以避免 Windows 加载 DLL 和初始化使各种 DLL 入口点可用所需的一切的严重问题。

您会注意到有很多 Windows API 内容和定义,其他很少。

因此,如果您使其余的 DLL 方法(通常在其他源文件中可移植),您可能能够撕掉 DLL 主程序,将您想要移植到的任何特定于操作系统的动态加载初始化放在它并保留其余的源代码。

DLLMain 实际上只是一个具有 Windows 操作系统特定入口点的地方,Windows 需要它来加载您的 DLL 并更正各种函数偏移量和地址。

另见 MSDN article on DLLMain() .

还有这个DLL tutorial .

看看这个caution on modifying DLLMain() .

关于c++ - 如何在创建 DLL 时禁用 VC++ 中的语言扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19081874/

相关文章:

C++ 令人困惑的宏

c++ - 点结构声明

c# - 从 C 调用 C# DLL;连接问题

c++ - 找不到可执行文件,请指定一个

C++ - LoadLibrary() 是否实际链接到库?

c++ - 覆盖 QIODevice 子类中的 readData 返回不正确的结果

c++ - For 循环性能差异,以及编译器优化

c++ - Operator() 的部分特化

C#应用程序崩溃原因

visual-c++ - 查询 : Integrating libsndfile with Visual Studio 2010 C++. 错误 : libsndfile. dll 找不到