• 在vc中怎么调用exe文件并传递参数


    1.调用SHELL
    HINSTANCE ShellExecute( HWND hwnd,
        LPCTSTR lpOperation,
        LPCTSTR lpFile,
        LPCTSTR lpParameters,
        LPCTSTR lpDirectory,
        INT nShowCmd
    );
    2.创建一个新的进程。
    BOOL CreateProcess(
      LPCTSTR lpApplicationName,
      LPTSTR lpCommandLine,
      LPSECURITY_ATTRIBUTES lpProcessAttributes,
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      BOOL bInheritHandles,
      DWORD dwCreationFlags,
      LPVOID lpEnvironment,
      LPCTSTR lpCurrentDirectory,
      LPSTARTUPINFO lpStartupInfo,(welcomebbs)
      LPPROCESS_INFORMATION lpProcessInformation
    );
    具体参数说明请参照MSDN,另外这是WINDOWS系统原生的API,与用不用VC无关。





    VC++ 调用EXE文件,同时对EXE程序赋输入参数(welcomebbs)
    ::ShellExecute(NULL, "open", pszPName, "参数1 参数2 参数3", NULL, SW_SHOW);





    VC 如何跟据所配制的参数,动态生成EXE文件

    一个软件上 有一个按钮和一个文本框 ,文本框里输入“你好”,点按钮,就生成一个exe文件,运行它就弹出一个MessageBox("你好");

    需要2个程序
    程序A 程序设计如下:
    程序A 运行后 读取自身的最后10个字节,然后MessageBox
    程序B 设计如下:
    把 程序A 作为资源 放到程序B中
    点击按钮时候,把 资源拷贝到内存,对这个资源追加10个字节,根据 文本框的内容填充这10个字节,然后 把内存中的资源 写成exe文件。
    这是生成定制木马的一贯做法



    如何在程序中调用exe文件

    1.   如何在vc程序中调用exe文件 ShellExecute(this->m_hWnd,"open","notepad.exe", "c:\\scandisk.log","",SW_SHOW );
    用创建独立子进程的方法。
           也可以不独立,下面的代码创建的子进程是独立的。
    BOOL ret; PROCESS_INFORMATION pi;
    STARTUPINFO si;
    si.cb = sizeof(si);
    si.wShowWindow = SW_SHOWNORMAL;
    ret = CreateProcess(_T("c:\xx.exe"),NULL,NULL,FALSE,0, NORMAL_PRIORITY_CLASS,NULL,NULL,&si,π);
    if (ret){ CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess); }

    2.   学习如何在程序中调用.exe文件
        System.Diagnostics.Process proc = new System.Diagnostics.Process(); //程序名称
        proc.StartInfo.FileName = "mt3000.exe"; //参数
        proc.StartInfo.Arguments = "/p1 /b38400 /fstock /mr"; //隐藏
        proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //执行
        proc.Start(); WinExec("calc.exe",SW_SHOW);//调用计算器
        ShellExec(NULL,"open","calc.exe",NULL,NULL,SW_SHOW);//同上
        CreateProcess...//参数比较烦,懒得写


    3.    关于在一个程序中调用另一个程序的exe
          这两天在做音频识别的程序中,想将一个音频识别的程序加进我的大程序中。 但是在加音频程序进来的时候,有很多的问题,无法加进去。迫于无奈,只得在大程序的音频识别一块调用音频识别的小程序的exe文件,效果也不错。我觉得以后也可以借鉴。
           以下是调别的程序的exe文件的小代码:
    SHELLEXECUTEINFO ShExecInfo = {0};
    ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = NULL;
    ShExecInfo.lpFile = "E:\\SimpleDict\\Debug\\simpledict.exe";//别的程序的exe文件
    Info.lpParameters = "";
    ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow = SW_SHOW;
    ShExecInfo.hInstApp = NULL;
    ShellExecuteEx(&ShExecInfo);
    WaitForSingleObject(ShExecInfo.hProcess,INFINITE);//执行完别的程序的exe文件后,返回主程序。

    4.    C++程序中调用exe可执行文件
           当项目比较大的时候,通常会分开来开发,如果分开的部分只是一些函数或类,整合的时候 就可以使用静态库或动态库。但如果分开的是一个exe文件,整合的时候,就要通过调用exe文件来使用。尤其是当第三方软件是一个用c语言编写的exe文件时,更是需要如此。
           最近在我所开发的LCDS系统当中就碰到了这样的问题。他需要调用一个分类器来处理数据,而手头上的分类器是经典的C4.5决策树分类器,它是用c语言写的,没有.h头文件,生成的是一个exe文件,通过在命令行执行main函数来处理数据。如果想把其改成静态库或动态库,因为没有头文件,改写后似乎不好调用其函数,因此考虑直接调用其生成的exe文件。可考虑的方法有:
          1.使用system函数      
          2.使用execl或execv函数         
          3.使用WinExec函数     
          4.使用CreateProcess函数
          5.使用ShellExecuteEx函数
          system函数和execl、execv函数不能控制程序窗口是否显示,我要的效果是不显示该exe程序的窗口,所以这两种方法不予考虑。WinExec函数不好控制主程序来等该exe程序的结束,所以放弃。CreateProcess函数是新建一个进程,所以,你必须人为地控制该进程的生死,不如ShellExecuteEx方便,所以最终我选择的是ShellExecuteEx函数。
          程序如下:
    SHELLEXECUTEINFO ShExecInfo = {0};
    ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = _T("open");
    ShExecInfo.lpFile = _T("c4.5.exe");
    ShExecInfo.lpParameters = _T("-f train");
    ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_HIDE;
    ShExecInfo.hInstApp = NULL;
    ShellExecuteEx(&ShExecInfo);
    WaitCursorBegin();
    WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
    WaitCursorEnd();
    比如c:\notpad.exe 可以这么写(比如按钮按下) winexec('c:\notpad.exe',1); 这样就行了
    (3)ShellExecute()也行
    (4)winexec('C:\WINNT\system32\notepad.exe',0)  参数1:.exe文件全路径名 参数2: 控制参数

    5.    关于在VC中调用其它EXE
          三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,     ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
    WinExec 两个参数,前一个指定路径,后一个指定显示方式。
    ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
    CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。
           三个SDK函数( WinExec、ShellExec、CrateProcess )的语法:

         WinExec 这个函数最简单,只有两个参数,原型如下:
    UINT WinExec( LPCSTR lpCmdLine, // 命令路径
    UINT uCmdShow // 显示方式 ;
    使用方法如下:
    WinExec("Notepad.exe", SW_SHOW); // 打开记事本
    WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe
           需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的窗体,但是已经被加到任务列表里了。

         ShellExecute 原型如下:
    HINSTANCE ShellExecute( HWND hwnd, //父窗口句柄
    LPCTSTR lpOperation, //操作, 打开方式
    "edit","explore","open","find","print","NULL" LPCTSTR lpFile, //文件名,前面可加路径
    LPCTSTR lpParameters, //参数
    LPCTSTR lpDirectory, //默认文件夹

        INT nShowCmd //显示方式 ); 使用方法如下:
    ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打开C:\Test.txt 文件
    ShellExecute(NULL, "open", "iexplore.exe","http://www.welcomebbs.com",/ NULL, NULL, SW_SHOWNORMAL); // 打开网页www.welcomebbs.com
    ShellExecute(NULL,"explore", "D:\\C++",NULL,NULL,SW_SHOWNORMAL); // 打开目录D:\C++
    ShellExecute(NULL,"print","C:\\Test.txt",NULL,NULL, SW_HIDE); // 打印文件C:\Test.txt
    ShellExecute不支持定向输出。

        CreateProcess (welcomebbs)原型如下:
    BOOL CreateProcess( LPCTSTR lpApplicationName, //执行程序名
    LPTSTR lpCommandLine, // 参数行
    //下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性
    LPSECURITY_ATTRIBUTES lpProcessAttributes, //
    process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, //
    thread security attributes BOOL bInheritHandles, // 继承标志
    DWORD dwCreationFlags, // 创建标志
    LPVOID lpEnvironment, // 环境变量
    LPCTSTR lpCurrentDirectory, // 运行该进程的初始目录
    LPSTARTUPINFO lpStartupInfo, // 用于在创建子进程时设置各种属性
    LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息

    使用方法如下:
    PROCESS_INFORMATION pi;
    STARTUPINFO si;
    memset(&si,0,sizeof(si));
    si.cb=sizeof(si);
    si.wShowWindow=SW_SHOW;
    si.dwFlags=STARTF_USESHOWWINDOW;
    bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,π);
          可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!

    关于三个SDK函数: WinExec, ShellExecute,CreateProcess (welcomebbs)的注意
    1、定义头文件 在头文件stdafx.h中必须定义以下两个头文件:
    #include <shlobj.h> // 可替换为 windows.h
    #include <shellapi.h> 如果定义了头文件 #include <windows.h>的话就不必定义 #include <shlobj.h>了,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。

    2、定义路径 C++中所表示的路径要用 " \\ "而不是平常所用的" \ ",所以以上三个函数表示路径都为: Disk:\\Directory\\...\\File name WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL);
    bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,π);

    分享知识是一种快乐也是一种进步========转载请注明出处===========
  • 相关阅读:
    MySQL与Oracle 差异比较之七其它
    MySQL与Oracle 差异比较之七用户权限
    MySQL与Oracle 差异比较之六触发器
    MySQL与Oracle 差异比较之五存储过程&Function
    MySQL与Oracle 差异比较之四条件循环语句
    MySQL与Oracle 差异比较之三函数
    MySQL与Oracle 差异比较之二基本语法
    MySQL与Oracle 差异比较之一数据类型
    Nginx、fastCGI、php-fpm关系梳理
    RTSP服务器之————rtsp-server(轻量级RTSP / RTP流媒体服务器)
  • 原文地址:https://www.cnblogs.com/haoyuanyuan/p/2881952.html
Copyright © 2020-2023  润新知