您的位置:首页 > 编程语言 > C语言/C++

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

2014-10-07 20:19 387 查看
    [逝去的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息