1

试图用 C++ 包装这个简短的例子。(自从我这样做以来已经有一段时间了)。

int main(int argc, char* argv[])
{       
    //Objects
    CFtpConnection* pConnect = NULL; //A pointer to a CFtpConnection object
    ftpClient UploadExe; //ftpClient object
 

    pConnect = UploadExe.Connect();    
    UploadExe.GetFiles(pConnect);

system("PAUSE");
    return 0;
}

。H -

class ftpClient
{
    public:    
    
    ftpClient();        
    CFtpConnection* Connect();
    void GetFiles(CFtpConnection* pConnect);    

};

.cpp -

//constructor
ftpClient::ftpClient()
{

}

CFtpConnection* ftpClient::Connect()
{
    // create a session object to initialize WININET library
    // Default parameters mean the access method in the registry
    // (that is, set by the "Internet" icon in the Control Panel)
    // will be used.

    CInternetSession sess(_T("FTP"));

    CFtpConnection* pConnect = NULL;

    try
    {
        // Request a connection to ftp.microsoft.com. Default
        // parameters mean that we'll try with username = ANONYMOUS
        // and password set to the machine name @ domain name
        pConnect = sess.GetFtpConnection("localhost", "sysadmin", "ftp", 21, FALSE );

    }
    catch (CInternetException* pEx)
    {
        TCHAR sz[1024];
        pEx->GetErrorMessage(sz, 1024);
        printf("ERROR!  %s\n", sz);
        pEx->Delete();
     }

    // if the connection is open, close it  MOVE INTO CLOSE FUNCTION
   // if (pConnect != NULL) 
   // {
   //     pConnect->Close();
   //     delete pConnect;
   // }


    return pConnect;

}

void ftpClient::GetFiles(CFtpConnection* pConnect)
{
        // use a file find object to enumerate files
        CFtpFileFind finder(pConnect);
   

if (pConnect != NULL) 
{
   printf("ftpClient::GetFiles - pConnect NOT NULL");
}


     // start looping
        BOOL bWorking = finder.FindFile("*"); //<---ASSERT ERROR

      //  while (bWorking)
      //  {
     //       bWorking = finder.FindNextFile();
     //       printf("%s\n", (LPCTSTR) finder.GetFileURL());
     //   }


}

所以基本上将连接和文件操作分为两个功能。findFile() 函数正在抛出断言。(进入 findFile() 并且它具体位于 inet.cpp 中的第一个 ASSERT_VALID(m_pConnection)。)

我通过 arround CFtpConnection* pConnect 的方式如何?

编辑- 看起来 CObject vfptr 在 GetFiles() 函数中被覆盖(0X00000000)。

任何帮助表示赞赏。谢谢。

4

2 回答 2

1

回答:

此会话对象必须在 Connection 函数中分配,并带有一个
声明为该类成员函数的指针。在函数内创建对象时,
"CInternetSession sess(_T("MyProgram/1.0"));"对象/会话将在函数退出时终止,被抛出堆栈。发生这种情况时,我们不能在其他函数中使用 pConnect 指针。

WinInet 对象有一个层次结构,会话位于顶部。如果会话消失,则无法使用其他任何东西。因此,我们必须使用 new 来分配内存中的对象,以便在此函数退出后它仍然存在。

于 2010-01-28T20:17:33.977 回答
1

我认为让 ftpClient 类从 Connect 中返回 CFTPConnection 对象没有任何实际价值(除非我遗漏了您想要的东西?) - 它应该只是将其作为成员变量,并且 GetFiles 可以使用它直接成员(同样,您可以将 CInternetSession 添加为该类的成员,并在超出范围时避免上述问题。)

以这种方式,ftpClient 管理 CFTPConnection 的生命周期,并可以在其析构函数中销毁它。

于 2010-01-29T00:35:45.897 回答