C++ 如何在VC++;当创建DLL时?

C++ 如何在VC++;当创建DLL时?,c++,dll,C++,Dll,我在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 definit

我在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)吗


通常,VisualStudioC++生成的DLL输入函数通常不会被修改,因为它包含允许Windows操作系统将DLL加载到内存并初始化它的基础。 我读到的所有内容都表明,DLLMain()应该尽可能少地执行初始化操作,以避免Windows加载DLL和初始化使各种DLL入口点可用所需的所有操作时出现严重问题

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

因此,如果您使其他DLL方法(通常在其他源文件中)可移植,那么您可以删除DLL main,将您想要移植到的任何操作系统特定的动态加载初始化放在它的位置,并保留源文件的其余部分

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

也看到这个

还有这个


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

因此,如果您使其他DLL方法(通常在其他源文件中)可移植,那么您可以删除DLL main,将您想要移植到的任何操作系统特定的动态加载初始化放在它的位置,并保留源文件的其余部分

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

也看到这个

还有这个


看看这个。

为什么要让操作系统特定的DLL入口点可移植?我希望剩下的代码可以移植,这就是为什么我停用了语言扩展。。。可能不是正确的方法?Windows DLL与Linux动态库之间会有特定的代码,这是不可避免的。隔离那些特定的代码片段并允许它们使用操作系统特定的功能,但要保持大部分代码的可移植性。因此,如果上面的代码是dllmain.cpp中的全部内容,则可以将其删除。如果没有任何作用,你不需要提供一个DllMain。听起来不错。。。我认为它是由VC++默认创建的。非常感谢!为什么你要让一个操作系统特定的DLL入口点可移植?我希望剩下的代码是可移植的,这就是为什么我停用了语言扩展。。。可能不是正确的方法?Windows DLL与Linux动态库之间会有特定的代码,这是不可避免的。隔离那些特定的代码片段并允许它们使用操作系统特定的功能,但要保持大部分代码的可移植性。因此,如果上面的代码是dllmain.cpp中的全部内容,则可以将其删除。如果没有任何作用,你不需要提供一个DllMain。听起来不错。。。我认为它是由VC++默认创建的。非常感谢!谢谢你,Richard,我知道DLLMain不是强制性的;没有它有什么缺点吗?如果它根本不起作用的话?@GL770,我个人花了太多时间调试一些非标准的东西,所以这些天我对待Visual Studio就像对待我妻子一样。我只是说是的,亲爱的,按照别人告诉我的去做,除非真的有很好的理由去做。保留样板并没有什么坏处,以后可能会有用,所以我把它放在里面,尽量不要弄乱它;没有它有什么缺点吗?如果它根本不起作用的话?@GL770,我个人花了太多时间调试一些非标准的东西,所以这些天我对待Visual Studio就像对待我妻子一样。我只是说是的,亲爱的,按照别人告诉我的去做,除非真的有很好的理由去做。保留样板文件并没有什么坏处,以后可能会有用,所以我把它放在里面,尽量不要弄乱它。