Winapi Visual C-Win32 APP-如何在不打开命令提示窗口的情况下使用system()的系统调用?

Winapi Visual C-Win32 APP-如何在不打开命令提示窗口的情况下使用system()的系统调用?,winapi,visual-c++,command-prompt,Winapi,Visual C++,Command Prompt,我是VC的新手++ 我通过默认模板构建了一个简单的Win32应用程序。 当我运行它时,它会显示一个带有菜单栏的普通窗口 我在InitInstance函数中添加了一个执行curl操作的系统调用: BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = C

我是VC的新手++ 我通过默认模板构建了一个简单的Win32应用程序。 当我运行它时,它会显示一个带有菜单栏的普通窗口

我在InitInstance函数中添加了一个执行curl操作的系统调用:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

   HWND hWnd;
   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);

   UpdateWindow(hWnd);

   //EDITED THIS WILL CREATE A FILE.HTML

   system("curl www.google.co.in > file.html");


   return TRUE;
}
一切正常

但问题是,每当我调用系统时,它都会在控制台窗口中打开。 我希望它是一个不显示命令提示符窗口的隐藏进程


帮我解决这个问题。

nCmdShow
设置为
SW\u HIDE(0)
(ShowWindow)。这样,您将在不使用cmd提示符的情况下运行它

nCmdShow
设置为
SW\u HIDE(0)
(ShowWindow)。这样,您将在没有cmd提示符的情况下运行它。
系统
功能始终显示一个控制台窗口。如果想要隐藏控制台窗口,则需要直接调用
CreateProcess
。然后,您可以请求一个
分离的\u进程
,该进程在没有控制台的情况下运行。请注意,
CreateProcess
不会等待进程退出,因此您需要自己执行等待。

系统功能始终显示一个控制台窗口。如果想要隐藏控制台窗口,则需要直接调用
CreateProcess
。然后,您可以请求一个
分离的\u进程
,该进程在没有控制台的情况下运行。请注意,
CreateProcess
不会等待进程退出,因此您需要自己执行等待。

我将代码放在单独的函数中,url和文件名作为参数

    #include <tchar.h>
    #include <windows.h>

    BOOL DownloadWithoutConsole(TCHAR* pszURI, TCHAR* pszFileName)
    {
    //here we will calculate our command line length in bytes
    DWORD dwLen = (lstrlen(pszURI) + lstrlen(pszFileName) + 20)*sizeof(TCHAR);
    //memory allocation for the command line
    TCHAR* pszCmdLine = (TCHAR*)HeapAlloc(GetProcessHeap(), 0, dwLen);
    ZeroMemory(pszCmdLine, dwLen);
    //making command line
    _stprintf_s(pszCmdLine,dwLen/sizeof(TCHAR), TEXT("cmd /c curl %s > %s"), pszURI, pszFileName);

    //preparing arguments for CreateProcess
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);

    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(pi));

    //creating new process 
    BOOL bResult = CreateProcess(NULL, pszCmdLine, NULL, NULL, FALSE, CREATE_NO_WINDOW,
    NULL, NULL, &si, &pi);

    if(bResult)
    {
    //waiting for process termination
    WaitForSingleObject(pi.hProcess, INFINITE);
    //cleanup
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    }
    //freeing memory
    HeapFree(GetProcessHeap(), 0, pszCmdLine);
    return(bResult);
    }

   int __cdecl _tmain(void)
   {
      DownloadWithoutConsole(TEXT("stackoverflow.com"), TEXT("test.txt"));
      return(0);
   }
#包括
#包括
BOOL下载不带控制台(TCHAR*pszURI,TCHAR*pszFileName)
{
//这里我们将以字节为单位计算命令行长度
德沃德·德伦=(伊斯特伦(普苏黎世)+伊斯特伦(普苏黎世文件名)+20)*斯齐奥夫(特查尔);
//命令行的内存分配
TCHAR*pszCmdLine=(TCHAR*)HeapAlloc(GetProcessHeap(),0,dwLen);
零存储器(pszCmdLine,dwLen);
//生成命令行
_stprintf_s(pszCmdLine、dwLen/sizeof(TCHAR)、TEXT(“cmd/c curl%s>%s”)、pszURI、pszFileName;
//为CreateProcess准备参数
STARTUPINFO si;
零内存(&si,sizeof(si));
si.cb=sizeof(si);
处理信息;
零内存(&pi,sizeof(pi));
//创建新流程
BOOL bResult=CreateProcess(NULL,pszCmdLine,NULL,NULL,FALSE,创建否窗口,
NULL、NULL、si和pi);
if(bResult)
{
//等待进程终止
WaitForSingleObject(pi.hProcess,无限);
//清理
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
//释放内存
HeapFree(GetProcessHeap(),0,pszCmdLine);
返回(bResult);
}
内部cdecl tmain(无效)
{
下载不带控制台(文本(“stackoverflow.com”)、文本(“test.txt”);
返回(0);
}

我将代码放在单独的函数中,url和文件名作为参数

    #include <tchar.h>
    #include <windows.h>

    BOOL DownloadWithoutConsole(TCHAR* pszURI, TCHAR* pszFileName)
    {
    //here we will calculate our command line length in bytes
    DWORD dwLen = (lstrlen(pszURI) + lstrlen(pszFileName) + 20)*sizeof(TCHAR);
    //memory allocation for the command line
    TCHAR* pszCmdLine = (TCHAR*)HeapAlloc(GetProcessHeap(), 0, dwLen);
    ZeroMemory(pszCmdLine, dwLen);
    //making command line
    _stprintf_s(pszCmdLine,dwLen/sizeof(TCHAR), TEXT("cmd /c curl %s > %s"), pszURI, pszFileName);

    //preparing arguments for CreateProcess
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);

    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(pi));

    //creating new process 
    BOOL bResult = CreateProcess(NULL, pszCmdLine, NULL, NULL, FALSE, CREATE_NO_WINDOW,
    NULL, NULL, &si, &pi);

    if(bResult)
    {
    //waiting for process termination
    WaitForSingleObject(pi.hProcess, INFINITE);
    //cleanup
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    }
    //freeing memory
    HeapFree(GetProcessHeap(), 0, pszCmdLine);
    return(bResult);
    }

   int __cdecl _tmain(void)
   {
      DownloadWithoutConsole(TEXT("stackoverflow.com"), TEXT("test.txt"));
      return(0);
   }
#包括
#包括
BOOL下载不带控制台(TCHAR*pszURI,TCHAR*pszFileName)
{
//这里我们将以字节为单位计算命令行长度
德沃德·德伦=(伊斯特伦(普苏黎世)+伊斯特伦(普苏黎世文件名)+20)*斯齐奥夫(特查尔);
//命令行的内存分配
TCHAR*pszCmdLine=(TCHAR*)HeapAlloc(GetProcessHeap(),0,dwLen);
零存储器(pszCmdLine,dwLen);
//生成命令行
_stprintf_s(pszCmdLine、dwLen/sizeof(TCHAR)、TEXT(“cmd/c curl%s>%s”)、pszURI、pszFileName;
//为CreateProcess准备参数
STARTUPINFO si;
零内存(&si,sizeof(si));
si.cb=sizeof(si);
处理信息;
零内存(&pi,sizeof(pi));
//创建新流程
BOOL bResult=CreateProcess(NULL,pszCmdLine,NULL,NULL,FALSE,创建否窗口,
NULL、NULL、si和pi);
if(bResult)
{
//等待进程终止
WaitForSingleObject(pi.hProcess,无限);
//清理
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
//释放内存
HeapFree(GetProcessHeap(),0,pszCmdLine);
返回(bResult);
}
内部cdecl tmain(无效)
{
下载不带控制台(文本(“stackoverflow.com”)、文本(“test.txt”);
返回(0);
}

它隐藏Win32应用程序的原始窗口,并在调用system()时仍显示命令提示窗口。我只想隐藏调用system()时弹出的命令提示窗口。它隐藏Win32应用程序的原始窗口,并在调用system()时仍显示命令提示窗口。我只想隐藏调用system()时弹出的命令提示窗口。谢谢。您能进一步解释CreateProcess()对于这种类型的exe的工作原理吗?如何在CreateProcess()中设置参数?你能为这个例子给出这个函数的一个片段吗?如果你有什么不明白的地方,你可以去阅读文档并发布一个新的问题。(或者搜索一下,看看是否有人已经问过了。)谢谢。您能进一步解释CreateProcess()对于这种类型的exe的工作原理吗?如何在CreateProcess()中设置参数?你能为这个例子给出这个函数的一个片段吗?如果你有什么不明白的地方,你可以去阅读文档并发布一个新的问题。(或者搜索一下,看看是否有人已经问过了。)我尝试了这个功能。我已经在函数中传递了这两个参数。当我运行应用程序时,它显示光标正忙。。有时它会回到正常状态,我想这意味着隐藏的过程结束了。但是当我看到我的项目文件夹时,那里没有创建任何文件。这意味着什么?您正在使用文件的完整路径吗?例如,在没有控制台的情况下下载(“google.com”,“c:\\mydata.txt”)不,我没有使用完整路径。我正在当前目录下下载是否需要提供完整路径?我对源代码进行了一点修改,现在它正确地下载了当前可执行目录下的html页面。我尝试了此功能。我已经在函数中传递了这两个参数。当我运行应用程序时,它显示光标正忙。。萨默蒂之后