如何在C ++中包装CFtpFileFind示例?

时间:2010-01-28 18:29:15

标签: c++ c windows winapi wininet

尝试在C ++中包装this简短示例。 (自从我这样做以来已经有一段时间了)。

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());
     //   }


}

所以基本上将连接和文件操作分成2个函数。 findFile()函数抛出断言。 (进入findFile(),它特别是在inet.cpp中的第一个ASSERT_VALID(m_pConnection)。)

我传递CFtpConnection * pConnect的方式如何?

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

感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

<强>解答:

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

WinInet对象有一个层次结构,其中session是顶层。如果会话消失,则无法使用其他任何内容。因此,我们必须使用new在内存中分配对象,以便在此函数退出后维持该对象。

答案 1 :(得分:1)

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

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