如何编写可在不打开窗口或控制台的情况下运行的C / C ++应用程序?
答案 0 :(得分:39)
编写WinMain程序时,会自动将/ SUBSYSTEM选项作为编译器中的窗口。 (假设您使用Visual Studio)。对于任何其他编译器,可能存在类似的选项,但标志名称可能不同。
这会导致编译器以可执行文件格式(PE format)创建一个条目,该条目将可执行文件标记为Windows可执行文件。
在可执行文件中出现此信息后,启动程序的系统加载程序会将您的二进制文件视为Windows可执行文件,而不是控制台程序,因此它不会导致控制台窗口在运行时自动打开。
但是Windows程序如果不需要就不需要创建任何窗口,就像你在任务栏中看到的那些程序和服务一样,但是没有看到任何相应的窗口。如果您创建一个窗口但是选择不显示它,也会发生这种情况。
要实现这一切,您需要做的就是,
#include <Windows.h>
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int cmdShow)
{
/* do your stuff here. If you return from this function the program ends */
}
您需要WinMain本身的原因是,一旦您将子系统标记为Windows,链接器就会假定您的入口点函数(在程序加载后调用并且C Run TIme库初始化)将是WinMain而不是main 。如果你没有在这样的程序中提供WinMain,你将在链接过程中得到一个未解决的符号错误。
答案 1 :(得分:14)
在Windows中:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// <-- Program logic here
return 0;
}
请务必使用Adam Mitz所述的/ SUBSYSTEM链接器开关。
在其他平台上:
int main(int argc, char**argv)
{
// <-- Program logic here
return 0;
}
答案 2 :(得分:4)
如果您需要在没有控制台或窗口的情况下连续运行您的程序,您可能会发现有用的deamon on *NIX或services on Windows,这个.NET示例如果您需要简单的win32只需google一点点样本。
由于您的问题标记为win32,我认为服务更适合您。
答案 3 :(得分:1)
在将子系统设置为windows后(在user17224中建议)的Visual Studio Express 2010中,或者将main更改为WinMain(由user17224和Brian R. Bondy建议),可以在属性中将entry函数设置为main ,链接器,高级,入口点:只需在文本框中键入main。
答案 4 :(得分:0)
使用Visual Studio向导创建Win32应用程序。但是不要创建窗口,即删除窗口创建功能。 或者,我们可以创建Win Service应用程序。
答案 5 :(得分:0)
这还将处理消息:
#include <windows.h>
#include <stdio.h>
int CALLBACK WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
MSG msg;
DWORD curThreadId;
curThreadId = GetCurrentThreadId();
// Send messages to self:
PostThreadMessage(curThreadId, WM_USER, 1, 2);
PostThreadMessage(curThreadId, WM_USER+1, 3, 4);
PostThreadMessage(curThreadId, WM_USER+2, 5, 6);
PostThreadMessage(curThreadId, WM_USER+3, 7, 8);
PostThreadMessage(curThreadId, WM_QUIT, 9, 10);
while (GetMessage(&msg, NULL, 0, 0)) {
printf("message: %d; wParam: %d; lParam: %d\n", msg.message, msg.wParam, msg.lParam);
}
return (int) msg.wParam;
}
答案 6 :(得分:-8)
如果您使用 MSVC 或 Visual Studio ,只需使用新的项目向导,然后选择控制台应用