自动查找某一目录下全部的*.dsw文件,对每一个找到的dsw文件,
调用一个不需用户干预,没有界面的VC编译器进行编译。如此反复
循环,直至全部的dsw文件都被自动编译完成,然后再将编译过程中
的相关信息反馈给用户我知道要plugin,但听说有现成的,是吗
如果作,有相关资料可以提供吗
谢谢了!!

解决方案 »

  1.   

    感觉你的要求有点象DailyBuild,你可以去软件工程板块里看看,我记得那里曾经讨论过这方面的问题!
      

  2.   

    l_restart:
    { CoInitializeEx(NULL, COINIT_MULTITHREADED);
    CLSID clsid;
    ::CLSIDFromProgID(L"MSDEV.APPLICATION",&clsid);
    char drive[4], dir[MAX_PATH], fname[MAX_PATH], ext[16], pszSearchPath[MAX_PATH]; IApplication *pApp=NULL;
    IDispApplication app;
    LPDISPATCH lpDispatch;
    LPUNKNOWN pUnk;
    int nStartCount = 0;
    while(nStartCount<20 && ::GetActiveObject(clsid,NULL,&pUnk) != S_OK)
    {
    if(!app.CreateDispatch(clsid))
    {
    Output("Create Dispatch failed, retry...\r\n");
    Sleep(1000);
    nStartCount++;
    continue;
    }
    } if(nStartCount<20)
    {
    VERIFY(pUnk->QueryInterface(IID_IDispatch,(void**)&lpDispatch) == S_OK);
    app.AttachDispatch(lpDispatch);
    pUnk->QueryInterface(&pApp);
    pUnk->Release();
    }
    else
    {
    Output("failed, terminated.\r\n");
    m_pLog->CloseConnection();
    delete m_pLog;
    m_pLog = NULL;
    m_bRunning = 0;
    return 0;
    } // application is ok
    #if USE_VC_EVENT
    HANDLE hSem = CreateSemaphore(NULL, 0, 1, NULL);
    IAppHelper *pAppHelper = GetAppHelper(); pAppHelper->SetApp((IUnknown *)&app);
    pAppHelper->SetSemaphore(hSem);
    #endif // USE_VC_EVENT app.EnableModeless(false);
    app.SetWindowState(dsWindowStateMaximized);
    lpDispatch = app.GetDocuments();
    IDispDocuments lpDocuments ;
    lpDocuments.AttachDispatch(lpDispatch); COleVariant docType("Auto");
    COleVariant val((long)1);
    val.ChangeType(VT_BOOL);
    VARIANT configuration;
    configuration.vt = VT_DISPATCH; // app.GetErrors();
    CTime time0 = CTime::GetCurrentTime();
    CString str = "开始编译(" + time0.Format("%Y-%m-%d %H:%M:%S") + ")...\r\n";
    Output((LPCTSTR)str); StringArray *pProjList;
    pProjList = pConfig->GetProjectList(); // build
    CStringArray settingName;
    if(pConfig->IsBuildDebug())
    settingName.Add("Win32 Debug");
    if(pConfig->IsBuildRelease())
    settingName.Add("Win32 Release"); int i, nSize, nSetting, nSettingIndex;
    nSetting = settingName.GetSize(); nSize = pProjList->GetSize();
    int nStart = m_pcomboProjList->GetCurSel();
    for(nSettingIndex=m_nBuildSettingIndex; nSettingIndex<nSetting; nSettingIndex++)
    {
    if(pConfig->m_bStopBuild)
    {
    bIncomplete = 1;
    break;
    } m_nBuildSettingIndex = nSettingIndex;
    m_pcmbBuildSetting->SetCurSel(m_nBuildSettingIndex); Output("Configuration ------ ");
    Output(settingName[nSettingIndex]);
    Output(" ------\r\n");
    for(i=nStart; i<nSize; i++)
    {
    // LPSTR lpszName="D:\\dev_buddy\\Complie\\Complie.dsw";// = m_projects[i].GetBuffer(m_projects[i].GetLength());
    if(pConfig->m_bStopBuild)
    {
    bIncomplete = 1;
    break;
    }

    str = pConfig->GetFullProj(i);
    try{
    _splitpath(str, drive, dir, fname, ext);
    sprintf(pszSearchPath, "%s%s", drive, dir);
    Output(str);
    Output("\r\n");
    lpDocuments.Open(
    str,
    docType,
    val); // prepare a configuration
    // IConfigurations *pIConfigurations;
    // app.get_Configurations(&pIConfigurations);
    IDispatch* lpActiveProj = NULL;
    pApp->get_ActiveProject(&lpActiveProj);
    IBuildProject *pActiveProj;
    lpActiveProj->QueryInterface(&pActiveProj); IConfigurations *pConfigs;
    pActiveProj->get_Configurations(&pConfigs); IConfiguration *pItem;
    pItem = GetConfig(pConfigs, settingName[nSettingIndex]); if(pItem)
    {
    VARIANT config;
    config.vt = VT_DISPATCH;
    config.pdispVal = pItem;

    if(i!=g_nNotCleanIndex && pConfig->IsRebuildAll())
    app.RebuildAll(config);
    else
    app.Build(config);

    long nErrs, nWarnings;
    pApp->get_Errors(&nErrs);
    pApp->get_Warnings(&nWarnings); CString strMsg;
    // SDoc.dll - 4 error(s), 0 warning(s)
    strMsg.Format("Build session ended - %d error(s), %d warning(s)\r\n\r\n",
    nErrs, nWarnings);
    Output(strMsg);
    if(nErrs)
    {
    g_nNotCleanIndex = i;
    if(pConfig->m_bBeep)
    MessageBeep(-1);
    if(pConfig->m_dwOnError==OE_STOP)
    {
    bIncomplete = 1;
    goto l_end;
    }
    }
    if(pItem)
    pItem->Release();
    }
    else
    {
    Output("无法找到编译设置 ");
    Output(settingName[nSettingIndex]);
    Output("\r\n");
    }

    m_pcomboProjList->SetCurSel(i+1);
    }
    catch(...)
    {
    Output("Exception\r\n");
    bIncomplete = 1;
    }
    } // for each workspace nStart = 0; m_pcomboProjList->SetCurSel(0);
    } // for each setting
      

  3.   

    l_end: lpDocuments.DetachDispatch();

    app.EnableModeless(true); if(!bIncomplete)
    app.Quit();
    app.DetachDispatch();
    if(pApp)
    pApp->Release();
    ::CoUninitialize(); CTime time1 = CTime::GetCurrentTime();
    CTimeSpan span = time1-time0;
    str = "编译结束(" + time1.Format("%Y-%m-%d %H:%M:%S") + ")总共耗时: "
    + span.Format("%H:%M:%S") + "\r\n\r\n";
    Output((LPCTSTR)str); }
    if(g_bInfinite)
    {
    m_pcomboProjList->SetCurSel(0);
    goto l_restart;
    } if(bIncomplete)
    {
    Outputln("没有完整编译,可能某些工程设置不正确,可能有 exception 。");
    } if(!bIncomplete && pConfig->m_bOnAfterBuild)
    {
    Output("Run: ");
    Outputln(pConfig->m_strAfterBuildCmd);
    ShellExecute(g_hwndTop, "open", pConfig->m_strAfterBuildCmd,
    NULL, NULL, SW_SHOWNORMAL);
    } if(pConfig->IsShutdown())
    {
    CShutdownDlg dlg;
    dlg.m_fDelay = pConfig->GetDelay();
    dlg.DoModal();
    } delete pConfig;
    if(g_yacmdLine.bAutoRun)
    ::PostMessage(g_hwndTop, WM_QUIT, 0, 0); if(m_pLog)
    {
    m_pLog->CloseConnection();
    m_pLog = NULL;
    } m_bRunning = 0;
    return 0;
      

  4.   

    怎么样?这下够了吧============================================================================
    提问题时标题要简明扼要地说明问题内容,切忌使用"急","求救"之类不能说明问题的标题
    http://alphasun.betajin.com/   遇到问题可以给我发消息,给我发信息时请附带原帖地址
    DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析