尝试在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)。
感谢任何帮助。感谢。
答案 0 :(得分:1)
<强>解答:强>
此会话对象必须在Connection函数中分配,并带有指针
声明为类的成员函数。在函数内创建对象时,
"CInternetSession sess(_T("MyProgram/1.0"));"
当函数退出时,对象/会话将被终止,被抛出堆栈。当发生这种情况时,我们不能在其他函数中使用pConnect指针。
WinInet对象有一个层次结构,其中session是顶层。如果会话消失,则无法使用其他任何内容。因此,我们必须使用new在内存中分配对象,以便在此函数退出后维持该对象。
答案 1 :(得分:1)
我认为让ftpClient类从连接中返回CFTPConnection对象没有任何实际价值(除非我错过了你想要的东西?) - 它应该只是作为一个Member变量和GetFiles可以直接使用该成员(同样,您可以将CInternetSession添加为类的成员,并避免上面描述的问题,当它超出范围时。)
以这种方式,ftpClient管理CFTPConnection的生命周期,并可以在其析构函数中销毁它。