zoukankan      html  css  js  c++  java
  • 求助(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						//定义监听的port
    
    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 
    ");
    		return 1;		
    	}
    
    	//bind本机的port
    	serverAddr.sin_family=AF_INET;															//协议类型是INET
    	serverAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);										//本机IP
    	serverAddr.sin_port=htons(MasterPort);													//绑定port为5054
    
    	err=bind(listenFd,(const struct sockaddr *)&serverAddr,sizeof(serverAddr));			
    	if(err==INVALID_SOCKET){
    		printf("error: unable to bind socket 
    ");
    		return 1;
    	}
    	
    	//listen 监听port
    	err=listen(listenFd,3);
    	if(err==INVALID_SOCKET){
    		printf("error: listen socket failed 
    ");
    		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 
    ");
    
    	//关闭进程句柄
    	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
    ",err);
    	}
    	printf("environemnt invaild success.....
    ");
    	return 0;
    }
    

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

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

        执行的效果图例如以下:



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

        Help






  • 相关阅读:
    网益云——冲刺博客0
    网益云——软件工程之现场编程实战
    2020福州大学软件工程实践个人总结
    2020福州大学软件工程实践结对编程作业二
    福州大学软件工程实践个人编程作业
    2020软工第一次作业
    C. Present(二分 + 扫描线)
    P1287 盒子与球
    错排
    Codeforces 1323 D. Present (思维)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4180176.html
Copyright © 2011-2022 走看看