C++ 德勒曼应该改名吗?
我正在学习DLL,我在中看到了以下段落: 如果您提供自己的入口点,请参阅DllMain函数。名称DllMain是用户定义函数的占位符。必须指定生成DLL时使用的实际名称。有关更多信息,请参阅开发工具附带的文档 在尝试为starter创建一个小dll时,我注意到,如果我使用不同的名称调用我的dll main,C++ 德勒曼应该改名吗?,c++,visual-c++,dll,C++,Visual C++,Dll,我正在学习DLL,我在中看到了以下段落: 如果您提供自己的入口点,请参阅DllMain函数。名称DllMain是用户定义函数的占位符。必须指定生成DLL时使用的实际名称。有关更多信息,请参阅开发工具附带的文档 在尝试为starter创建一个小dll时,我注意到,如果我使用不同的名称调用我的dll main, 没有人叫它 这段话是什么意思?是否真的不调用此函数DllMain 还有别的名字吗?操作系统如何知道调用什么函数?他们的意思是,一段文本,即,DllMain是DLL入口点函数的默认名称 默认名
没有人叫它
这段话是什么意思?是否真的不调用此函数
DllMain
还有别的名字吗?操作系统如何知道调用什么函数?他们的意思是,一段文本,即,
DllMain
是DLL入口点函数的默认名称
默认名称
意味着,除非您以其他方式配置编译器,否则编译器将假定名为DllMain
的函数应该是入口点
<>这意味着<<强>可以配置< /强>编译器,将任何其他名称视为入口点。通常,编译器将其视为某种类型的/commandlineparam
或-commandlineparam
。见文件
编辑:哦,我刚刚注意到你正在使用MSVC。以下是这一部分:
他们的意思是,一段文本,即
DllMain
是DLL入口点函数的默认名称
默认名称
意味着,除非您以其他方式配置编译器,否则编译器将假定名为DllMain
的函数应该是入口点
<>这意味着<<强>可以配置< /强>编译器,将任何其他名称视为入口点。通常,编译器将其视为某种类型的/commandlineparam
或-commandlineparam
。见文件
编辑:哦,我刚刚注意到你正在使用MSVC。以下是这一部分: 操作系统如何知道调用什么函数呢 操作系统不知道函数的名称,它知道函数的地址。该地址存储在DLL的PE头中,由编译器/链接器设置。函数的名称由编译器的RTL库指定。无论编译器在加载时使用什么代码来设置DLL的内部结构,该代码都会指定必须在自己的代码中实现的函数名和签名。它可能是
Dllmain()
,可能是DllEntryPoint
,也可能是完全其他的东西。这取决于所使用的编译器和RTL
操作系统如何知道调用什么函数呢
操作系统不知道函数的名称,它知道函数的地址。该地址存储在DLL的PE头中,由编译器/链接器设置。函数的名称由编译器的RTL库指定。无论编译器在加载时使用什么代码来设置DLL的内部结构,该代码都会指定必须在自己的代码中实现的函数名和签名。它可能是
Dllmain()
,可能是DllEntryPoint
,也可能是完全其他的东西。这取决于所使用的编译器和RTL。哦,仅仅因为你可以给它起个别的名字,并不意味着链接器就能读懂你的心思。您需要告诉链接器入口点的名称-否则它将假定它应该是DllMain
,如果它不存在,则DLL将没有入口点。毕竟,入口点是可选的
你的入口点的名称应该通过链接器传递给链接器。哦,仅仅因为你可以给它起个别的名字,并不意味着链接器会读懂你的心思。您需要告诉链接器入口点的名称-否则它将假定它应该是
DllMain
,如果它不存在,则DLL将没有入口点。毕竟,入口点是可选的
您的入口点的名称应通过。相关:我注意到,如果我调用我的DllMain另一个名称,则不会调用它。除非您使用上面的链接器设置来允许,否则它不会。我的建议是只使用
DLLMain
,除非你有很好的理由想做额外的工作(需要额外的链接器设置),就像exe项目中的main或WinMain一样,DLLMain是编译器知道的默认入口函数名。您不需要更改该名称。但是如果必须这样做,请确保编译器知道新的入口函数名。相关:我注意到,如果我调用我的DllMain另一个名称,它就不会被调用。除非您使用上面的链接器设置来允许,否则它不会。我的建议是只使用DLLMain
,除非你有很好的理由想做额外的工作(需要额外的链接器设置),就像exe项目中的main或WinMain一样,DLLMain是编译器知道的默认入口函数名。您不需要更改该名称。但如果必须这样做,请确保编译器知道新的入口函数名。