试图用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)处)。
我如何通过CFtpConnection * pConnect外观?
编辑 – 在GetFiles()函数中看起来像CObject vfptr被覆盖(0X00000000)。
任何帮助表示赞赏。 谢谢。
回答:
这个会话对象必须在连接函数中分配一个指针
声明为该类的成员函数。 在函数内创建对象时,
"CInternetSession sess(_T("MyProgram/1.0"));"
对象/会话将在函数退出时被终止,被抛出堆栈。 发生这种情况时,我们不能在其他函数中使用pConnect指针。
WinInet对象有一个层次结构,以会话为顶层。 如果会话没有其他可以使用。 因此,我们必须使用new来分配内存中的对象,以便在此函数退出后维持它。
我不认为让ftpClient类从Connect中返回CFTPConnection对象是没有任何实际价值的(除非我错过了你打算的东西?) – 它应该只是将它作为一个成员变量,并且GetFiles可以使用成员直接(同样,您可以添加CInternetSession作为类的成员,并避免上面描述的问题,当它超出范围。)
以这种方式,ftpClient管理CFTPConnection的生命周期,并且可以在析构函数中销毁它。