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


}

つまり、基本的に接続とファイル操作を2つの機能に分けました。findFile()関数はassertをスローしています。(findFile()にステップインし、具体的にはinet.cppの最初のASSERT_VALID(m_pConnection)にあります。)

アラウンドCFtpConnection*pConnectを渡す方法はどのように見えますか?

編集-GetFiles()関数でCObject vfptrが上書きされているようです(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 オブジェクトを返すようにすることに実際の価値があるとは思いません (意図したものが欠けていない限り?) - それを Member 変数として持つだけで、GetFiles はそれを使用できますメンバーを直接 (同様に、CInternetSession をクラスのメンバーとして追加し、範囲外になったときに上記の問題を回避します。)

このようにして、ftpClient は CFTPConnection の有効期間を管理し、デストラクタでそれを破棄できます。

于 2010-01-29T00:35:45.897 に答える