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

How to enable user to re-entry(or) reuse the same dialog in MFC

我目前正在使用 MFC FTP 下载。是一个非常简单的程序,它从用户那里获取 2 个输入并单击下载按钮以便从服务器下载。一切都很好,我可以从中下载它。但我意识到这个程序只能执行一次。成功或失败的用户必须再次打开 .exe 以下载另一个文件。我是 C&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 派生的 class 的成员。
  2. 您应该在 CWinApp 派生的 class 的 ExitInstance() 方法中调用 m_Session.Close()
  3. 在您的 CDialog 派生的 class 中,您应该只处理 CFtpConnection 相关的东西。因此,当用户单击 下载 按钮时,您应该调用 GetFtpConnection() 并初始化您的 m_pFtpConnection 并完成剩下的工作。 download/upload 完成后调用 m_pFtpConnection->Close();delete m_pFtpConnection;
  4. 请同时使用 CString 而不是 char*。有很多好处,例如自动支持 UNICODE 等。
  5. 也请考虑使用 CString::Format() 方法代替 sprintf()

您还应该考虑使用线程在单独的工作线程中执行 upload/download 任务。使用 AfxBeginThread() 启动线程。这样您就不会影响作为主应用程序 (GUI) 线程一部分的 Windows 消息泵。因此,当您 uploading/downloading 文件时,您的 GUI 不会锁定。