如何使用户能够在MFC中重新进入(或)重用相同的对话框



我目前正在使用MFC做FTP下载。是一个非常简单的程序,需要从用户2个输入,并单击下载按钮,以便从服务器下载。一切正常,我可以从。但我意识到这个程序只能执行一次。无论是成功还是失败,用户都必须再次打开.exe下载另一个文件。我是c++初学者,有一个简单的知识,我把OnInitDialog()放在下载函数跳转的最后一行,它将循环回来并再次初始化。当然这行不通。下面是我当前下载按钮的代码

BOOL CFTPDOWNLOADDlg::Log_In(char* path, char* ID, char* password {       
    m_pFtpConnection = NULL;
    try{
        // path         
        // ID
        // password
        m_pFtpConnection = m_Session.GetFtpConnection(path,
        ID,password,INTERNET_INVALID_PORT_NUMBER);
    }
    catch(CInternetException *pEx){
        pEx->ReportError(MB_ICONEXCLAMATION);
        m_pFtpConnection = NULL;
        pEx->Delete();
        return FALSE;
    }

    return TRUE;
}
BOOL CFTPDOWNLOADDlg::Download(){
    m_Edit3.SetWindowText("Downloading..");
    m_Session.EnableStatusCallback(TRUE);
    if(m_pFtpConnection->GetFile(serv_Loc,host_Loc,
    FALSE,FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_BINARY,1) != 0){
    MessageBox("Download Complete");
    m_Edit3.SetWindowText("");}
    else{
        MessageBox("Download Fail");
        return FALSE;
    }
    // Log_out Session
    m_Session.Close();
    m_pFtpConnection->Close();
    if(m_pFtpConnection!=NULL) delete m_pFtpConnection;
    else MessageBox("Download Complete");

    return TRUE;
}
BOOL CFTPDOWNLOADDlg::get_Path(){
...
...
...
    sprintf(serv_Loc,"soft\%s\%d\%s.zip",s_No,r_Number,r_No);
    sprintf(host_Loc,"%s\%s.zip",buff2,r_No);
    return TRUE;
}
void CFTPDOWNLOADDlg::OnCancel() {
    // Log_out Session
    m_Session.Close();
    m_pFtpConnection->Close();
    if(m_pFtpConnection!=NULL)
    delete m_pFtpConnection;
    CDialog::OnCancel();
}

void CFTPDOWNLOADDlg::OnDLButton() {
    //get path from user input
    get_Path();
    // start download
    Download();
}

我试着在网上搜索,我找不到任何接近的。对不起,我解释得不好。

提前感谢您的回信

你需要做的是:

  1. 应该让CInternetSession m_Session;成为CWinApp派生类的成员。
  2. 你应该在CWinApp派生类的ExitInstance()方法中调用m_Session.Close()
  3. 在你的CDialog派生类中,你应该只处理CFtpConnection相关的东西。因此,当用户单击Download按钮时,您应该调用GetFtpConnection()并初始化m_pFtpConnection并完成其余工作。下载/上传完成后,调用m_pFtpConnection->Close();delete m_pFtpConnection;
  4. 请使用CString代替char*。有很多好处,如自动UNICODE支持等。
  5. 请考虑使用CString::Format()方法代替sprintf()方法。

你还应该考虑在单独的工作线程中使用线程来执行上传/下载任务。使用AfxBeginThread()启动线程。这样就不会影响Windows消息泵,它是主应用程序(GUI)线程的一部分。所以当你上传/下载文件时,你的GUI不会被锁住。

相关内容

  • 没有找到相关文章

最新更新