This is perplexing me... I am writing a DLL to provide FTP upload and download functionality. I am using the Windows INET API's to achieve this, and when I make a call to InternetConnect() it fails with error code 6 (Invalid Handle Value). I was trying to figure out why it kept failing, so I added a call to InternetGetLastResponseInfo() and it magically started working. I commented out the call and it stopped working. I repeated this several times. It doesn't matter where I put the call to InternetGetLastResponseInfo() either, as long as the function is called at some point, it works. If I comment out the call, then the call to InternetConnect() fails.
ATCFTP_EXTERN bool atcftp_put(
char *server,
int port,
char *username,
char *password,
char *localfile,
char *remotefile,
ATCFTP_CALLBACK progress,
int id )
{
HINTERNET hInet, hFTP, hFile;
FILE *pFile;
long total;
long left;
char *buffer;
#ifdef DEBUG
buffer = (char*) malloc( 512 );
memset( buffer, 0, 512 );
sprintf( buffer, "Server = \"%s\"\nPort = \"%d\"\nUsername = \"%s\"\nPassword = \"%s\"", server, port, username, password );
MessageBox( NULL, buffer, "ATCFTP DEBUG", MB_OK | MB_ICONINFORMATION );
#endif
if( NULL != progress )
progress( id, ATCFTP_STATUS_PREPARING, 0, 0 );
if( NULL == (hInet=InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG , NULL, NULL, 0)) )
{
#ifdef SHOW_ERRORS
ShowError( "InternetOpen");
#endif
return false;
}
if( NULL != progress )
progress( id, ATCFTP_STATUS_CONNECTING, 0, 0 );
if( NULL == (hFTP=InternetConnect(hInet,server,port,username,password,INTERNET_SERVICE_FTP,0,0)) )
{
#ifdef SHOW_ERRORS
ShowError( "InternetConnect" );
DWORD dwError;
char lpszBuffer[512];
DWORD dwBufferLength = sizeof(lpszBuffer);
InternetGetLastResponseInfo( &dwError, lpszBuffer, &dwBufferLength );
MessageBox( NULL, lpszBuffer, "ATCFTP ERROR", MB_OK | MB_ICONERROR );
#endif
InternetCloseHandle(hInet);
return false;
}
return true;
}