IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Problème d'utilisation de l'API cURL


Sujet :

WinDev

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 122
    Points : 136
    Points
    136
    Par défaut Problème d'utilisation de l'API cURL
    Bonjour, à tous,

    Je désirerais utiliser l'API libcurl.dll fournis avec cURL pour effectuer des transferts SFTP.

    http://curl.haxx.se/libcurl/

    Quelqu'un a-t-il déjà utiliser cette API ?

    Mes connaissances en matière d'utilisation d'API sont proches de zéro, mais j'ai tenté de reproduire (sans succès) un des exemples fournis qui permettent de récupère le code HTML d'une page.

    Exemple Source C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #include <stdio.h>
    #include <curl/curl.h>
     
    int main(void)
     {
       CURL *curl;
       CURLcode res;
     
       curl = curl_easy_init();
       if(curl) {
                  curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
                  res = curl_easy_perform(curl);
     
                 /* always cleanup */
                curl_easy_cleanup(curl);
       }
     return 0;
    }
    Mon Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    nEasyhandle est un entier sans signe
    nCURLcode est un entier sans signe
     
    nCURLcode = AppelDLL32("libcurl", "curl_global_init", "CURL_GLOBAL_ALL")
    nCURLcode = AppelDLL32("libcurl", "curl_global_init", "CURL_GLOBAL_WIN32")
     
    nCURLcode = AppelDLL32("libcurl", "curl_easy_setopt", nEasyhandle, "CURLOPT_URL", "http://www.google.fr/")
     
    nCURLcode = AppelDLL32("libcurl", "curl_easy_perform", nEasyhandle)
     
    AppelDLL32("libcurl", "curl_easy_cleanup", nEasyhandle)
    Déjà, sur la ligne suivante, je récupère un code d'erreur 2 qui semble indiquer une erreur d'initialisation. (CURLE_FAILED_INIT (2))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nCURLcode = AppelDLL32("libcurl", "curl_easy_setopt", nEasyhandle, "CURLOPT_URL", "http://www.google.fr/")
    Pour le moment je ne parviens pas à avancer plus en avant.

    Par avance merci pour vos conseils.

  2. #2
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Tu dois remplacer tes parametres ( "CURL_GLOBAL_ALL" par exemple), par sa vrai valeur définie dans ton header file C.

    Il doit y avoir quelque chose du genre :

    #define CURL_GLOBAL_ALL 4

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 122
    Points : 136
    Points
    136
    Par défaut
    Bonjour, et merci beaucoup de t'intéresser a mon problème.

    Sauf erreur de ma part il est défini dans curl.h :

    Définition :
    http://curl.haxx.se/lxr/source/inclu...l/curl.h#L1598

    Mais c'est loin d'être simple pour moi comme définition, doit-on créer une structure ?

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Je crois que ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define CURL_GLOBAL_SSL (1<<0)
    #define CURL_GLOBAL_WIN32 (1<<1)
    #define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32)
    #define CURL_GLOBAL_NOTHING 0
    #define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL
    Pourrait-être traduit ainsi en WLangage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CONSTANT
        CURL_GLOBAL_SSL = 1
        CURL_GLOBAL_WIN32 = 2
        CURL_GLOBAL_ALL = 3
        CURL_GLOBAL_NOTHING = 0
        CURL_GLOBAL_DEFAULT = 3
    FIN
    Et là CURLOPT_URL, toujours dans ce curl.h, c'est vraiment pour les masos des macros !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    538 /* long may be 32 or 64 bits, but we should never depend on anything else
    539    but 32 */
    540 #define CURLOPTTYPE_LONG          0
    541 #define CURLOPTTYPE_OBJECTPOINT   10000
    542 #define CURLOPTTYPE_FUNCTIONPOINT 20000
    543 #define CURLOPTTYPE_OFF_T         30000
    544 
    545 /* name is uppercase CURLOPT_<name>,
    546    type is one of the defined CURLOPTTYPE_<type>
    547    number is unique identifier */
    548 #ifdef CINIT
    549 #undef CINIT
    550 #endif
    551 
    552 #ifdef CURL_ISOCPP
    553 #define CINIT(name,type,number) CURLOPT_ ## name = CURLOPTTYPE_ ## type + number
    554 #else
    555 /* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
    556 #define LONG          CURLOPTTYPE_LONG
    557 #define OBJECTPOINT   CURLOPTTYPE_OBJECTPOINT
    558 #define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
    559 #define OFF_T         CURLOPTTYPE_OFF_T
    560 #define CINIT(name,type,number) CURLOPT_/**/name = type + number
    561 #endif
    562 
    563 /*
    564  * This macro-mania below setups the CURLOPT_[what] enum, to be used with
    565  * curl_easy_setopt(). The first argument in the CINIT() macro is the [what]
    566  * word.
    567  */
    568 
    569 typedef enum {
    570   /* This is the FILE * or void * the regular output should be written to. */
    571   CINIT(FILE, OBJECTPOINT, 1),
    572 
    573   /* The full URL to get/put */
    574   CINIT(URL,  OBJECTPOINT, 2),
    
    // je vous épargne les quelques lignes !!!
    
    1148     /* "name" and "pwd" to use with Proxy when fetching. */
    1149   CINIT(PROXYUSERNAME, OBJECTPOINT, 175),
    1150   CINIT(PROXYPASSWORD, OBJECTPOINT, 176),
    1151 
    1152   CURLOPT_LASTENTRY /* the last unused */
    1153 } CURLoption;
    Si j'ai bien lu, ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CURLOPT_URL = CURLOPTTYPE_OBJECTPOINT + 2
    Donc dans les constantes WLangage, on rajoute:
    J'imagine que tu auras d'autres codes à "deviner", alors bon courage et, éventuellement, renseigne toi sur le fonctionnement du pré-processeur C qui est utilisé pour ces directives et macros.
    _

  5. #5
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    le plus simple pour moi serait de récupérer l'api C, d'en faire une dll et de l'appeler depuis WD. Il doit exister des dll pour d'autres langages (delphi, VB,...), voir de ce coté si tu ne peux pas les réutiliser.
    Emmanuel Lecoester
    => joomla addict.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 122
    Points : 136
    Points
    136
    Par défaut
    Merci beaucoup de votre aide a tous !

    Cela va me donner une bonne base de travail pour "deviner" le reste je vais étudier ça avec attention.

    Il existe pleins d'examples pour de nombreux langages (sauf Windev) dont VB disponible a la page suivante :

    http://curl.haxx.se/libcurl/

    Lien direct pour VB :

    http://sourceforge.net/projects/libcurl-vb/

    Cela dit je ne comprends pas pourquoi je dois définir les valeurs des paramètres et non pas les utiliser directement alors que je fais appel à une DLL qui est déjà compilé et qui doit déjà contenir ces définitions ?

  7. #7
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    passe par une dll c'est plus simple
    Emmanuel Lecoester
    => joomla addict.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par Whaouu Voir le message
    Merci beaucoup de votre aide a tous !

    Cela dit je ne comprends pas pourquoi je dois définir les valeurs des paramètres et non pas les utiliser directement alors que je fais appel à une DLL qui est déjà compilé et qui doit déjà contenir ces définitions ?
    Il s'agit d'une caractéristique de Windev, où l'import de lib n'existe pas, il faut donc tout déclarer dans Windev, ce qui est lourd dans le cas de structure complexe.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 122
    Points : 136
    Points
    136
    Par défaut
    Encore merci à tous pour votre aide.

    Grace à vous j'ai trouvé l'ensemble dès valeur des paramètres dans le fichier vblibcurl.odl, utilisé en VB.

    http://sourceforge.net/projects/libcurl-vb/

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Je viens me joindre a Whaou pour essayer de faire avancer le truc.

    Le problème d'appel de la dll est etrange ...

    voici mon code de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    NEasyhandle est un entier système
     
    	nCURLcode est un entier système
    	nNfichier est une entier système
    	szSchaine est une chaîne ASCIIZ sur 50000
     
    nNfichier=fOuvre("c:\test.txt",foEcriture+foCréationSiInexistant)
     
     
     
    nCURLcode = AppelDLL32("libcurl", "curl_global_init",CURL_GLOBAL_ALL)
     
     
    NEasyhandle = AppelDLL32("libcurl", "curl_easy_init") // Curl *Handle = un pointeur windev, donc un entier systeme
     
    //nCURLcode = AppelDLL32("libcurl", "curl_easy_setopt", NEasyhandle, CURLOPT_URL, "http://www.google.fr/")
    //nCURLcode = AppelDLL32("libcurl", "curl_easy_setopt", NEasyhandle,CURLOPT_WRITEDATA, szSchaine ) 
    //nCURLcode = AppelDLL32("libcurl", "curl_easy_setopt", NEasyhandle,CURLOPT_WRITEFUNCTION, Null ) 
    //nCURLcode=AppelDLL32("libcurl", "curl_easy_perform", NEasyhandle)
    // ne marche pas ( GPF) 
     
     
    nCURLcode = AppelDLL32("libcurl", "curl_easy_setopt", &NEasyhandle, CURLOPT_URL, "http://www.google.fr/")
    nCURLcode = AppelDLL32("libcurl", "curl_easy_setopt", &NEasyhandle,CURLOPT_WRITEDATA, szSchaine ) 
    nCURLcode = AppelDLL32("libcurl", "curl_easy_setopt", &NEasyhandle,CURLOPT_WRITEFUNCTION, Null ) 
     
     
     
    nCURLcode=AppelDLL32("libcurl", "curl_easy_perform", &NEasyhandle)
    provoque une gpf....
    et je ne vois pas ou est le blème ...

    de plus, j'ai essayé avec l'assemblage .net , et ce n'est guère plus probant.
    en effet, l'appel aux fonctions d'un objet depuis le code affiche une erreur "aucune syntaxe de xxxx ne correspond" alors que je la drag/drop depuis la classe ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    LOCAL 
     
    sSdoc,sSfic,sInfoXML est une chaîne
    //oHTTP est un cHttpCookies
    n,i est un entier
     
     
    sError est une chaîne
     
     
    //serror est une chaine asciiZ de 50000
    clopt est un entier système
    sSerror est une chaîne
    clOeasy est un Easy
     
    Curl::GlobalInit(CURLinitFlag::CURL_GLOBAL_ALL )
    clopt=CURLoption::CURLOPT_WRITEDATA
     
    clOeasy:SetOpt( clopt, &sError )
    clopt=CURLoption::CURLOPT_URL
    clOeasy:SetOpt(clopt,"HTTP://WWW.GOOGLE.FR")
    J'ai posé la question au ST, mais comme ce n'est pas une dll windev ->ttdm

    des idées ?

    merci d'avance...

  11. #11
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par phig330 Voir le message
    J'ai posé la question au ST, mais comme ce n'est pas une dll windev ->ttdm
    C'est un peu normal leur réaction
    Emmanuel Lecoester
    => joomla addict.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 122
    Points : 136
    Points
    136
    Par défaut
    Déjà quand le problème les concerne il est souvent nécessaire d'insister lourdement, donc effectivement on imagine aisément leur réaction quand cela ne les concerne pas.

    Mais bons, nous ne sommes pas là pour faire le procès du support technique.

    Pour les courageux développeurs de ce sympathique forum voila le lien direct pour télécharger l'assemblage .Net de cURL.

    http://sourceforge.net/projects/libcurl-net/

    Cela semble effectivement plus simple et plus souple que de passer pas la DLL, mais quand on ne maîtrise pas les classes on se retrouve vitte bloqué (ce qui est notre cas).

    Merci pour votre aide.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 56
    Points : 73
    Points
    73
    Par défaut
    Bonjour, il y a bientôt 4 ans , vous avez écrit :

    Citation Envoyé par phig330 Voir le message
    Je viens me joindre a Whaou pour essayer de faire avancer le truc.
    Avez-vous pu avancer depuis car je rencontre le même genre de problèmes et je ne suis pas allé beaucoup plus loin que vous et je bloque aussi.

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    // curl Error Code
    nCURLE_OK est un entier = 0
     
    // curl_init_flag
    nCURL_GLOBAL_NOTHING est un entier = 0
    nCURL_GLOBAL_SSL est un entier = 1
    nCURL_GLOBAL_WIN32 est un entier = 2
    nCURL_GLOBAL_ALL est un entier = 3
    nCURL_GLOBAL_DEFAULT est un entier = 3
     
    // CURLoption
    nCURLOPT_ERRORBUFFER est un entier = 10010
    nCURLOPT_URL est un entier = 10002
    nCURLOPT_VERBOSE est un entier = 41
    nCURLOPT_WRITEDATA est un entier = 10001
    nCURLOPT_WRITEFUNCTION est un entier = 20011
     
    nContexte est un entier système
    nCURLcode est un entier système
     
    hInst est un entier système
    hInst = ChargeDLL("libcurl.dll")
    SI ( hInst = 0 ) ALORS
     
    	Erreur(ErreurInfo())
    SINON
     
    	Info("DLL chargée")
     
    	buf est un Buffer
     
    	nCURLcode = AppelDLL32("libcurl", "curl_global_init", nCURL_GLOBAL_ALL)
    	nCURLcode = AppelDLL32("libcurl", "curl_global_init", nCURL_GLOBAL_WIN32)
    	nContexte = AppelDLL32( "libcurl", "curl_easy_init" )
    	nCURLcode = AppelDLL32( "libcurl", "curl_easy_setopt", nContexte, nCURLOPT_URL, "http://www.google.fr" )
    	nCURLcode = AppelDLL32( "libcurl", "curl_easy_setopt", nContexte, nCURLOPT_VERBOSE, Vrai )
    	nCURLcode = AppelDLL32( "libcurl", "curl_easy_setopt", nContexte, nCURLOPT_WRITEDATA, buf )
    	nCURLcode = AppelDLL32( "libcurl", "curl_easy_setopt", nContexte, nCURLOPT_WRITEFUNCTION, &ecrit_curl )
    	nCURLcode = AppelDLL32( "libcurl", "curl_easy_perform", nContexte )
    	SI ( nCURLcode <> nCURLE_OK ) ALORS
     
    		n est un entier système 
    		n = AppelDLL32( "libcurl", "curl_easy_strerror", nCURLcode )
     
    		sErreur est une chaîne = ChaîneRécupère( n, crAdresseASCIIZ )
    		Trace(sErreur)
    	FIN
    	AppelDLL32( "libcurl", "curl_easy_cleanup", nContexte )
     
    	DéchargeDLL(hInst)
    FIN
    et pour la fonction ecrit_curl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    PROCEDURE ecrit_curl( ptr, size, nmemb, stream )
     
    Trace( "ecrit_curl ptr = " + ptr )
    sChaine est une chaîne = ChaîneRécupère( ptr, crAdresseASCIIZ )
    Trace( sChaine )
    Trace( Taille( sChaine ) ) 
    Trace( "ecrit_curl size = " + size )
    Trace( "ecrit_curl nmemb = " + nmemb )
    Trace( "ecrit_curl stream = " + stream )
     
    RENVOYER 0
    La trace me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ecrit_curl ptr = 44919221
    <!doctype html><html itemscope itemtype="http://schema.org/WebPage"><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><meta itemprop="image" content="/images/google_favicon_128.png"><title>Google</title><script>window.google={kEI:"Sdn6T9O_I4ea1AWTtdTHBg",getEI:function(a){var b;while(a&&!(a.getAttribute&&(b=a.getAttribute("eid"))))a=a.parentNode;return b||google.kEI},https:function(){return window.location.protocol=="https:"},kEXPI:"17259,30316,38252,39366,39370,39494,39515,39604,39730",kCSI:{e:"17259,30316,38252,39366,39370,39494,39515,39604,39730",ei:"Sdn6T9O_I4ea1AWTtdTHBg"},authuser:0,<\n>ml:function(){},kHL:"fr",time:function(){return(new Date).getTime()},log:function(a,b,c,e){var d=new Image,h=google,i=h.lc,f=h.li,j="";d.onerror=(d.onload=(d.onabort=function(){delete i[f]}));i[f]=d;if(!c&&b.search("&ei=")==-1)j="&ei="+google.getEI(e);var g=c||"/gen_204?atyp=i&ct="+a+"&cad="+b+j+"&zx="+google.time();<\n>var k=/^http:/i;if(k.test(g)&&google.https()){google.ml(new Error("GLMM"),false,{src:g});delete i[f];return}d.src=g;h.li=f+1},lc:[],li:0,Toolbelt:{},y:{},x:function(a,b){google.y[a.id]=[a,b];return false}};<\n>window.google.sn="webhp";window.google.timers={};window.google.startTick=function(a,b){window.google.timers[a]={t:{start:(new Date).getTime()},bfr:!(!b)}};window.google.tick=function(a,b,c){if(!window.google.timers[a])google.startTick(a);window.google.timers[a].t[b]=c||(new Date).getTime()};google.startTick("load",true);try{}catch(u){}<\n>var _gjwl=location;function _gjuc(){var e=_gjwl.href.indexOf("#");if(e>=0){var a=_gjwl.href.substring(e);if(a.indexOf("&q=")>0||a.indexOf("#q=")>=0){a=a.substring(1);if(a.indexOf("#")==-1){for(var c=0;c<a.length;){var d=c;if(a.charAt(d)=="&")++d;var b=a.indexOf("&",d);if(b==-1)b=a.length;var f=a.substring(d,b);if(f.indexOf("fp=")==0){a=a.substring(0,c)+a.substring(b,a.length);b=c}else if(f=="cad=h")return 0;c=b}_gjwl.href="/search?"+a+"&cad=h";return 1}}}return 0}function _gjp(){!(window._gjwl.hash&&<\n>window._gjuc())&&setTimeout(_gjp,500)};<\n>window._gjp && _gjp()</script><style>#gb{font:13px/27px Arial,sans-serif;height:30px}#gbz,#gbg{position:absolute;white-space:nowrap;top:0;height:30px;z-index:1000}#gbz{left:0;padding-left:4px}#gbg{right:0;padding-right:5px}#gbs{background:transparent;position:absolute;top:-999px;visibility:hidden;z-index:998}.gbto #gbs{background:#fff}#gbx3,#gbx4{background-color:#2d2d2d;background-image:none;_background-image:none;background-position:0 -138px;background-repeat:repeat-x;border-bottom:1px solid #000;font-size:24px;height:29px;_height:30px;opacity:1;filter:alpha(opacity=100);position:absolute;top:0;width:100%;z-index:990}#gbx3{left:0}#gbx4{right:0}#gbb{position:relative}#gbbw{right:0;left:0;position:absolute;top:30px
    2759
    ecrit_curl size = 1
    ecrit_curl nmemb = 2759
    ecrit_curl stream = 0
    Failed writing received data to disk/application
    Les problèmes :
    1 - le buffer est tronqué à 2759 caractères (ça vient de curl ?, ça vient de mon code ? )
    2- le stream est à 0 or d'après ce que j'ai compris dans la doc, ça correspond à l'Id du fichier utilisé par curl (ai-je bien compris ?)
    3- Le message d'erreur à la fin qui dit que les données n'ont pas été écrites.

    Avez-vous des idées pour avancer, SVP ?

    Cordialement,
    M.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 56
    Points : 73
    Points
    73
    Par défaut
    Bon, j'ai un peu avancé, mais ce n'est pas encore ça.

    le code a été modifié comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    // curl Error Code
    nCURLE_OK est un entier = 0
     
    // curl_init_flag
    nCURL_GLOBAL_NOTHING est un entier = 0
    nCURL_GLOBAL_SSL est un entier = 1
    nCURL_GLOBAL_WIN32 est un entier = 2
    nCURL_GLOBAL_ALL est un entier = 3
    nCURL_GLOBAL_DEFAULT est un entier = 3
     
    // CURLoption
    nCURLOPT_ERRORBUFFER est un entier = 10010
    nCURLOPT_URL est un entier = 10002
    nCURLOPT_VERBOSE est un entier = 41
    nCURLOPT_WRITEDATA est un entier = 10001
    nCURLOPT_WRITEFUNCTION est un entier = 20011
     
    nId est un entier = fOuvre( "c:\test.html", foCréation + foLectureEcriture )
    SI ( nId > 0 ) ALORS
     
    	nContexte est un entier système
    	nCURLcode est un entier système
     
    	nCURLcode = AppelDLL32("libcurl", "curl_global_init", nCURL_GLOBAL_ALL)
    	nCURLcode = AppelDLL32("libcurl", "curl_global_init", nCURL_GLOBAL_WIN32)
    	nContexte = AppelDLL32( "libcurl", "curl_easy_init" )
    	nCURLcode = AppelDLL32( "libcurl", "curl_easy_setopt", nContexte, nCURLOPT_URL, "www.google.fr")
    	nCURLcode = AppelDLL32( "libcurl", "curl_easy_setopt", nContexte, nCURLOPT_VERBOSE, Vrai )
    	nCURLcode = AppelDLL32( "libcurl", "curl_easy_setopt", nContexte, nCURLOPT_WRITEDATA, nId )
    	nCURLcode = AppelDLL32( "libcurl", "curl_easy_setopt", nContexte, nCURLOPT_WRITEFUNCTION, &ecrit_curl )
    	nCURLcode = AppelDLL32( "libcurl", "curl_easy_perform", nContexte )
    	SI ( nCURLcode <> nCURLE_OK ) ALORS
     
    		n est un entier système 
    		n = AppelDLL32( "libcurl", "curl_easy_strerror", nCURLcode )
     
    		sErreur est une chaîne = ChaîneRécupère( n, crAdresseASCIIZ )
    		Trace(sErreur)
    	FIN
    	AppelDLL32( "libcurl", "curl_easy_cleanup", nContexte )
     
    	fFerme( nId )
     
    FIN
    et la procédure ecrit_curl a été testée en 2 versions :
    version 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    PROCEDURE ecrit_curl( ptr, size, nmemb, stream )
     
    sChaine est une chaîne = ChaîneRécupère( ptr, crAdresseASCIIZ )
    fEcritLigne( stream, sChaine )
     
    RENVOYER size * nmemb
    version 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    PROCEDURE ecrit_curl( ptr, size, nmemb, stream )
     
    sChaineConstruite est une chaîne = ""
    POUR i = 0 _A_ size * nmemb -1
     
    	pos est un entier système = ptr + i
    	nInt est un entier sur 1 octet sans signe
     
    	Transfert( &nInt, pos, Dimension( nInt ) )
    	sChaineConstruite += Caract( nInt )
    FIN
     
    fEcritLigne( stream, sChaineConstruite )
     
    RENVOYER size * nmemb
    Les deux versions ne donnent pas satisfaction car le code récupéré ne correspond pas au code source de la page www.google.fr récupéré depuis mon navigateur (FireFox en l’occurrence)

    Le code récupéré dans la version 2 et visiblement tronqué mais je ne vois pas trop où. Un problème qui vient probablement de mon code. mais où...

    Le code récupéré dans la version 1 est apparemment pollué par des données qui ne sont pas dans la page d'origine.

    Dans les 2 cas, le code obtenu par curl semble aussi avoir été remanié : certaines propriétés ne sont pas conformes au code original vu par Firefox.

    Je sèche un peu là ...
    Si quelqu'un a une idée pour avancer, ça serait sympa d'en faire part ici.

    Cordialement,

    M

  15. #15
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Citation Envoyé par M.Le_maudit Voir le message
    ...Dans les 2 cas, le code obtenu par curl semble aussi avoir été remanié : certaines propriétés ne sont pas conformes au code original vu par Firefox.
    N'ayant pas cUrl d'installé sur mon poste, je ne serais peut être pas d'un grand secours.

    Par contre je rebondis sur cette remarque; je pense que le code HTLM que t'affiche firefox n'est pas le vrai code qu'il reçoit, mais un code que firefox a déjà essayé de corrigé/adapté. J'ai déjà eu le cas.

    Si tu veux comparer les données brutes reçus, utilises wget en ligne de commande qui te sortira le résultat brut tel que le serveur l'envoi.

    Au pire sauvegarde le contenu que tu récupère par windev dans un fichier .html et charge le dans un navigateur.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  16. #16
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 96
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    J'ai le meme code sous windev12 mais j'ai une erreur GPF qui survient au renvoyer de la fonction callback.

    J'ai libcurl 7.37.0 et je suis sous windows 8 x64.

    J'ai essayer de typer chaque variable de la fonction en vain tjrs l'erreur GPF.

    Je sais plus quoi essayer.

    Merci de votre aide.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Bonjour,

    Citation Envoyé par brice01 Voir le message
    Bonjour,

    J'ai le meme code sous windev12 mais j'ai une erreur GPF qui survient au renvoyer de la fonction callback.

    J'ai libcurl 7.37.0 et je suis sous windows 8 x64.

    J'ai essayer de typer chaque variable de la fonction en vain tjrs l'erreur GPF.
    callback + GPF = mauvais pointeur d'adresse de fonction ou problème de convention d'appel (stdcall ou cdecl)

    ... probablement.


    stdcall est la convention d'appel des fonctions de l'API Windows.
    cdecl est la convention d'appel fréquemment utilisée pour les bibliothèques développées en C.

    Je crois que les fonctions de la bibliothèque libcurl suivent la convention d'appel cdecl, à moins que tu recompiles toi-même la bibliothèque en appliquant des modifications adaptées.

    Sous réserve que le problème vienne bien de la convention d'appel...
    si avec Windev il est possible de spécifier la convention d'appel à une fonction externe,
    à l'inverse comment modifier la convention d'appel à une procédure développée en WLangage pour un callback correct ?

    Bon courage.

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Comme je viens d'apprendre quelque chose, je réponds à ma question...

    Citation Envoyé par OnePoint Voir le message

    si avec Windev il est possible de spécifier la convention d'appel à une fonction externe,
    à l'inverse comment modifier la convention d'appel à une procédure développée en WLangage pour un callback correct ?
    La réponse est dans la doc de Windev (17 et suivants, à confirmer):

    Fonction API:
    http://doc.pcsoft.fr/fr-FR/?3014005
    Paragraphe:
    Procédure appelée en CallBack
    ... Pour utiliser une procédure callback en WLangage

    La convention d'appel des fonctions "CallBack" de la DLL doit être "stdcall" ou "cdecl". Par défaut, la convention d'appel est considérée comme étant "stdcall". Il est possible de déclarer une callback "cdecl" grâce à l'attribut d'extension "convention appel". Le prototype de la fonction devient :

    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROCEDURE <Nom de la procédure> (<Param1> est [un] <Type1>, ...
        <Param2> est [un] <Type2>) <convention appel=CDECL>

  19. #19
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,

    je suis peut-être complètement en dehors de la plaque mais pour faire mes transferts SFTP avec windev 12, j'utilisais la suite putty (putty. Et plus précisément PSFTP. Je n'ai pas le code sous la main à la seconde mais voici la trame de ce que je faisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Création du fichier .BAT de script de commandes PSFTP
    // Création du fichier .BAT de commandes pour lancer PSFTP
    // Un LanceAppli() qui va bien
    // Exécution du script php pour l'intégration des données dans la base mysql -> utilisation du "navigateur internet" windev
    Tout dépend de ce que tu veux faire. L'inconvénient est que tu as une fenêtre DOS qui s'ouvre, ce qui peut faire peur à utilisateur. Si je me souviens bien, il y a sur le forum un code de Jurassic Pork pour palier ce souci esthétique.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

Discussions similaires

  1. Problème sur l'utilisation de l'aPi en 1.3
    Par ncroiset dans le forum IGN API Géoportail
    Réponses: 8
    Dernier message: 11/06/2012, 13h48
  2. problème d'utilisation Curl
    Par sculpteur dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 06/05/2011, 17h35
  3. (Problème) Utilisation de l'API mySQL [Delphi 2005 Perso]
    Par will-scs dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/08/2005, 18h26
  4. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo