C ++(VC2010)帮助将控制台应用程序转换为隐藏的Windows应用程序?

时间:2015-06-30 14:52:19

标签: c++ console-application

我已经阅读了十几个页面,解释了如何将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 ++的唯一经验是编写控制台应用程序,我们将非常感激地收到任何建议。

2 个答案:

答案 0 :(得分:0)

如果这是一个Visual Studio项目(如<stdafx.h>强烈指示的那样),那么:

  • 在链接器设置中将子系统设置为Windows。
  • 将切入点设置为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 ExplorerSolution Explorer Properties
  • 转到Properties - &gt; Configuration Properties - &gt; Linker并将System设置为SubSystemLinker's SubSystem configuration

尝试再次构建您的应用程序瞧 - 您已经没有链接器错误,因为您的链接器现在知道它需要生成Windows应用程序并找到Windows入口点:Windows

关于这一个:

WinMain()

您应该使用// get the command-line argument if any, and do various things 的{​​{1}}参数。但要小心,如果你运行你的程序(例如so.exe),就像这样:

lpCmdLine

WinMain()so.exe arg1 arg2 字符串。有很多内容可以帮助您将lpCmdLinearg1 arg2作为数组,例如main()arg1arg2),但您可以探索:

和相关内容(例如Windows上的wchar_t)