我已经阅读了十几个页面,解释了如何将Win32控制台应用程序转换为Windows应用程序,该应用程序将在不短暂打开和关闭控制台窗口的情况下运行,但我太初衷了,无法让它工作。
例如,在VC2010中,我在此处描述的项目属性中进行了两处更改:
convert a console app to a windows app
并将Main更改为WinMain,但当然从编译器获得了错误消息。
在其他页面之后,我还尝试创建一个控制台应用程序,然后在Win32应用程序向导中,将应用程序类型更改为Windows应用程序,但我无法弄清楚下一步该做什么。我已经尝试将int更改为int CALLBACK WinMain,但当然这也不起作用。
有没有人可以帮助初学者这个?以下是我认为我的代码编辑的相关部分:完整的代码,对于任何想知道这是什么的人来说,就在这里:
https://www.dropbox.com/s/1h8x1k2zv0lc5d1/vPasteCPlus.txt?dl=0
#include <stdafx.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <codecvt> // for wstring_convert
#include <locale> // for codecvt_byname
using namespace std;
// helper to get path to this application
string ExePath() {
char buffer[MAX_PATH];
GetModuleFileNameA( NULL, buffer, MAX_PATH );
string::size_type pos = string( buffer ).find_last_of( "\\/" );
return string( buffer ).substr( 0, pos);
}
int main(int argc, char* argv[])
{
// get the command-line argument if any, and do various things
}
再次,为这个初学者问题道歉。我使用C ++的唯一经验是编写控制台应用程序,我们将非常感激地收到任何建议。
答案 0 :(得分:0)
如果这是一个Visual Studio项目(如<stdafx.h>
强烈指示的那样),那么:
mainCRTStartup
(调用标准main
)。但你确定你想要这个吗?
听起来你想要的是Windows 服务?
答案 1 :(得分:0)
好的,所以你打开了Visual Studio。你有Solution Explorer
(如果不是,View
- &gt; Solution Explorer
)。
首先,要创建Windows应用程序,您应该将入口点从main()
(C ++标准)更改为Windows特定的WinMain()
。有关more detailed description的信息,请参见msdn。因此,您正在将main()
更改为下一个(从文档中复制粘贴):
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow)
{
return 0;
}
当然,您应该包含<Windows.h>
,因为Windows提供了自己的API来处理系统(例如LPSTR
类型)。简而言之,您完成了编译程序所需的所有编译器。您可以构建解决方案(Build
- &gt; Build Solution
)...这会导致linker
错误:
error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
同样,编译器完成了您想要的所有操作并将源文件编译为.obj
,但是,因为您的项目是针对控制台应用程序配置的,linker
需要控制台应用程序的标准入口点 - {{1在我们的例子中它无法找到(解决)它,因为我们将main更改为WinMain。为了让链接器满意,你应该告诉它:
main
Solution Explorer
:
Properties
- &gt; Configuration Properties
- &gt; Linker
并将System
设置为SubSystem
:
尝试再次构建您的应用程序瞧 - 您已经没有链接器错误,因为您的链接器现在知道它需要生成Windows应用程序并找到Windows入口点:Windows
!
关于这一个:
WinMain()
您应该使用// get the command-line argument if any, and do various things
的{{1}}参数。但要小心,如果你运行你的程序(例如so.exe),就像这样:
lpCmdLine
WinMain()
是so.exe arg1 arg2
字符串。有很多内容可以帮助您将lpCmdLine
和arg1 arg2
作为数组,例如main()arg1
(arg2
),但您可以探索:
和相关内容(例如Windows上的wchar_t)