【问题标题】:What is the difference between a "Win32 Project", "CLR Empty Project", and "Empty Project" templates in Visual Studio?Visual Studio 中的“Win32 项目”、“CLR 空项目”和“空项目”模板有什么区别?
【发布时间】:2010-09-17 22:04:50
【问题描述】:
我最近刚刚在今年夏天开始使用 Visual Studio,主要从事与 CUDA 和 OpenCV 相关的项目。在此之前,我一直在使用 Makefiles 和 NVIDIA 的 common.mk makefile 在 Linux 上为 CUDA 进行开发。
所以我的问题如下:我一生都无法弄清楚一些不同的项目模板之间的区别是什么。我知道我必须使用 Visual C++ 选项的常规选项卡中的“空项目”,但这更多的是反复试验,而不是真正知道发生了什么......
【问题讨论】:
标签:
visual-c++
winapi
visual-studio-2010
【解决方案1】:
如果您想最终获得一个通常使用裸 WinAPI 的 DLL 或 Win32 应用程序,则使用 Win32 项目。公共语言运行时 (CLR) 项目用于创建 C++/CLI 项目,即使用 C++/CLI 以 .NET 平台为目标。
项目之间的主要区别在于 Visual Studio 在预创建文件方面提供的内容。例如,一个窗口化的 Win32 应用程序(当您选择 Win32 项目时得到的,而不是 DLL)是使用资源文件(菜单、加速器、图标等)和一些默认代码来创建和注册窗口类以及实例化这个窗口。
【解决方案2】:
创建 Win32 项目时,链接器子系统设置为 Windows。创建空的 C 或 C++ 项目时,子系统设置为控制台。同样,Win32 项目设置中的入口点需要 WinMain 或 DllMain,而控制台需要 int main。 CLR 允许您混合使用通常不鼓励使用的 C++ 和 .NET。
Windows 子系统可以针对可执行文件、dll、库或驱动程序/本机 (sys) 文件。控制台子系统以控制台二进制可执行文件为目标。 WinMain 通常在使用CreateWindowEx API 创建实际的 Window 应用程序、建立消息回调和插入消息处理程序循环时使用。
带有int main 的控制台子系统也可以创建一个窗口应用程序,但最好使用 WinMain。
Dll 空项目将子系统设置为 Windows,并将编译输出设置为 (.dll) 以及 DllMain/APIENTRY 的入口点,静态库将与 Dll 执行相同的操作,只是它将设置输出到 (.lib)。
将项目设置为 Native 子系统将需要 Windows 驱动程序开发工具包来编译驱动程序。