Problème utilisation d'InternetGetLastResponseInfo // Upload fichier c++
Le
Charles AHMADZADEH
Bonjour, dans le cadre d'un stage, je dois réaliser un programme qui doit
entre-autres être capable d'uploader un fichier (.txt en l'occurence) sur un
serveur ftp.
Le code m'a l'air correct cepdendant le fichier ne s'upload pas et la
fonciton ftpPut renvoie 0 (signalant une erreur). Je précise que je débute
en programmation ;)
J'ai donc utilisé GetLastError et obtenu un code 12003: utilisez la fonction
InternetGetLastResponseInfo() et Je n'arrive pas à utiliser cette fonction
(comment initialiser les buffers, etc). Cette fonction fait planter mon
programme et cela m'empeche d'avancer dans mon projet puisque je ne peux pas
récuperer le messsage d'erreur ^^. De plus, impossible de trouver un exemple
sur internet (à l'instar de GetLastError).
C'est réalisé sous Dev-C++, le fichier local est dans le répertoire du main
ainsi que dans le répertoire de mon code source "upload.cpp".
L'ordinateur sur lequel je lance le programme possède les autorisations
nécessaires pour créer un fichier sur le serveur.
Merci d'avance pour l'aide.
Code (sans les include):
#define FTPSERV "ftp.blablabla.com" // Serveur
#define FTPUSER "user" // Login
#define FTPPASS "pass" // Password
#define SRCFILE "log_SR28.txt" // Fichier local
#define DSTFILE "log_SR28up" // Fichier distant
using namespace std;
bool upload ()
{
HINTERNET hInet, hFTP;
bool succes_up;
//Variables de GetLastError
LPTSTR pszMessage, lpszBuffer;
DWORD dwLastError;
LPDWORD lpdwError;
LPDWORD lpdwBufferLength;
LoadLibrary("../ftplib-3.1-1/winnt/Release/FTPlib.dll" );
LoadLibrary("../wininet.dll" );
if((hInet = InternetOpen("ftp.blablabla.com/projet/",
INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0)) != INVALID_HANDLE_VALUE)
//ftp.blablabla.com/projet/ est le répertoire du ftp dans
// lequel je souhaite upload mon fichier.
{
if((hFTP = InternetConnect(hInet, FTPSERV, 21, FTPUSER, FTPPASS,
INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)) != INVALID_HANDLE_VALUE)
{
succes_up = FtpPutFile(hFTP, SRCFILE, DSTFILE,
FTP_TRANSFER_TYPE_BINARY, 0); // succes_up = 0, l'upload n'a pas marché.
InternetOpen et InternetConnect renvoient 1.
//Get Last Error
dwLastError = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL,
dwLastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&pszMessage,0, NULL );
wprintf(L"failed with error %d: %s", dwLastError,
pszMessage); // Code 12003: Use InternetGetLasResponseInfo pour récupérer
le message
//Internet response info
InternetGetLastResponseInfo(lpdwError,lpszBuffer,lpdwBufferLength);
// Je ne sais pas comment initialiser les variables utilisées par cette
fonction, et impossible de trouver un exemple sur internet
InternetCloseHandle(hFTP);
}
InternetCloseHandle(hInet);
}
return succes_up;
}
entre-autres être capable d'uploader un fichier (.txt en l'occurence) sur un
serveur ftp.
Le code m'a l'air correct cepdendant le fichier ne s'upload pas et la
fonciton ftpPut renvoie 0 (signalant une erreur). Je précise que je débute
en programmation ;)
J'ai donc utilisé GetLastError et obtenu un code 12003: utilisez la fonction
InternetGetLastResponseInfo() et Je n'arrive pas à utiliser cette fonction
(comment initialiser les buffers, etc). Cette fonction fait planter mon
programme et cela m'empeche d'avancer dans mon projet puisque je ne peux pas
récuperer le messsage d'erreur ^^. De plus, impossible de trouver un exemple
sur internet (à l'instar de GetLastError).
C'est réalisé sous Dev-C++, le fichier local est dans le répertoire du main
ainsi que dans le répertoire de mon code source "upload.cpp".
L'ordinateur sur lequel je lance le programme possède les autorisations
nécessaires pour créer un fichier sur le serveur.
Merci d'avance pour l'aide.
Code (sans les include):
#define FTPSERV "ftp.blablabla.com" // Serveur
#define FTPUSER "user" // Login
#define FTPPASS "pass" // Password
#define SRCFILE "log_SR28.txt" // Fichier local
#define DSTFILE "log_SR28up" // Fichier distant
using namespace std;
bool upload ()
{
HINTERNET hInet, hFTP;
bool succes_up;
//Variables de GetLastError
LPTSTR pszMessage, lpszBuffer;
DWORD dwLastError;
LPDWORD lpdwError;
LPDWORD lpdwBufferLength;
LoadLibrary("../ftplib-3.1-1/winnt/Release/FTPlib.dll" );
LoadLibrary("../wininet.dll" );
if((hInet = InternetOpen("ftp.blablabla.com/projet/",
INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0)) != INVALID_HANDLE_VALUE)
//ftp.blablabla.com/projet/ est le répertoire du ftp dans
// lequel je souhaite upload mon fichier.
{
if((hFTP = InternetConnect(hInet, FTPSERV, 21, FTPUSER, FTPPASS,
INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)) != INVALID_HANDLE_VALUE)
{
succes_up = FtpPutFile(hFTP, SRCFILE, DSTFILE,
FTP_TRANSFER_TYPE_BINARY, 0); // succes_up = 0, l'upload n'a pas marché.
InternetOpen et InternetConnect renvoient 1.
//Get Last Error
dwLastError = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL,
dwLastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&pszMessage,0, NULL );
wprintf(L"failed with error %d: %s", dwLastError,
pszMessage); // Code 12003: Use InternetGetLasResponseInfo pour récupérer
le message
//Internet response info
InternetGetLastResponseInfo(lpdwError,lpszBuffer,lpdwBufferLength);
// Je ne sais pas comment initialiser les variables utilisées par cette
fonction, et impossible de trouver un exemple sur internet
InternetCloseHandle(hFTP);
}
InternetCloseHandle(hInet);
}
return succes_up;
}

Poser une question


que j'utilise un NewsGroup.
"Charles AHMADZADEH" de news:gcii58$g6o$
Par ex,
TCHAR szError[MAX_PATH];
DWORD dwError, dwSize;
dwSize = ARRAYSIZE(szError);
BOOL bRet = InternetGetLastResponseInfo(&dwError, szError, &dwSize);
Et en général, on fait un FtpSetCurrentDirectory() avant FtpPutFile(),
sinon, il va dans le home du user...
Oui, car le premier parametre de InternetOpen n'est pas significatif
Les LoadLibrary ne servent a rien non plus..
Merci beaucoup, j'arrive à récupérer l'erreur. Ca doit surement venir d'un
paramétrage d'accès au serveur (surement mauvais port).
200 Type set to I.
227 Entering Passive Mode (195,171,131,
550 log_SR28up.txt: Access is denied.
Si c'était le port, tu ne pourrais pas te connecter.
"Access is denied.", c'est plutot les droits d'accès de l'utilisateur dans
le répertoire défaut