求助(VC++) 隐藏Console窗口无效

[逝去的100~~ 2014/10/07 20: 20]

程序想要实现控制台窗口的隐藏,但是窗口每次运行总会弹出来。为什么呢?

代码如下:

// Mini.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"

#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>
#include <windows.h>
//#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

#define MAX_SER 10
#define HOST_PATH 256
#define HOSTNAME_SIZE HOST_PATH
#define MasterPort 999						//定义监听的端口

char hostName[MAX_PATH]={0};
unsigned short maxService;
unsigned short port;

void Service(LPVOID lpv);
int LoopControl(SOCKET llistenfd,int isMultiTasking);
void initial();
int initSockets(void);											//初始化Windows Socket

int main(int argc, char * argv[])
{
	SOCKET listenFd,acceptfd;
	struct sockaddr_in serverAddr,clientAddr;
	int nSize=sizeof(sockaddr_in);
	int err;

	PROCESS_INFORMATION ProcessInfo;
	STARTUPINFO StartupInfo;
	char szCMDPath[255];

	initial();
	initSockets();

	//分配内存资源
	ZeroMemory(&ProcessInfo, sizeof(PROCESS_INFORMATION));
	ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
	GetEnvironmentVariable("COMSPEC",szCMDPath,sizeof(szCMDPath));

	//GetStartupInfo(&StartupInfo);
	//创建socket
	//listenFd=socket(PF_INET,SOCK_STREAM,0);
	listenFd=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);

	if(listenFd==INVALID_SOCKET){
		printf("error:out of socket resource \n");
		return 1;
	}

	//bind本机的端口
	serverAddr.sin_family=AF_INET;															//协议类型是INET
	serverAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);										//本机IP
	serverAddr.sin_port=htons(MasterPort);													//绑定端口为5054

	err=bind(listenFd,(const struct sockaddr *)&serverAddr,sizeof(serverAddr));
	if(err==INVALID_SOCKET){
		printf("error: unable to bind socket \n");
		return 1;
	}

	//listen 监听端口
	err=listen(listenFd,3);
	if(err==INVALID_SOCKET){
		printf("error: listen socket failed \n");
		return 1;
	}
	printf("listen......");

	acceptfd=accept(listenFd,(struct sockaddr *)&clientAddr,&nSize);			//接收客户连接的准备

	//配置隐藏窗口结构体
	StartupInfo.cb=sizeof(STARTUPINFO);
	StartupInfo.wShowWindow=SW_HIDE;
	StartupInfo.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
	//StartupInfo.cbReserved2=0;
	//StartupInfo.lpReserved2=NULL;
	StartupInfo.hStdInput=(HANDLE)listenFd;
	StartupInfo.hStdOutput=(HANDLE)listenFd;
	StartupInfo.hStdError=(HANDLE)listenFd;

	//创建匿名管道
	CreateProcess(NULL,szCMDPath,NULL,NULL,TRUE,CREATE_NO_WINDOW,NULL,NULL,&StartupInfo,&ProcessInfo);
	WaitForSingleObject(ProcessInfo.hProcess,INFINITE);

	CloseHandle(ProcessInfo.hProcess);
	CloseHandle(ProcessInfo.hThread);

	printf("server is down \n");

	//关闭进程句柄
	closesocket(listenFd);
	closesocket(acceptfd);
	WSACleanup();

	return 0;
}

void initial()
{
	maxService=3;
	port=5054;
}

 /*
  *	Winsock服务初始化
 */
int initSockets(void)
{
	WSADATA wsaData;
	WORD sockVersion;                                              //typedef unsigned short WORD(16)
	int err;
	sockVersion=MAKEWORD(2,2);
	err=WSAStartup(sockVersion,&wsaData);
	if(err!=0)
	{
		printf("error %d :winsock not avaliable\n",err);
	}
	printf("environemnt invaild success.....\n");
	return 0;
}

想法是通过CreateProcess来实现窗口的隐藏,添加以下的代码,确实实现了窗口的隐藏,但不是本意:

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

运行的效果图如下:

看了其他的介绍说:要达到DOS程序运行时不显示窗口的效果,有两种可能:一是创建该DOS进程时,指定不创建窗口;二是隐藏该DOS进程有窗口。我这里都明确指定了啊。

Help

时间: 2024-10-18 20:23:17

求助(VC++) 隐藏Console窗口无效的相关文章

隐藏Console窗口无效(续1)

[2014/10/19  23:57 ] :通过端口远程控制主机.运行程序之后,程序自动开放本机的999端口,其他电脑便可以通过999端口对本机操作. 程序中使用的到的命令: telnet测试端口命令: telnet IP 端口 或者 telnet 域名 端口(若telnet不是内部命令,使用打开或关闭windows功能,启动Telnet服务) netstat 测试开放的端口号 使用ipconfig控制网络连接的一个命令行工具.它的主要功用,包括用来显示现时网络连接的设置(/all参数),或通过

隐藏 console 窗口

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"wmainCRTStartup\"" )  //   设置入口地址 在默认情况下链接器看到/subsystem下是windows选项的时候,它会自动寻找WinMain或者wWinMain         但我们强制指定入口地址,这样运行程序的时候默认的console窗口就会隐藏!         上面是在代码中使用#pragma指令

在控制台程序中隐藏控制台窗口

大家都知道,当编写一个win32 console application时,当运行此类程序的时候默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只想在程序中运行一段功能代码,不希望显示这个console窗口,让代码执行完毕之后程序自动退出. 下面就介绍一下,如何隐藏win32 console application的console窗口 因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译器的链接开关选项(也就是linker选项). 首先我们来看一下linke

去掉 CONSOLE 窗口(转)

建立一个win32 console application的话,linker的/subsystem选项应该为CONSOLE,可以在VC开发环境的project->setting->link->project option中看到! 接下来我们再看看应用程序是如何运行的!我们知道用VC编写的程序,运行的时候是需要 C\C++运行库支持的.当我们运行一个C/C++程序的时候链接器会首先寻找应用程序的启动函数,例如:如果你建立了一个console程序的话,编译器得链接开关会是以下这种形式/sub

c# 控制台应用程序怎么隐藏黑窗口

class Program     {         [DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]         static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);         [DllImport("user32.dll", EntryPoint = "Find

【代码备忘】VC判断自己窗口的另一种方法

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 FindWindow就不说了,这说 的是另一种:GetProp 代码也差不多: 查询... HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD); while (::IsWindow(hWndPrevious)) { if (::GetProp(hWndPrevious, _FLAG)) { if (::IsI

bat批处理文件运行时隐藏cmd窗口

想让bat运行时隐藏cmd窗口,最好的方法是使用vbs文件实现, 1.新建一个文本文档,改名为123.vbs,编辑内容: set ws=WScript.CreateObject("WScript.Shell") ws.Run "yy.bat",0 yy.bat是同目录下的批处理文件.双击123.vbs,即可运行批处理文件,但没有cmd窗口弹出. 缺点:这种方法可以隐藏cmd窗口,但不能隐藏bat中打开的第三方窗口.如yy.bat的内容为:WinRAR.exe x  

WinForm------弹出MessageBox窗口的同时隐藏当前窗口

private void Btn_OK_Click(object sender, EventArgs e) { this.Hide(); //隐藏当前窗口 MessageBox.Show("添加成功!"); this.Close(); //关闭当前窗口 }

Qt设置窗体标题栏隐藏和窗口是否有任务栏图标

//设置窗体标题栏隐藏和窗口是否有任务栏图标 this->setWindowFlags(Qt::FramelessWindowHint|Qt::Tool ); 版权声明:本文为博主原创文章,未经博主允许不得转载.