- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当您在 Visual Studio 中创建 Win32 项目并且没有定义 WinMain
函数时,您会遇到编译错误:
Error 1 error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
如何设计/实现此 API 设置以确保用户永远无法在不实现 WinMain
的情况下创建 Win32 应用程序?我正在创建一个 API,我还想在用户没有正确使用 API 或没有实现基本功能时放入编译错误。
我想使用类似东西的一个例子是:用户必须实现一个 App
类(基类或继承类)。因此,如果我能以某种方式在编译时检测到 App
类尚未实现,我也可以抛出编译错误。
WinAPI的实现是不是简单到没有实现的前向声明函数(保证编译失败)?即,
// Forward declaration with, intentionally, no function implementation
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow);
最佳答案
当启动一个程序时,操作系统加载模块然后调用初始化代码。哪个符号带有可以更改的初始化代码(入口点),但通常它类似于 winMainCRTStartup
或 mainCRTStartup
(如果我没记错的话)。现在,该函数由编译器供应商提供并链接到您的程序中。它首先调用初始化代码,例如全局变量的构造函数,然后委托(delegate)给各种形式的 main()
或 winMain()
。这也是编译失败的原因:由于始终包含初始化代码(通过其外部可见的入口点)并且它始终调用相应的主函数,因此缺少主函数将导致链接器错误。
请注意,简单的声明是不够的(你可以尝试过),你必须确保它声明的函数被实际使用。
关于您产生错误的方法,我认为它不可行,至少在编译时不可行。如果可能的话,我也会尽量避免使用库的这种严格限制。为什么您的应用程序中的库不应该有多个这样的类或多个用途?如果约束确实有意义,请考虑使用像许多窗口库一样的技术,这些库提供注册用户编写的实例的全局函数。然后,您可以向您的代码添加相应的检查,assert()
实例已注册。
关于c++ - WinAPI如何在未实现WinMain时确保编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35715866/
WinMain() 实际上是如何调用的?我记得专业黑客使用的一个函数,它以(某物)开头,看起来像 __startupWinMain()。 问题是,我有一个 Win32 EXE(使用 /SUBSYSTE
WinMain 的第三个参数以未处理的字符串形式提供命令行。虽然这对于允许您处理通配符的扩展和其他问题可能很有用,但是否有可能在 Win32 API 中的某个地方潜伏着获得通常的 C argc、arg
所以我有一个 .cpp 文件,其中包含例如函数:drawLine()、drawSquare() 和 main()。在 main() 中,我想调用使用 WinApi 创建窗口的函数(从其他文件),然后调
我刚开始学习使用 C++ 进行 Windows 编程。我有一个疯狂的印象,即 win32 编程是基于调用 Windows 函数并向它们发送参数以及从它们发送参数。就像,当你想创建窗口时,你调用一些处理
我的问题是参数只检索每个参数中的第一个字母,为此我不知道为什么..有人可以详细说明吗? #include #include int WINAPI WinMain(HINSTANCE hInstan
这个问题在这里已经有了答案: what does the function returns with in C program , in case if there is no return sta
总而言之,我有一个关于 WinMain 的问题。在VS2010中,_tWinMain的返回值为“(int) msg.wParam”。我不明白为什么它会返回 wParam。 wParam 是什么?我
我正在努力让我的代码尽可能完美,并且我已经清除了所有错误和(其他)警告。我只剩下这两个: Warning C28253 Inconsistent annotation for 'WinMain':
我刚开始使用 C++,但遇到了无法修复的错误。 这是我到目前为止的所有代码(甚至无法让 hello world 工作): #include "stdafx.h" #include int WINAP
这可能是有史以来最简单的win32程序.. #include int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmdLine,
我有几个非常简单的问题。我在网上搜索了它们,但找到了不同的答案,所以我只想知道该遵循哪个。 所以,首先,我相信 WinMain 不是 C 或 C++ 标准,而只是由 Microsoft 添加来确定何时
你能给我解释一下通常写在 WinMain() 函数末尾的这条语句的意义吗: return (int) msg.wParam; 我习惯于以 return 0; 结束我的控制台应用程序,这对 Win
假设我在一个项目中构建了一个名为 App1 的应用程序,其中包含很多类。我决定要构建另一个名为 App2 的项目,并且我想使用那些相同的类,因此我决定将 App1 转换为一个 lib 文件。我必须删除
我正在 Windows 上开发应用程序,但我也想支持其他平台(我编写的大部分代码都是平台无关的)。不管怎样,我想为了开发的缘故我想让事情简单化(也许我在这种方法上太天真了)所以我的 main.cpp
有什么方法可以在类中隐藏 WinMain() 函数吗?谢谢。 最佳答案 不,没有。一个更好的问题是“你为什么想要”?在 Java 或 C# 中,main 函数是静态类成员,不是因为它更好或更干净,而是
我在想,是否可以使用 win32 程序的入口点 - WinMain - 作为类方法?例如; class cApp { public: cApp(); ~cApp(); cGuiM
我正在学习 C++ 和针对 Windows API 的编程。我的第一个“Hello Windows API”程序只显示一个 MessageBox()。但是,我有一些问题,我正在阅读的书没有解释。 首先
为什么这个程序可以正确显示消息框,但没有设置错误级别? int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTAN
在MFC中,wWinMain定义在appmodul.cpp中。据我所知,该文件内置于 mfc90ud.dll 中。但是,当我运行我的应用程序时,调用堆栈显示 MyApplication.exe!wWi
我删除了 IDE 生成的 _tmain() 方法,因为我发现在添加我的 WinMain 条目后有两个入口点没有意义。是的,这是我的第一个 C++ 应用程序,我是新手,但请保持友好。 这就是我得到的:
我是一名优秀的程序员,十分优秀!