Как мне обернуть пример CFtpFileFind в C ++? - PullRequest
1 голос
/ 28 января 2010

Попытка обернуть этот короткий пример на 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());
     //   }


}

Таким образом, в основном разделены соединение и манипулирование файлами на 2 функции. Функция findFile () выбрасывает assert. (Заходя в findFile () и он находится конкретно на первом ASSERT_VALID (m_pConnection) в inet.cpp.)

Как выглядит способ передачи arround CFtpConnection * pConnect?

РЕДАКТИРОВАТЬ - Похоже, CObject vfptr перезаписывается (0X00000000) в функции GetFiles ().

Любая помощь приветствуется. Благодаря.

Ответы [ 2 ]

1 голос
/ 29 января 2010

Я не думаю, что есть реальная ценность того, чтобы класс ftpClient возвращал объект CFTPConnection из Connect (если я не пропустил то, что вы намереваетесь?) - он должен просто иметь это как переменную Member, и GetFiles может использовать этот член напрямую (аналогично, вы добавите CInternetSession в качестве члена класса и избежите описанной выше проблемы, когда он выходит из области видимости.)

Таким образом, ftpClient управляет временем жизни CFTPConnection и может уничтожить его в своем деструкторе.

1 голос
/ 28 января 2010

ОТВЕТ:

Этот объект сеанса должен быть размещен в функции Connection с указателем
объявлен как функция-член класса. При создании объекта внутри функции,
"CInternetSession sess(_T("MyProgram/1.0"));" объект / сеанс будет завершен при выходе из функции, будучи сброшенным из стека. Когда это происходит, мы не можем использовать указатель pConnect в других функциях.

Существует иерархия для объектов WinInet, причем сессия является верхней. Если сессия прошла, больше ничего нельзя использовать. Таким образом, мы должны использовать new для выделения объекта в памяти, чтобы он поддерживал работу после выхода из этой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...