1

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

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

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)吗?

非常感谢

4

1 回答 1

1

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

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

你会注意到有很多 Windows API 的东西和定义,其他的很少。

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

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

另请参阅有关 DLLMain() 的 MSDN 文章

还有这个DLL 教程

并在修改 DLLMain() 时看到此警告。

于 2013-09-29T19:11:03.657 回答