我写了个程序,基于MFC框架,调用了另一个dos程序,带管道的。
现在程序运行没问题,我想把那个dos程序嵌入到我的主程序中,怎么实现呢?

解决方案 »

  1.   

    直接用ShellExecute等来调用dos程序
      

  2.   

    你都提到管道了,在你的MFC程序中用管道把你的dos重定向。
      

  3.   

    把dos程序编译出来的obj连接到mfc中, 虽然我没做过, 但以前公司里的dos下的函数库就是这么干的.
      

  4.   

    各位,那个dos程序我只有exe的,没有源代码
      

  5.   

    各位老大们,不要一句winexec啊,详细说说:)
    另外我问的问题不是调用那个dos程序,而是怎样把那个调用的dos程序融合到我的exe文件里面去!
    当然用winrar做个脚本这个办法就算啦
      

  6.   

    ShellExecute可以在你的程序中运行另外的一个程序:
    HINSTANCE ShellExecute(
        HWND hwnd, 
        LPCTSTR lpVerb,
        LPCTSTR lpFile, 
        LPCTSTR lpParameters, 
        LPCTSTR lpDirectory,
        INT nShowCmd
    );
    示例如下 :
    #include <shlobj.h>
    #include <shlwapi.h>main()
    {
        LPMALLOC pMalloc;
        LPITEMIDLIST pidlWinFiles = NULL;
        LPITEMIDLIST pidlItems = NULL;
        IShellFolder *psfWinFiles = NULL;
        IShellFolder *psfDeskTop = NULL;
        LPENUMIDLIST ppenum = NULL;
        STRRET strDispName;
        TCHAR pszParseName[MAX_PATH];
        ULONG celtFetched;
        SHELLEXECUTEINFO ShExecInfo;
        HRESULT hr;
        BOOL fBitmap = FALSE;    hr = SHGetMalloc(&pMalloc);

        hr = SHGetFolderLocation(NULL, CSIDL_WINDOWS, NULL, NULL, &pidlWinFiles);    hr = SHGetDesktopFolder(&psfDeskTop);    hr = psfDeskTop->BindToObject(pidlWinFiles, NULL, IID_IShellFolder, (LPVOID *) &psfWinFiles);
        hr = psfDeskTop->Release();    hr = psfWinFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);    while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
        {
            psfWinFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, &strDispName);
            StrRetToBuf(&strDispName, pidlItems, pszParseName, MAX_PATH);
            pMalloc->Free(pidlItems);
            if(StrCmpI(PathFindExtension(pszParseName), TEXT( ".bmp")) == 0)
            {
                fBitmap = TRUE;
                break;
            }
        }

        ppenum->Release();    if(fBitmap)
        {
            ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
            ShExecInfo.fMask = NULL;
            ShExecInfo.hwnd = NULL;
            ShExecInfo.lpVerb = NULL;
            ShExecInfo.lpFile = pszParseName;
            ShExecInfo.lpParameters = NULL;
            ShExecInfo.lpDirectory = NULL;
            ShExecInfo.nShow = SW_MAXIMIZE;
            ShExecInfo.hInstApp = NULL;        ShellExecuteEx(&ShExecInfo);
        }    pMalloc->Free(pidlWinFiles);
        psfWinFiles->Release();    return 0;
    }
      

  7.   

    楼上各位说的都是在win程序里调用dos程序,而楼主的意思是把dos程序的可执行代码放在win程序里,这是不可能的,dos的代码里会有如中断等操作,这些在win里是非法的,这是不可能完成的任务。记得在很早以前曾有一种技术,可以制作双平台的程序,某个程序既可以在dos里运行,也可以在win里运行,不过那是win3.2时代的事了,不知现在是否还可以这样做。
      

  8.   

    呵呵~~~加到DOS头里面运行!DOS下的时候运行前面的,Win下时运行Win的!
      

  9.   

    我采取了很笨的办法,
    首先我把那个dos文件设置为系统、隐藏属性,
    然后把mfc的可执行程序和那个dos程序一起压缩,用winrar制作自解压文件,并使用了脚本命令:
    Title=demo
    Text
    {
    XXX版权信息等
    }
    Path=demotest
    Overwrite=1
    Silent=1
    Shortcut=D,demo.exe
    Setup=demo.exe
    然后使用工具修改了那个自解压rar文件的图标,
    这样用户双击这个可执行文件时,dos程序默认在后台解压了,同时实现了mfc调用那个dos
    mfc程序退出之前,一个winexec指令删除那个dos文件:)
    一切无影无踪啊,
    虽然没有什么技术含金量,但也算基本达到功能了