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

C Discussion :

Problème d'utilisation de curl_global_init + curl_easy_init() + curl_easy_setopt


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut Problème d'utilisation de curl_global_init + curl_easy_init() + curl_easy_setopt
    Bonjour, bonjour

    Je suis actuellement en train de réalisé un programme de teste sur une DLL, qui ma était fourni qui date de 2007.

    Donc voila mon problème, j'utilise des fonction de CURL et notamment curl_global_init + curl_easy_init() + curl_easy_setopt et j'ai des petits soucis avec ces fonctions.
    Et j'ai un peut du mal à comprendre à quoi elle servent malgré de nombreuse visite sur GOOGLE ^^ ( http://curl.haxx.se/libcurl/c/curl_easy_setopt.html ou http://curl.haxx.se/libcurl/c/http-post.html) plus certain forum mais je trouve pas une explication claire comme de l'au de roche ^^ et surtout une solution a mon problème.

    Voila mon code sa sera plus parlant:

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #include "curl\curl.h"
     
    STATUS TEDETIS_E_sendEnvelop(char CHEMIN_FLUX[], char* m_tdt_url,  char* retour)
    {
    	struct curl_httppost *post = NULL;
    	struct curl_httppost *last = NULL;
    	char* ok = NULL;
    	char* next_ok = NULL;
    	char* url = NULL;
    	CURL* handle;
    	int i = 0;
    	int taille = 0;
    	int curl_code = 0;
     
    	int** returnedEnv = 0;
    	char** erreurlist = NULL;
     
     
    	//Calcul de l'URL 
    	url = (char*)malloc(strlen(m_tdt_url) + strlen(PAGE_TRANSACTION) + 1);
    	sprintf(url, "%s%s", m_tdt_url, PAGE_TRANSACTION);
     
    	curl_formadd(&post, &last, CURLFORM_COPYNAME, "enveloppe", CURLFORM_FILE, CHEMIN_FLUX, CURLFORM_FILENAME, "EACT--123456725--20150821-8.tar.gz", CURLFORM_END);
    	curl_formadd(&post, &last, CURLFORM_COPYNAME, "api", CURLFORM_PTRCONTENTS, "1", CURLFORM_END);
     
    	curl_global_init(CURL_GLOBAL_ALL);
     
    	handle = curl_easy_init();
     
    	if (handle)
    	{
    		cout << "TEDETIS_E_sendEnvelop 4\n" << flush;
     
    		curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0);
    		curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 1);
    		curl_easy_setopt(handle, CURLOPT_SSLCERT, "certificat");
    		curl_easy_setopt(handle, CURLOPT_SSLKEY, "pkey");
    		curl_easy_setopt(handle, CURLOPT_URL, url);
    		curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, monwrite);
    		curl_easy_setopt(handle, CURLOPT_WRITEDATA, &retour);
    		curl_easy_setopt(handle, CURLOPT_HTTPPOST, post);
     
    		curl_code = curl_easy_perform(handle);
    		curl_easy_cleanup(handle);
    	}
     
    	curl_global_cleanup();
     
    	taille = strlen(retour) + 1;
    	ok = strtok(retour, "\n");
    	ok = strtok_s(retour, "\n", &next_ok);
     
    	if (!strcmp(ok, "OK")) 
    	{
    		taille = atoi(strtok(NULL, "\n"));
     
    		*returnedEnv = (int*)malloc((taille + 1)*sizeof(int));
    		(*returnedEnv)[0] = taille;
    		for (i = 1; i <= taille; i++) (*returnedEnv)[i] = atoi(strtok(NULL, "\n"));
    	}
    	else 
    	{
    		*erreurlist = (char*)malloc(taille);
    		strcpy(*erreurlist, strtok(NULL, "\0"));
    		return (COM_ENVELOPPE_KO);
    	}
     
    	return(curl_code);
    }
    Et donc mon problème si sa en est bien un c'est que mon programme se compile très bien et se lance mais dès qu'il arrive curl_global_init(CURL_GLOBAL_ALL) le programme plante ou de fois il passe la ligne mais plante juste en dessous.

    Donc je sais pas ce qu'il peut se passer et qu'est ce qui provoque cela....

    Et surtout comment le réglé.

    MERCI d'avance pour votre aide

  2. #2
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Bonjour,

    Ton code s'exécute depuis un thread ? (la documentation de curl précise que curl_global_init n'est pas thread-safe, du coup ça le fait moyen si tu lances ça depuis un thread ).

    Bref l'appel de curl_global_init ne devrait s'effectuer qu'une seule fois au début du programme (et accompagné d'un curl_global_cleanup à la fin pour tout nettoyer une fois que tu n'as plus besoin de curl).

    Sinon faire des curl_formadd avant que curl soit initialisé ça me paraît assez funky comme manière de faire

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut
    Citation Envoyé par supersnail Voir le message
    Bonjour,

    Ton code s'exécute depuis un thread ? (la documentation de curl précise que curl_global_init n'est pas thread-safe, du coup ça le fait moyen si tu lances ça depuis un thread ).

    Bref l'appel de curl_global_init ne devrait s'effectuer qu'une seule fois au début du programme (et accompagné d'un curl_global_cleanup à la fin pour tout nettoyer une fois que tu n'as plus besoin de curl).

    Sinon faire des curl_formadd avant que curl soit initialisé ça me paraît assez funky comme manière de faire
    Salut

    Alors si je dit pas de bêtise, mon code ne s’exécute pas dans un thread

    Et pour les curl_formadd c'est vrai que c'est mieux de les faire après l'initialisation de curl.
    Je vais retesté des maintenant et je tien au courant

    Merci déjà pour ton aide

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut
    Bon alors j'ai essayer de mettre les curl_formadd dans la boucle if(handle) donc après les curl_global_init(CURL_GLOBAL_ALL) et handle = curl_easy_init() mais absolument aucun résultat sa bloc toujours au niveau de curl_global_init(CURL_GLOBAL_ALL).

    Donc je vous l'ai savoir vu que je code en C++ est ce que on peut utilisé c'est fonctions??? (je voit pas d'objection mais bon )

    Et sachant que ou est fait l'appel des initialisations de CURL, c'est dans une DLL en C++ en DLL MFC et que mon programme de teste de ma DLL est un projet Win32 Application liée à ma DLL.

    Si il manque des précisions n’hésitè pas ou si je suis pas claire dite moi.

    MERCI d'avance

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut
    J'ai même tenté de mettre: curl_global_init(CURL_GLOBAL_ALL); au tout début :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    STATUS TEDETIS_E_sendEnvelop(char CHEMIN_FLUX[], char* final_name, char* m_tdt_url, /*struct curl_httppost* post,*/ char* retour)
    {
            curl_global_init(CURL_GLOBAL_ALL);
     
    	struct curl_httppost *post = NULL;
    	struct curl_httppost *last = NULL;
    	char* ok = NULL;
    	char* next_ok = NULL;
    	char* url = NULL;
    	CURL* handle;
    	int i = 0;
    	int taille = 0;
    	CURLcode curl_code;
    Mais sa bloc des que sa arrive a curl_global_init(CURL_GLOBAL_ALL) donc quesqui peut bien ce passe.
    J'ai bien include tout les lib:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <curl\curl.h>
    #include <curl\curlver.h>
    #include <curl\easy.h>
    #include <curl\mprintf.h>
    #include <curl\multi.h>
    #include <curl\stdcheaders.h>
    #include <curl\types.h>
    Mais la franchement je trouve pas de moyen de réglé ce problème.

    Donc si quelqu'un a la moindre idée je suis opérationnel pour testé

    Ou est ce qu'il existe une autre façon de faire en utilisant d'autre fonction:

    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
     
            curl_global_init(CURL_GLOBAL_ALL);
     
    	handle = curl_easy_init();
     
    	if (handle)
    	{
    		curl_formadd(&post, &last, CURLFORM_COPYNAME, "enveloppe", CURLFORM_FILE, (char*)CHEMIN_FLUX, CURLFORM_FILENAME, final_name, CURLFORM_END);
    		curl_formadd(&post, &last, CURLFORM_COPYNAME, "api", CURLFORM_PTRCONTENTS, "1", CURLFORM_END);
     
    		curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0);
    		curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 1);
    		curl_easy_setopt(handle, CURLOPT_SSLCERT, "certificat");
    		curl_easy_setopt(handle, CURLOPT_SSLKEY, "pkey");
    		curl_easy_setopt(handle, CURLOPT_URL, url);
    		curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, monwrite);
    		curl_easy_setopt(handle, CURLOPT_WRITEDATA, &retour);
    		curl_easy_setopt(handle, CURLOPT_HTTPPOST, post);
     
    		curl_code = curl_easy_perform(handle);
    	}
     
    	curl_easy_cleanup(handle);
     
    	curl_global_cleanup();

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut
    Et ce que sa se pourrait que j'utilise mal CURL???

    Ou que j'ai pas la bonne version ???

    Ou je sais pas que je sais plus codé


  7. #7
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Bonjour
    Je vais essayer de mon mieux pour vous orienter dans votre code.
    Pour commencer, il est important à nous bénévole de connaitre ce que vous souhaitez faire ou le but de votre fonction cela facilite pas mal de choses au lieu de nous laisser deviner que vous êtes en train d'écrire un serveur HTTPS ( à mon sens).
    Votre code comporte pas mal d'erreurs de compréhension et cela a des répercussions directes sur le code et l'ont voit tout de suite que vous naviguer un peu à l'aveuglette dans la rédaction de celle-ci.

    Citation Envoyé par titou34 Voir le message
    Et ce que sa se pourrait que j'utilise mal CURL???
    Ou que j'ai pas la bonne version ???
    Ou je sais pas que je sais plus codé
    Citation Envoyé par supersnail Voir le message
    Bonjour,
    Ton code s'exécute depuis un thread ? (la documentation de curl précise que curl_global_init n'est pas thread-safe, du coup ça le fait moyen si tu lances ça depuis un thread ).
    Bref l'appel de curl_global_init ne devrait s'effectuer qu'une seule fois au début du programme (et accompagné d'un curl_global_cleanup à la fin pour tout nettoyer une fois que tu n'as plus besoin de curl).
    Sinon faire des curl_formadd avant que curl soit initialisé ça me paraît assez funky comme manière de faire
    Complétant ce qui a été dit. D'un autre côté, il faut comprendre que "curl_global_init" ( curl_global_init(CURL_GLOBAL_ALL) à un rôle bien précis qui est d'initialiser l'ensemble de CURL pour qu'il soit correctement utilisé par les autres fonctions de la bibliothèque
    CURL_GLOBAL_ALL pour les tout les flag possible, CURL_GLOBAL_WIN32 initialise uniquement les socket pour win32, CURL_GLOBAL_SSL pour du SSL et CURL_GLOBAL_NOTHING pour ne rien initialiser.
    Et comme ce qui a été dit elle doit être appelée qu'une seule fois et faire attention dans le cas où vous utiliser des threas car il n'est pas safe thread.

    Citation Envoyé par titou34 Voir le message
    J'ai même tenté de mettre: curl_global_init(CURL_GLOBAL_ALL); au tout début :
    Mais sa bloc des que sa arrive a curl_global_init(CURL_GLOBAL_ALL) donc quesqui peut bien ce passe.
    J'ai bien include tout les lib:

    .........
    Mais la franchement je trouve pas de moyen de réglé ce problème.
    Donc si quelqu'un a la moindre idée je suis opérationnel pour testé
    Ou est ce qu'il existe une autre façon de faire en utilisant d'autre fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            (1)curl_global_init(CURL_GLOBAL_ALL);
    	(2)handle = curl_easy_init();
    Votre erreur est que vous faites appel deux fois à la fonction curl_global_init.
    La première est faite de façon direct ((1)première instruction). La seconde est faite indirectement par curl_easy_init() celle-ci initialise automatiquement CURL en fessant appelle à curl_global_init. Donc pour résoudre votre problème de curl_global_ini,t il est préférable de faire appel directement à curl_easy_init() et qui dit curl_easy_init() implique curl_easy_cleanup() qui permet de libérer la mémoire allouer par curl_easy_init().

    Citation Envoyé par titou34 Voir le message
    J'ai même tenté de mettre: curl_global_init(CURL_GLOBAL_ALL); au tout début :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    STATUS TEDETIS_E_sendEnvelop(char CHEMIN_FLUX[], char* final_name, char* m_tdt_url, /*struct curl_httppost* post,*/ char* retour)
    {
            curl_global_init(CURL_GLOBAL_ALL);
     
    	struct curl_httppost *post = NULL;
    	struct curl_httppost *last = NULL;
    	char* ok = NULL;
    	char* next_ok = NULL;
    	char* url = NULL;
    	CURL* handle;
    	int i = 0;
    	int taille = 0;
    	CURLcode curl_code;
    Mais sa bloc des que sa arrive a curl_global_init(CURL_GLOBAL_ALL) donc quesqui peut bien ce passe.
    J'ai bien include tout les lib:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <curl\curl.h>
    /* Pas d'utilité pour le reste 
     #include <curl\curl.h> suffit amplement  
    */
    <s>#include <curl\curlver.h></s>        
    <s>#include <curl\easy.h></s>
    <s>#include <curl\mprintf.h></s>
    <s>#include <curl\multi.h></s>
    <s>#include <curl\stdcheaders.h></s>
    <s>#include <curl\types.h></s>
    Mais la franchement je trouve pas de moyen de réglé ce problème.
    Donc si quelqu'un a la moindre idée je suis opérationnel pour testé
    Ou est ce qu'il existe une autre façon de faire en utilisant d'autre fonction:
    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
            curl_global_init(CURL_GLOBAL_ALL);
    	handle = curl_easy_init();
    
    	if (handle)
    	{
    		curl_formadd(&post, &last, CURLFORM_COPYNAME, "enveloppe", CURLFORM_FILE, (char*)CHEMIN_FLUX, CURLFORM_FILENAME, final_name, CURLFORM_END);
    		curl_formadd(&post, &last, CURLFORM_COPYNAME, "api", CURLFORM_PTRCONTENTS, "1", CURLFORM_END);
    
    		(3)curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0);
    		(4)curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 1);
    		curl_easy_setopt(handle, CURLOPT_SSLCERT, "certificat");
    		curl_easy_setopt(handle, CURLOPT_SSLKEY, "pkey");
    		curl_easy_setopt(handle, CURLOPT_URL, url);
    		(5)curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, monwrite);
    		(6)curl_easy_setopt(handle, CURLOPT_WRITEDATA, &retour);
    		curl_easy_setopt(handle, CURLOPT_HTTPPOST, post);
    
    		curl_code = curl_easy_perform(handle);
    	}
            /* Ou est passer la gestion d'erreur */
    	curl_easy_cleanup(handle);
    	(7)curl_global_cleanup();
    Certain point dans votre code source me semble (si je peux me le permettre) incohérent dont la façon dont vous specifiers vos options.
    (3) vous définissez que vous ne compter pas vérifier le certificat SSL mais avec (4) vous souhaiter vérifier la correspondance du certificat SSL avec le client distant serait-il pas prudent de faire vérifier le certificat et ensuite vérifier la correspondance de celle-ci avec le client disant ?.

    (5) Normalement ce paramétrage permet de gérer personnellement le fichier en mémoire garce à une fonction X mais dans votre cas nous ne savons pas grand-chose sur monwrite s'agit-il d'une fonction ou une variable ?.

    (6) Quant à cette option elle permet de fournir la donner qui va être utilisé par une fonction, la fonction X. En clair c'est un des arguments de la fonction X.

    (7) Est t'une source d'erreurs. il faut la retiré et comme ce que j'ai mentionné plus haut, si vous faites appel à la fonction curl_easy_init() alors vous devez faire appel à curl_easy_cleanup() à la fin c'est pareil pour si vous utilisez curl_global_init() alors vous allez faire appel à curl_global_cleanup() et pas comme vous les faites dans votre code source.

    Voici un exemple très simple qui utilise CURL et qui vous permettra d'avoir un aperçue de la façon dont on initialise CURL, configure certaines options etc.
    (il se peut que certain élément de code m'échappe lors de l'écriture du code sources donc à revoir. )
    Code C : 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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    /*
    * source.c
    * teste_curl
    *
    * Created by sambia39 on 07/09/2015.
    * Copyright (c) 2015 sambia39. GPLv3.
    */
     
    #include <errno.h>          
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
     
     
    /*  
      Cette fonction a pour rôle d'afficher le contenue de la page 
      de l'adresse qui lui a été fournie.
    */
    int f_data_url( char *ptr_url ){
     
        CURLcode ret_url;
        CURL *p_curl = NULL;
     
        /*  Teste url */
        if( (NULL) == ptr_url ){
            fprintf( stderr, "Aucune URL fournie\n" );
            return EXIT_FAILURE;
        }
     
        /*  Teste et initialisation CURL  */
        if( (NULL) == ( p_curl = curl_easy_init() ) ){
            fprintf( stderr, "(%d)\t:Echec initialisation CURL\n\t:%s\n",
                    errno, strerror(errno) );
            return EXIT_FAILURE;
        }
     
        /*  Paramétrage de CURL */
        curl_easy_setopt( p_curl, CURLOPT_URL, ptr_url );         /*  Fichier souhaité        */
        curl_easy_setopt( p_curl, CURLOPT_SSL_VERIFYPEER, 0 );    /*  Pas vérifier SSL        */ 
        curl_easy_setopt( p_curl, CURLOPT_SSL_VERIFYHOST, 0 );    /*  Pas vérifier SSL & HOST */
        ret_url = curl_easy_perform( p_curl );                    /*  Acquisition du fichier  */
        curl_easy_cleanup( p_curl );                              /*  free CURL               */
     
        /*  Teste retour  */
        if( (CURLE_OK) != ret_url ){
            fprintf( stderr, "(%d)\t:Erreur curl %d de %s\n\t:%s\n",
                    errno, ret_url, ptr_url, strerror(errno) );
            return EXIT_FAILURE;
        }
        return EXIT_SUCCESS;
    }
     
    /*  Fonction principal  */
    int main( void ){
     
        /* Teste conforme */
        if( (EXIT_FAILURE) == f_data_url( "http://www.google.com") )
            return EXIT_FAILURE;
     
         fprintf( stdout, "\n" );
     
         /* Teste d'erreur  */
         if( (EXIT_FAILURE) == f_data_url( "www.http://www.google.com") )
            return EXIT_FAILURE;
     
        return EXIT_SUCCESS;
    }

    Code STDOUT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
    <TITLE>302 Moved</TITLE></HEAD><BODY>
    <H1>302 Moved</H1>
    The document has moved
    <A HREF="http://www.google.fr/?gfe_rd=cr&amp;ei=MYjtVYqVNMeB7Qb685CYDg">here</A>.
    </BODY></HTML>
     
    (36)	:Erreur curl 1 de www.http://www.google.com
    	:Operation now in progress

    Citation Envoyé par titou34 Voir le message
    Bon alors j'ai essayer de mettre les curl_formadd dans la boucle if(handle) donc après les curl_global_init(CURL_GLOBAL_ALL) et handle = curl_easy_init() mais absolument aucun résultat sa bloc toujours au niveau de curl_global_init(CURL_GLOBAL_ALL).
    Donc je vous l'ai savoir vu que je code en C++ est ce que on peut utilisé c'est fonctions??? (je voit pas d'objection mais bon )
    Et sachant que ou est fait l'appel des initialisations de CURL, c'est dans une DLL en C++ en DLL MFC et que mon programme de teste de ma DLL est un projet Win32 Application liée à ma DLL.
    Si il manque des précisions n’hésitè pas ou si je suis pas claire dite moi.
    MERCI d'avance
    Il est préférable de lire les indications à propos de la DLL à fin de bien l'utiliser cela s'applique aussi à CURL.
    à bientôt

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut
    Déjà merci beaucoup pour ta réponse

    Alors en faite je vais posé le décore je suis un petit stagiaire à qui on a donner le boulot que personne ne foulais faire ^^
    La DLL qu'on a mit à ma disposition a était écrit en 2007 par un port du C++ à mon goût et moi j'ai pour mission de remettre cette DDL au goût du jours et de créé un programme qui va testé chaque fonctionnalité de cette DLL pour vérifier sont bon fonctionnement.

    Et j'ai bien du mal a comprend comment certaine partie de code on était codé et surtout a quoi elle serve.
    Et la donc je bloc sur ce que j'ai montré précédemment.

    Grâce au info que tu viens de me donné je vais essayer de réglé mon problème

    Pour répondre a monwrite, voila comment il est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int monwrite(char* buffer, size_t tailleBloc, size_t nombreBlocs, char** flot) 
    {
    	*flot = (char*)malloc(tailleBloc*(nombreBlocs + 1));
     
    	memcpy(*flot, buffer, tailleBloc*nombreBlocs);
     
    	(*flot)[tailleBloc*nombreBlocs] = '\0';
     
    	return (tailleBloc*nombreBlocs);
    }
    Mais encore une foi j'ai du mal a comprend tout a quoi sa sert.

    Je vais un peut encore mieux creusé les fonctions CURL et je reviendrai vers vous.

    MERCI

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut
    Bon alors j'ai testé comme sa :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    #include <curl\curl.h>
     
    int monwrite(char* buffer, size_t tailleBloc, size_t nombreBlocs, char** flot) 
    {
    	*flot = (char*)malloc(tailleBloc*(nombreBlocs + 1));
     
    	memcpy(*flot, buffer, tailleBloc*nombreBlocs);
     
    	(*flot)[tailleBloc*nombreBlocs] = '\0';
     
    	return (tailleBloc*nombreBlocs);
    }
     
    STATUS TEDETIS_E_sendEnvelop(char CHEMIN_FLUX[], char* final_name, char* m_tdt_url, char* retour)
    {
    	struct curl_httppost *post = NULL;
    	struct curl_httppost *last = NULL;
    	char* ok = NULL;
    	char* next_ok = NULL;
    	char* url = NULL;
    	CURL* handle = NULL;
    	int i = 0;
    	int taille = 0;
    	CURLcode curl_code;
     
    	int** returnedEnv = 0;
    	char** erreurlist = NULL;
     
    	url = (char*)malloc(strlen(url) + strlen(PAGE_TRANSACTION) + 1);
    	strcat(url, PAGE_TRANSACTION);
     
    	handle = curl_easy_init();
            if(handle != NULL)
            {
                 curl_code = curl_easy_setopt(handle, CURLOPT_URL, url);
    	     curl_code = curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0);
    	     curl_code = curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 0);
     
    	     curl_code = curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, monwrite);
    	     curl_code = curl_easy_setopt(handle, CURLOPT_WRITEDATA, &retour);
     
    	     curl_code = curl_easy_perform(handle);
    	     curl_easy_cleanup(handle);
           }
     
    	taille = strlen(retour) + 1;
    	ok = strtok(retour, "\n");
     
    	if (!strcmp(ok, "OK")) 
    	{
    		taille = atoi(strtok(NULL, "\n"));
    		*returnedEnv = (int*)malloc((taille + 1)*sizeof(int));
    		(*returnedEnv)[0] = taille;
    		for (i = 1; i <= taille; i++) (*returnedEnv)[i] = atoi(strtok(NULL, "\n"));
    	}
    	else 
    	{
    		*erreurlist = (char*)malloc(taille);
    		strcpy(*erreurlist, strtok(NULL, "\0"));
     
    		return (COM_ENVELOPPE_KO);
    	}
     
    	return (SUCCESS);
    }
    Et donc sa bloc toujours au même endroit c'est a dire que la compilation s'effectue correctement sans erreur mais au lancement du .exe et bien sa bloc sur handle = curl_easy_init(); donc je comprend pas pourquoi il est pas content

    j'ai vraiment du mal avec CURL c'est étrange.

    Donc est ce que sa se pourrait que CURL soit pas bien installer??? Du moins j'ai pas la bonne version ou quoi??

    MERCI

  10. #10
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    C'est ce que je pensais. La fonction monwrite est là pour géré de façon dynamique les informations en mémoire.
    Mais cependant il y a un souci dans la fonction.
    Si nous revoyons votre code de départ, il est clair que vous écrasez l'ancienne valeur de votre variable préalablement allouer quelque part dans votre code.

    Citation Envoyé par titou34 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int monwrite(char* buffer, size_t tailleBloc, size_t nombreBlocs, char** flot) 
    {
    	*flot = (char*)malloc(tailleBloc*(nombreBlocs + 1)); /* Ecrasement des donnée à coup sur */
    
    	memcpy(*flot, buffer, tailleBloc*nombreBlocs);
    
    	(*flot)[tailleBloc*nombreBlocs] = '\0';
    
    	return (tailleBloc*nombreBlocs);
    }
    En clair, la fonction doit avoir un rôle bien simple qui est d'augmenter si nécessaire la taille des données afin de contenir l'ensemble des informations à chaque appel de celle-ci par CURL. Hors dans votre cas, la fonction va tout simplement écraser les anciennes valeurs déjà écrites par CURL contenue dans votre variable &retour que vous avez specifier comme argument l'hors de la configuration des options CURL.
    Citation Envoyé par titou34 Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    curl_easy_setopt(handle, CURLOPT_WRITEDATA, &retour);
    Normalement le code sources doit être de la forme ci-dessous je me suis basé sur mon exemple de départ en ajoutant et modifiant quelques éléments.
    Je n'ai pas tester le code il est donc possible qu'il comporte des erreurs.
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    /*
    * source.c
    * teste_curl (2)
    *
    *   /!\: Attention le code est susceptible de comporter des erreurs
    *        et générer une erreur de désallocation 
    *
    * Created by sambia39 on 07/09/2015.
    * Copyright (c) 2015 sambia39. GPLv3.
    */
     
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
     
    /* 
        Fonction qui a pour rôle de traiter 
        les données en mémoire de façon dynamique.
    */
    size_t f_str( void *p_buff, size_t size, size_t snblock, void *pdata ){
     
        void *ptr = NULL;
        char *p = (char*)pdata;                     
        size_t size_data = strlen(p);
        size_t size_data_max = size * snblock;
     
        /*  Si la taille insuffisante ré-allouer */
        if( size_data < ( size_data_max + size_data ) ){
            if( (NULL) == (ptr = realloc( p, (size_data_max + size_data) * sizeof(char))) ){
                free( pdata );
                pdata = NULL;
                fprintf( stderr, "(%d)\t:Echec reallocation data curl\n\t:%s\n",
                        errno, strerror(errno) );
                return EXIT_FAILURE;
            }
        }
     
        p = ptr;
        ptr = NULL;
        memcpy( p, p_buff, (size_data_max + size_data) );
        p[ ( size_data_max + size_data) ] = '\0';
        return strlen(p);
    }
     
    /*  
      Cette fonction a pour rôle de fournir le contenue de la page 
      de l'adresse qui lui a été fournie.
    */
    char *f_data_url( char *ptr_url ){
     
        CURLcode ret_url;
        char *p_data = NULL;
        CURL *p_curl = NULL;
     
        /*  Teste url */
        if( (NULL) == ptr_url ){
            fprintf( stderr, "Aucune URL fournie\n" );
            return NULL;
        }
     
        /*  Allocation mémoire data */
        if( (NULL) == ( p_data = calloc( 150, sizeof(char) )) ){
            fprintf( stderr, "(%d)\t:Echec allocation mémoire\n\t:%s\n",
                    errno, strerror(errno) );
            return NULL;
        }
     
        /*  Teste et initialisation CURL  */
        if( (NULL) == ( p_curl = curl_easy_init() ) ){
            free( p_data );
            p_data = NULL;
            fprintf( stderr, "(%d)\t:Echec initialisation CURL\n\t:%s\n",
                    errno, strerror(errno) );
            return NULL;
        }
     
        /*  Paramétrage de CURL */
        curl_easy_setopt( p_curl, CURLOPT_URL, ptr_url );         /*  Fichier souhaité        */
        curl_easy_setopt( p_curl, CURLOPT_SSL_VERIFYPEER, 0 );    /*  Pas vérifier SSL        */
        curl_easy_setopt( p_curl, CURLOPT_SSL_VERIFYHOST, 0 );    /*  Pas vérifier SSL & HOST */
        curl_easy_setopt( p_curl, CURLOPT_WRITEFUNCTION, f_str);  /*  Stockage et traiment    */
        curl_easy_setopt( p_curl, CURLOPT_WRITEDATA, p_data );    /*  Aquisition data         */
        ret_url = curl_easy_perform( p_curl );                    /*  Acquisition du fichier  */
        curl_easy_cleanup( p_curl );                              /*  free CURL               */
     
        /*  Teste retour  */
        if( ((CURLE_OK) == ret_url) && ((NULL) != p_data )){
            return p_data;
        }else{
            if( (NULL) != p_data ){
                free( p_data );
                p_data = NULL;
            }
            fprintf( stderr, "(%d)\t:Erreur curl %d de %s\n\tDATA:%s\n\t:%s\n",
                    errno, ret_url, ptr_url, p_data, strerror(errno) );
            return NULL;
        }
    }
     
    /*  Fonction principal  */
    int main( void ){
     
        char *p = NULL;
        if( (NULL) == ( p = f_data_url("http://www.google.com")) ){
            return EXIT_FAILURE;
        }
     
        fprintf( stdout,"OUT\t:\n%s\n", p );
        free( p );
        p = NULL;
     
        return EXIT_SUCCESS;
    }

    Citation Envoyé par titou34 Voir le message
    Déjà merci beaucoup pour ta réponse
    Alors en faite je vais posé le décore je suis un petit stagiaire à qui on a donner le boulot que personne ne foulais faire ^^
    La DLL qu'on a mit à ma disposition a était écrit en 2007 par un port du C++ à mon goût et moi j'ai pour mission de remettre cette DDL au goût du jours et de créé un programme qui va testé chaque fonctionnalité de cette DLL pour vérifier sont bon fonctionnement.

    Et j'ai bien du mal a comprend comment certaine partie de code on était codé et surtout a quoi elle serve.
    Et la donc je bloc sur ce que j'ai montré précédemment.

    Grâce au info que tu viens de me donné je vais essayer de réglé mon problème

    Pour répondre a monwrite, voila comment il est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int monwrite(char* buffer, size_t tailleBloc, size_t nombreBlocs, char** flot) 
    {
    	*flot = (char*)malloc(tailleBloc*(nombreBlocs + 1));
     
    	memcpy(*flot, buffer, tailleBloc*nombreBlocs);
     
    	(*flot)[tailleBloc*nombreBlocs] = '\0';
     
    	return (tailleBloc*nombreBlocs);
    }
    Mais encore une foi j'ai du mal a comprend tout a quoi sa sert.
    Je vais un peut encore mieux creusé les fonctions CURL et je reviendrai vers vous.
    MERCI
    Il est préférable d'avoir le code source de la DLL afin comprendre les choses. Dans le cas actuel j'imagine juste comment cela devrait être fait donc d'une certaine manière je roule en mode suppositions. Et ma remarque du premier poste est toujours d'actualité documenté vous sur CURL et votre DLL afin de comprendre et effectuer correctement vos tests sur la DLL voir la corriger.
    à bientôt

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Il est préférable d'avoir le code source de la DLL afin comprendre les choses. Dans le cas actuel j'imagine juste comment cela devrait être fait donc d'une certaine manière je roule en mode suppositions. Et ma remarque du premier poste est toujours d'actualité documenté vous sur CURL et votre DLL afin de comprendre et effectuer correctement vos tests sur la DLL voir la corriger.
    à bientôt
    Bonjour, sambia,

    Déjà encore merci pour ton aide très précieuse

    Donc je vais essayer d'être plus claire sur le fonctionnement de ma DLL.

    Alors ma DLL pour être claire permet de faire la traduction entre un logiciel et un service de signature électronique pour les collectivités. Au stade ou j'en suis en doit envoyer un fichier en .tar.gz à la plat-forme de signature.

    La fonction que je veux utilisé je me suis rendu compte que il y a une répétition de code un peut partout donc j'ai remit un peut sa au propre et je vais essayer d'être claire ^^ et de mettre les étapes du code:

    code de mon : "ProgrammeTesteDLL.exe"

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
     
    /*
    * ProgrammeTesteDLL.cpp
    *
    * Created by titou34 on 08/09/2015.
    * Copyright (c) 2015 titou34. GPLv3.
    * DR
    * « Tous droits réservés », « All rights reserved »
    */
     
    void main()
    {
    	int L_ChoixUtilisateur = 0;
     
    	char INFO_SESSION[] = "";
    	char NOM_TC[] = "nom";
    	char VERSION_DLL[] = "version";
    	char TYPE_TRANSMISSION[] = "1.1";
    	char CHEMIN_FLUX[] = "C:\\Users\\association\\Desktop\\DLL+Programme 19-08-2015\\TiersdeConfiance\\TiersdeConfiance\\Debug\\cert\\SLO-EACT--123456725--20150821-8.tar.gz";
    	char FLUX_RETOUR[] = "";
     
    	int L_RecuperationInfoSESSION = 0;	//OUVERTURE DE SESSION
    	int L_RecuperationFermetureInfoSession = 0; //FERMETURE SESSION
    	int L_RecuperationInfoDLL = 0;	//INFORMATIONS SUR LA DLL
     
    	int CODE_ERROR = 0;	//MESSAGE D'ERREUR
    	CMessageError MessageError;		//MESSAGE D'ERREUR
     
    	int L_teste = 0; //Transmettre un flux de donnees
    	int L_RecuperationInfoENVOI = 0;	//Transmettre un flux de donnees	
     
    	do
    	{
    		cout << "--------------------------------------------------------------------------------";
    		cout << "Si vous voulez : " << endl << "\tOuvrir une Session --> tapez 1" << endl << "\tFermer une Session --> tapez 2" << endl << "\tLa version de la DLL --> tapez 3" << endl << "\tCodes d'erreur --> tapez 4" << endl << "\tTransmettre un flux de donnees --> tapez 5" << endl << "\tAccuse de reception d'un flux de donnees --> tapez 6" << endl << "\tFermer le programme --> tapez 7" << endl;
    		cout << "--------------------------------------------------------------------------------" << endl;
    		cin >> L_ChoixUtilisateur;
     
    		switch (L_ChoixUtilisateur)
    		{
    			case 1: //OUVERTURE DE SESSION
    			{
    				system("cls");
     
    				cout << "############################ OUVERTURE DE SESSION ############################" << endl;
    				cout << "Permet de teste l'ouverture d'une session de connexion vers la plateforme du\nTiers de Confiance" << endl;
     
    				L_RecuperationInfoSESSION = CTiersdeConfianceAuto::OPENSESSION(INFO_SESSION);
     
    				if (L_RecuperationInfoSESSION == 1)
    				{
    					cout << endl << "OUVERTURE SESSION REUSSI" << endl << "Information sur la session : " << INFO_SESSION << endl;
    				}
    				else
    				{
    					cout << endl << "ECHEC DE L'OUVERTURE SESSION" << endl;
    					MessageError.AfficherMessageError(L_RecuperationInfoSESSION);
    				}
     
    				break;
    			}
     
    			case 2: //FERMETURE SESSION
    			{
    				system("cls");
     
    				cout << "############################ FERMETURE DE SESSION ############################" << endl;
    				cout << "Permet de teste la fermeture d'une session de connexion vers la plateforme du\nTiers de Confiance" << endl;
     
    				L_RecuperationFermetureInfoSession = CTiersdeConfianceAuto::CLOSESESSION(INFO_SESSION);
     
    				if (L_RecuperationFermetureInfoSession == 1)
    				{
    					cout << endl << "FERMETURE SESSION REUSSI" << endl;
    				}
    				else
    				{
    					cout << endl << "ECHEC DE LA FERMETURE SESSION" << endl;
    					MessageError.AfficherMessageError(L_RecuperationFermetureInfoSession);
    				}
     
    				break;
    			}
     
    			case 3: //INFO DLL
    			{
    				system("cls");
     
    				cout << "########################### INFORMATIONS SUR LA DLL ###########################" << endl;
    				cout << "Permet d'afficher le nom du Tiers de Confiance et a version de la DLL" << endl;
     
    				L_RecuperationInfoDLL = CTiersdeConfianceAuto::VERSIONDLL(NOM_TC, VERSION_DLL);
     
    				if (L_RecuperationInfoDLL == 1)
    				{
    					cout << endl << "RECUPERATION REUSSIE" << endl;
    					cout << "Nom du Tiers de Confiance : " << NOM_TC << endl;
    					cout << "Version de la DLL : " << VERSION_DLL << endl << endl << endl;
    				}
    				else
    				{
    					cout << endl << "ECHEC DE LA RECUPERATION" << endl;
    					MessageError.AfficherMessageError(L_RecuperationInfoDLL);
    				}
     
     
    				break;
    			}
     
    			case 4: //MESSAGE ERROR
    			{
    				system("cls");
     
    				cout << "############################### MESSAGE D'ERREUR ###############################" << endl;
    				cout << "Permet d'afficher le message correspondant a un code d'erreur" << endl;
     
    				cout << endl << endl << "Les codes erreures sont compris entre 0 et 22" << endl << endl;
    				cout << endl << "Taper le code d'erreur voulez-vous voir : ";
    				cin >> CODE_ERROR;
     
    				MessageError.AfficherMessageError(CODE_ERROR);
     
    				break;
    			}
     
    			case 5: //Transmettre un flux de donnees
    			{
    				system("cls");
     
    				cout << "####################### Transmettre un flux de donnees #######################" << endl;
    				cout << "Permet d'envoyer un flux de donnees vers la plateforme du Tiers de Confiance" << endl;
    				cout << endl << endl;
     
    				L_teste = CTiersdeConfianceAuto::OPENSESSION(INFO_SESSION);
     
    				if (L_teste == 1)
    				{
    					L_RecuperationInfoENVOI = CTiersdeConfianceAuto::ENVOI(INFO_SESSION, TYPE_TRANSMISSION, CHEMIN_FLUX, FLUX_RETOUR);
     
    					if (L_RecuperationInfoENVOI == 1)
    					{
    						cout << endl << "ENVOI REUSSI" << endl << "Flux retour : " << FLUX_RETOUR << endl << endl << endl;
    					}
    					else
    					{
    						cout << endl << "ECHEC DE L'ENVOI" << endl;
    						MessageError.AfficherMessageError(L_RecuperationInfoENVOI);
    					}
    				}
    				else
    				{
    					cout << "Echec ouverture SESSION" << endl;
    					MessageError.AfficherMessageError(L_teste);
    				}
     
    				break;
    			}
     
    			case 6: //Accuse de reception d'un flux de donnees
    			{
    				system("cls");
     
    				cout << "################### Accuse de reception d'un flux de donnees ###################" << endl;
    				cout << "Permet de recuperer l'accuse de reception d'un flux de donnees via la plateforme du Tiers de Confiance" << endl;
     
    				//CTiersdeConfianceAuto::AR(LPCTSTR INFO_SESSION, LPCTSTR TYPE_RECUPERATION, LPCTSTR IDENT, BSTR FAR* FLUX_RETOUR);
     
    				break;
    			}
     
    			case 7: //FIN PROGRAMME
    			{
    				system("cls");
     
    				cout << endl << endl << endl << endl << endl << endl << endl << "################################ FIN PROGRAMME ################################" << endl;
    				Sleep(1000);
    				AfxOleUnlockApp();
     
    				break;
    			}
     
    			default:
    			{
    				L_ChoixUtilisateur = 0;
    				break;
    			}
    		}
     
    	} while (L_ChoixUtilisateur != 7);
    	AfxOleUnlockApp();
    }
    Toujours dans "ProgrammeTesteDLL.exe"

    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
     
    /*
    * MessageError.h
    *
    * Created by titou34 on 08/09/2015.
    * Copyright (c) 2015 titou34. GPLv3.
    * DR
    * « Tous droits réservés », « All rights reserved »
    */
     
    #pragma once
    class CMessageError
    {
    public:
    	const char* L_MessageErreur = NULL;
     
    	CMessageError();
     
    	void AfficherMessageError(int CODE_ERROR);
     
    	~CMessageError();
    };
    Toujours dans "ProgrammeTesteDLL.exe"

    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
     
    /*
    * MessageError.cpp
    *
    * Created by titou34 on 08/09/2015.
    * Copyright (c) 2015 titou34. GPLv3.
    * DR
    * « Tous droits réservés », « All rights reserved »
    */
    #include "stdafx.h"
    #include "MessageError.h"
     
    #include "TiersdeConfianceAuto.h"
    #include "Constant.h"
     
    #include <iostream>
    using namespace std;
     
     
    CMessageError::CMessageError()
    {
    }
     
    void CMessageError::AfficherMessageError(int CODE_ERROR)
    {
    	L_MessageErreur = CTiersdeConfianceAuto::MESSAGE_ERROR(CODE_ERROR);
     
    	cout << "Le code d'erreur : " << CODE_ERROR << " signifie : " << L_MessageErreur << endl << endl << endl;
    }
     
    CMessageError::~CMessageError()
    {
    }
    Donc a je vais juste zoomé sur la fonction ENVOI qui m’intéresse plus particulièrement
    On passe dans "TiersdeConfiance.dll"

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    /*
    * TiersdeConfianceAuto.h
    *
    * Created by titou34 on 08/09/2015.
    * Copyright (c) 2015 titou34. GPLv3.
    * DR
    * « Tous droits réservés », « All rights reserved »
    */
    #pragma once
     
    #include "SessionTab.h"
    #include "Log.h"
     
    #define TiersdeConfianceAuto_API __declspec(dllexport) 
     
    class CTiersdeConfianceAuto : public CCmdTarget
    {
    	DECLARE_DYNCREATE(CTiersdeConfianceAuto)
     
    	CTiersdeConfianceAuto(); // protected constructor used by dynamic creation
     
    private:
    	static char* m_tdt_url;
    	static CLog* m_logger;
    	static char* m_certificate_path;
    	static char* m_repository_path;
    	static char* m_tdt_passphrase;
    	static int isinit;
     
    	static int init();
    	int monwrite1(char* buffer, size_t tailleBloc, size_t nombreBlocs, char** flot);
    	static int sslconnect(char* page, struct curl_httppost* post, char** retour);
     
    public:
    	static char* m_tdt_trigramme;
    	static CSessionTab m_session_tab;
     
    	static bool readConfigFile(char* file_name, char** out);
    	virtual void OnFinalRelease();
     
    protected:
    	DECLARE_MESSAGE_MAP()
    	DECLARE_OLECREATE(CTiersdeConfianceAuto)
     
    	CString m_dbuser;
    	afx_msg void OnDbuserChanged();
     
    	CString m_database;
    	afx_msg void OnDatabaseChanged();
     
    	CString m_password;
    	afx_msg void OnPasswordChanged();
     
    	static TiersdeConfianceAuto_API afx_msg int ENVOI(char INFO_SESSION[], char TYPE_TRANSMISSION[], char CHEMIN_FLUX[], char FLUX_RETOUR[]);
     
    	afx_msg int AR(char* INFO_SESSION, char* TYPE_RECUPERATION, char* IDENT, char* FLUX_RETOUR);
     
    	afx_msg int SIGNATUREAGENT(char* TYPE_SIGNATURE, char* CHEMIN_FLUX, char* FLUX_RETOUR);
     
    	static TiersdeConfianceAuto_API afx_msg int OPENSESSION(char INFO_SESSION[]);
     
    	static TiersdeConfianceAuto_API afx_msg int CLOSESESSION(char INFO_SESSION[]);
     
    	static TiersdeConfianceAuto_API afx_msg int VERSIONDLL(char NOM_TC[], char VERSION_DLL[]);
     
    	static TiersdeConfianceAuto_API afx_msg const char* MESSAGE_ERROR(int CODE_ERROR);
     
    	TiersdeConfianceAuto_API virtual ~CTiersdeConfianceAuto();
     
    	DECLARE_DISPATCH_MAP()
    	DECLARE_INTERFACE_MAP()
    };
    Toujours dans "TiersdeConfiance.dll"

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
     
    /*
    * TiersdeConfianceAuto.cpp
    *
    * Created by titou34 on 08/09/2015.
    * Copyright (c) 2015 titou34. GPLv3.
    * DR
    * « Tous droits réservés », « All rights reserved »
    */
    #include "stdafx.h"
    #include "TiersdeConfianceAuto.h"
     
    #include <comdef.h>
    #include <locale.h>
    #include <iostream>
     
    using namespace std;
     
    #include <openssl\applink.c>
    #include <openssl\pem.h>
    #include <openssl\err.h>
    #include <openssl\ssl.h>
    #include <openssl\evp.h>
    #include <openssl\pkcs12.h>
     
    #include <libxml\tree.h>
    #include <libxml\parser.h>
    #include <libxml\xpath.h>
    #include <libxml\xpathInternals.h>
    #include <libxml\xmlschemas.h>
     
    #include <curl\curlver.h>
    #include <curl\curl.h>
    #include <curl\stdcheaders.h>
    #include <curl\types.h>
    #include <curl\mprintf.h>
    #include <curl\multi.h>
    #include <curl\easy.h>
     
    #include "TedetisEnvelop.h"
    #include "Constant.h"
    #include "SessionTab.h"
    #include "TiersdeConfiance.h"
     
     
    char* CTiersdeConfianceAuto::m_tdt_url;
    CLog* CTiersdeConfianceAuto::m_logger;
    char* CTiersdeConfianceAuto::m_certificate_path;
    char* CTiersdeConfianceAuto::m_repository_path;
    char* CTiersdeConfianceAuto::m_tdt_passphrase;
    int CTiersdeConfianceAuto::isinit;
    char* CTiersdeConfianceAuto::m_tdt_trigramme;
    CSessionTab CTiersdeConfianceAuto::m_session_tab;
     
     
    IMPLEMENT_DYNCREATE(CTiersdeConfianceAuto, CCmdTarget)
     
    CTiersdeConfianceAuto::CTiersdeConfianceAuto()
    {
    	EnableAutomation();
     
    	AfxOleLockApp();
     
    	isinit = 0;
    	m_repository_path = NULL;
    	m_tdt_passphrase = NULL;
    	m_certificate_path = NULL;
    	m_logger = NULL;
    }
     
    /////////////////////////////////////////////////////////////////////////////
    // CTiersdeConfianceAuto message handlers
     
    int CTiersdeConfianceAuto::monwrite1(char* buffer, size_t tailleBloc, size_t nombreBlocs, char** flot)
    {
    	*flot = (char*)malloc(tailleBloc*(nombreBlocs + 1));
    	memcpy(*flot, buffer, tailleBloc*nombreBlocs);
    	(*flot)[tailleBloc*nombreBlocs] = '\0';
     
    	return (tailleBloc*nombreBlocs);
    }
     
    int CTiersdeConfianceAuto::sslconnect(char* page, struct curl_httppost* post, char** retour)
    {
    	char* url = NULL;
    	CURLcode curl_code;
    	CURL* handle = NULL;
     
    	/*Calcul de l'URL */
    	url = (char*)malloc(strlen(m_tdt_url) + strlen(page) + 1);
    	sprintf(url, "%s%s", m_tdt_url, page);
     
    	/*Création du handle CURL */
    	handle = curl_easy_init();
    	if (handle != NULL)
    	{
    		curl_code = curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0);
    		curl_code = curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 1);
    		curl_code = curl_easy_setopt(handle, CURLOPT_SSLCERT, "certificat");
    		//curl_code = curl_easy_setopt(handle, CURLOPT_SSLCERTPASSWD, m_tdt_passphrase); 
    		curl_code = curl_easy_setopt(handle, CURLOPT_SSLKEY, "pkey");
    		//curl_code = curl_easy_setopt(handle, CURLOPT_SSLKEYPASSWD, m_tdt_passphrase); 
     
    		/*curl_code = curl_easy_setopt(handle, CURLOPT_SSLCERT, m_certificate_path);
    		curl_code = curl_easy_setopt(handle, CURLOPT_SSLCERTTYPE, "P12");
    		curl_code = curl_easy_setopt(handle, CURLOPT_SSLKEYPASSWD, m_tdt_passphrase); */
     
    		curl_code = curl_easy_setopt(handle, CURLOPT_URL, url);
    		curl_code = curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, &monwrite1);
    		curl_code = curl_easy_setopt(handle, CURLOPT_WRITEDATA, retour);
     
    		if (post != NULL)
    		{
    			curl_code = curl_easy_setopt(handle, CURLOPT_HTTPPOST, post);
    		}
     
    		curl_code = curl_easy_perform(handle);
    		curl_easy_cleanup(handle);
    	}
     
    	/*Libération resssource locale*/
    	free(url);
     
    	return (curl_code);
    }
     
     
    /******************************************************************************************************************
    *                                                                                                                                                                                                                                 *
    *                                       Fonction permettant d'envoyer une enveloppe FAST contenant une enveloppe métier               *
    *                                                                                                                 *
    ******************************************************************************************************************/
    int CTiersdeConfianceAuto::ENVOI(char INFO_SESSION[], char TYPE_TRANSMISSION[], char CHEMIN_FLUX[], char FLUX_RETOUR[])
    {
    	CTime theTime;
    	CString  s;
    	char* id = NULL;
    	struct curl_httppost* post = NULL;
    	struct curl_httppost* last = NULL;
    	char* drive = NULL; /* non CUtilisé cf MSDN */
    	char* dir = NULL; /* non CUtilisé cf MSDN */
    	char* fname = NULL;
    	char* ext = NULL;
    	char* final_name = NULL;
    	char* retour = NULL;
    	char* ok = NULL;
    	char* next_ok = NULL;
    	char* nb = NULL;
    	int ok_ok = 0;
    	int curl_code = 0;
     
    	id = INFO_SESSION;
     
    	if (!m_session_tab.getSession(atoi(id)))
    	{
    		m_logger->logger(SESSION_INVALID_CODE_ERR);
    		return SESSION_INVALID_CODE_ERR;
    	}
     
    	/*Calcul du champs POST */
    	fname = (char*)malloc(strlen(CHEMIN_FLUX) + 1);
    	ext = (char*)malloc(strlen(CHEMIN_FLUX) + 1);
     
    	_splitpath((char*)CHEMIN_FLUX, drive, dir, fname, ext);
     
    	final_name = (char *)malloc(strlen(CHEMIN_FLUX) + 4);
    	sprintf(final_name, "%s%s", fname, ext);
     
    	curl_formadd(&post, &last, CURLFORM_COPYNAME, "enveloppe", CURLFORM_FILE, CHEMIN_FLUX, CURLFORM_FILENAME, final_name, CURLFORM_END);
    	curl_formadd(&post, &last, CURLFORM_COPYNAME, "api", CURLFORM_PTRCONTENTS, "1", CURLFORM_END);
     
    	free(fname);
    	free(ext);
     
    	curl_code = sslconnect(PAGE_TRANSACTION, post, &retour);
     
    	if (curl_code != CURLE_OK)
    	{
    		return COM_NO_REMOTE_HOST; // on est pas arrivé à programmer correctement libcurl
    	}
     
    	ok = strtok(retour, "\n");
     
    	if (!strcmp(ok, "OK"))
    	{
    		ok_ok = 1;
    	}
    	else
    	{
    		ok_ok = 0;
    	}
     
    	if (ok_ok == 1)
    	{
    		ok = strtok(NULL, "\n");
    		ok = strtok(NULL, "\n");
     
    		nb = (char *)malloc(strlen(ok) + 1);
     
    		strcpy(nb, ok);
    		free(retour);
    		retour = (char *)malloc(2048);
     
    		setlocale(LC_ALL, "");
    		theTime = CTime::GetCurrentTime();
    		s = theTime.Format("%d/%m/%Y %H:%M:%S");
     
    		sprintf(retour, XML_RETOUR, nb, nb, final_name, s);
    		free(nb);
    	}
     
    	FLUX_RETOUR = retour;
    	free(retour);
     
    	if (ok_ok == 1)
    	{
    		return SUCCESS_CODE_RET;
    	}
    	else
    	{
    		return COM_ENVELOPPE_KO;
    	}
     
    	free(final_name);
    }
    Voila normalement c'est tout le code qui devrai s'exécuté. (Si il te manque du code pour comprendre n'hésite pas)

    Le code que je viens de mettre correspond au code que j'ai pas touché comme sa il doit y avoir l'idée de base. Et contrairement o poste d'avant quand je montré TEDETIS_E_sendEnvelop je me suis rendu conte que sslconnect fait exactement la même chose à quelque chose près.

    Et j'ai déjà procédé à certaine modification que tu ma proposé précédemment ce que je te remercie car sa va considérablement je pense amélioré le mon code mais j'ai vraiment le soucis que mon programme se compile mais a l'exécution il bloc sur handle = curl_easy_init(); et ne vas pas plus loin.

    Merci pour ton aide très précieuse.

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut
    Alors j'ai recréé un projet en DLL MFC car je commencé a faire n'importe quoi, et je suis repartie du code de base (le code tout pourris )

    Et donc maintenant j'ai des erreurs de LINK à la compilation en relation avec CURL :

    Nom : 888.PNG
Affichages : 680
Taille : 37,1 Ko

    Puis j'ai des erreurs aussi de LINK à la compilation en relation avec OPENSSL :

    Nom : 1000.PNG
Affichages : 638
Taille : 37,1 Ko

    Et j'ai trouvé plein de fonction redondante et ça commence a être la guerre dans ma tête la

    MERCI D'AVANCE POUR VOTRE AIDE

  13. #13
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Bonsoir
    Effectivement ça pique un peut les yeux le code sources. Cependant pour ce qui est du link il faut ajouter les options link à votre projet pour que l'IDE puisse faire correctement son boulot exemple avec la libCurl
    Code gcc : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc source.c -Wall -g -lcurl -o out_curl_test
    .
    Avez essayer de tester CURL seul sans votre DLL dans des nouveaux projets comme ceci.
    Code C : 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
     
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
     
    int main( void ){
     
        CURL *p_curl = curl_easy_init();
        if( (NULL) == p_curl ){
            fprintf( stderr, "(%d)\t:Erreure init curl\n\t:%s\n",
                errno,strerror(errno) );
            return EXIT_FAILURE;
        }
        /*  Teste ok    */
        fprintf( stdout, "Initialisation ok\n" );
        curl_easy_cleanup( p_curl );    
        return EXIT_SUCCESS;
     
    }
    D'un autre côté effectuer le debogage de votre programme pour savoir d'où vient le souci et si possible pourriez vous nous donner les traces du debug ?

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Bonsoir
    Effectivement ça pique un peut les yeux le code sources. Cependant pour ce qui est du link il faut ajouter les options link à votre projet pour que l'IDE puisse faire correctement son boulot exemple avec la libCurl
    Code gcc : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc source.c -Wall -g -lcurl -o out_curl_test
    .
    Avez essayer de tester CURL seul sans votre DLL dans des nouveaux projets comme ceci.
    Code C : 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
     
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
     
    int main( void ){
     
        CURL *p_curl = curl_easy_init();
        if( (NULL) == p_curl ){
            fprintf( stderr, "(%d)\t:Erreure init curl\n\t:%s\n",
                errno,strerror(errno) );
            return EXIT_FAILURE;
        }
        /*  Teste ok    */
        fprintf( stdout, "Initialisation ok\n" );
        curl_easy_cleanup( p_curl );    
        return EXIT_SUCCESS;
     
    }
    D'un autre côté effectuer le debogage de votre programme pour savoir d'où vient le souci et si possible pourriez vous nous donner les traces du debug ?
    Salutation

    Alors, comme tu le dit si bien le code pique les yeux et sa fait mal

    Bref, donc j'ai crée un nouveau projet en Visual Studio 2015 en MFC DLL et j'ai collé après vérification qu'il y avait pas d'ânerie ^^, et j'ai aussi des erreurs de LINK :

    Nom : 111.PNG
Affichages : 703
Taille : 51,8 Ko

    Et voila le débug :

    Nom : 112.PNG
Affichages : 622
Taille : 16,9 Ko

    J'ai aussi essayé de faire un nouveau projet en Visual Studio 2015 en Application Console et pareil erreur de LINK :

    Nom : 113.PNG
Affichages : 697
Taille : 47,4 Ko

    Et voila le débug :

    Nom : 114.PNG
Affichages : 633
Taille : 19,4 Ko

    Donc d'ou sa peut venir ??? Mauvaise LIBCURL ???


    Et voila les erreurs de ma DLL :

    Nom : 115.PNG
Affichages : 627
Taille : 69,3 Ko

    et voila le débug :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    1>------ Début de la génération*: Projet*: TiersdeConfiance, Configuration*: Debug Win32 ------
    1>  Processing .\TiersdeConfiance.odl
    1>  TiersdeConfiance.odl
    1>  Processing C:\Program Files (x86)\Windows Kits\8.1\Include\um\oaidl.idl
    1>  oaidl.idl
    1>  Processing C:\Program Files (x86)\Windows Kits\8.1\Include\um\objidl.idl
    1>  objidl.idl
    1>  Processing C:\Program Files (x86)\Windows Kits\8.1\Include\um\unknwn.idl
    1>  unknwn.idl
    1>  Processing C:\Program Files (x86)\Windows Kits\8.1\Include\shared\wtypes.idl
    1>  wtypes.idl
    1>  Processing C:\Program Files (x86)\Windows Kits\8.1\Include\shared\wtypesbase.idl
    1>  wtypesbase.idl
    1>  Processing C:\Program Files (x86)\Windows Kits\8.1\Include\shared\basetsd.h
    1>  basetsd.h
    1>  Processing C:\Program Files (x86)\Windows Kits\8.1\Include\shared\guiddef.h
    1>  guiddef.h
    1>  Processing C:\Program Files (x86)\Windows Kits\8.1\Include\um\oaidl.acf
    1>  oaidl.acf
    1>  stdafx.cpp
    1>  _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
    1>  Util.cpp
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\util.cpp(27): warning C4244: 'initialisation'*: conversion de 'double' en 'unsigned long', perte possible de données
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\util.cpp(43): warning C4244: 'initialisation'*: conversion de 'double' en 'unsigned long', perte possible de données
    1>  TiersdeConfianceAuto.cpp
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(160): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1769): note: voir la déclaration de 'sprintf'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(236): warning C4996: '_splitpath': This function or variable may be unsafe. Consider using _splitpath_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdlib.h(1096): note: voir la déclaration de '_splitpath'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(239): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1769): note: voir la déclaration de 'sprintf'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(254): warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(453): note: voir la déclaration de 'strtok'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(267): warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(453): note: voir la déclaration de 'strtok'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(268): warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(453): note: voir la déclaration de 'strtok'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(272): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(119): note: voir la déclaration de 'strcpy'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(280): warning C4477: 'sprintf' : format string '%s' requires an argument of type 'char *', but variadic argument 4 has type 'CString'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(280): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1769): note: voir la déclaration de 'sprintf'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(333): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1769): note: voir la déclaration de 'sprintf'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(344): warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(453): note: voir la déclaration de 'strtok'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(348): warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(453): note: voir la déclaration de 'strtok'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(349): warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(453): note: voir la déclaration de 'strtok'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(358): warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(453): note: voir la déclaration de 'strtok'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(402): warning C4996: '_itoa': This function or variable may be unsafe. Consider using _itoa_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdlib.h(637): note: voir la déclaration de '_itoa'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(528): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1769): note: voir la déclaration de 'sprintf'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(529): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(205): note: voir la déclaration de 'fopen'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(541): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(119): note: voir la déclaration de 'strcpy'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(568): warning C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdlib.h(1183): note: voir la déclaration de 'getenv'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(582): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(119): note: voir la déclaration de 'strcpy'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(586): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1769): note: voir la déclaration de 'sprintf'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(610): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(119): note: voir la déclaration de 'strcpy'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(615): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1769): note: voir la déclaration de 'sprintf'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(621): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(205): note: voir la déclaration de 'fopen'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(644): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(205): note: voir la déclaration de 'fopen'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\tiersdeconfianceauto.cpp(648): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(205): note: voir la déclaration de 'fopen'
    1>  TiersdeConfiance.cpp
    1>  TedetisSession.cpp
    1>  TedetisEnvelop.cpp
    1>  SessionTab.cpp
    1>  Session.cpp
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\session.cpp(66): warning C4996: '_itoa': This function or variable may be unsafe. Consider using _itoa_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdlib.h(637): note: voir la déclaration de '_itoa'
    1>  Log.cpp
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\log.cpp(18): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\string.h(119): note: voir la déclaration de 'strcpy'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\log.cpp(31): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(205): note: voir la déclaration de 'fopen'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\log.cpp(34): warning C4996: '_ftime64': This function or variable may be unsafe. Consider using _ftime64_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\sys\timeb.h(76): note: voir la déclaration de '_ftime64'
    1>c:\users\association\desktop\08-09-2015\tiersdeconfiance\tiersdeconfiance\log.cpp(35): warning C4996: 'ctime': This function or variable may be unsafe. Consider using ctime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>  c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\time.h(475): note: voir la déclaration de 'ctime'
    1>  Constant.cpp
    1>  Génération de code en cours...
    1>     Création de la bibliothèque C:\Users\association\Desktop\08-09-2015\TiersdeConfiance\Debug\TiersdeConfiance.lib et de l'objet C:\Users\association\Desktop\08-09-2015\TiersdeConfiance\Debug\TiersdeConfiance.exp
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu __imp__curl_formadd référencé dans la fonction "public: int __thiscall CTiersdeConfianceAuto::ENVOI(char * const,char * const,char * const,char * const)" (?ENVOI@CTiersdeConfianceAuto@@QAEHQAD000@Z)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu __imp__curl_easy_init référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::sslconnect(char *,struct curl_httppost *,char * *)" (?sslconnect@CTiersdeConfianceAuto@@AAEHPADPAUcurl_httppost@@PAPAD@Z)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu __imp__curl_easy_setopt référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::sslconnect(char *,struct curl_httppost *,char * *)" (?sslconnect@CTiersdeConfianceAuto@@AAEHPADPAUcurl_httppost@@PAPAD@Z)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu __imp__curl_easy_perform référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::sslconnect(char *,struct curl_httppost *,char * *)" (?sslconnect@CTiersdeConfianceAuto@@AAEHPADPAUcurl_httppost@@PAPAD@Z)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu __imp__curl_easy_cleanup référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::sslconnect(char *,struct curl_httppost *,char * *)" (?sslconnect@CTiersdeConfianceAuto@@AAEHPADPAUcurl_httppost@@PAPAD@Z)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu _OPENSSL_add_all_algorithms_noconf référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::init(void)" (?init@CTiersdeConfianceAuto@@AAEHXZ)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu _PEM_write_X509 référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::init(void)" (?init@CTiersdeConfianceAuto@@AAEHXZ)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu _PEM_write_PrivateKey référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::init(void)" (?init@CTiersdeConfianceAuto@@AAEHXZ)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu _ERR_print_errors_fp référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::init(void)" (?init@CTiersdeConfianceAuto@@AAEHXZ)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu _ERR_load_crypto_strings référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::init(void)" (?init@CTiersdeConfianceAuto@@AAEHXZ)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu _PKCS12_free référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::init(void)" (?init@CTiersdeConfianceAuto@@AAEHXZ)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu _PKCS12_parse référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::init(void)" (?init@CTiersdeConfianceAuto@@AAEHXZ)
    1>TiersdeConfianceAuto.obj : error LNK2019: symbole externe non résolu _d2i_PKCS12_fp référencé dans la fonction "private: int __thiscall CTiersdeConfianceAuto::init(void)" (?init@CTiersdeConfianceAuto@@AAEHXZ)
    1>C:\Users\association\Desktop\08-09-2015\TiersdeConfiance\Debug\TiersdeConfiance.dll : fatal error LNK1120: 13 externes non résolus
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
    Merci d'avance encore pour ton aide et le temps que tu me consacre c'est COOL
    (Si tu besoin d'autre chose pour mieux comprendre hésite pas


  15. #15
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Bonjour
    Essayons de faire très simple c'est-à-dire, crée un nouveau projet console simple (Win32 Console Application) et non MFC DLL car, l'objectif est de tester dans un projet neutre et si possible sans importation de DLL ou autre.
    Après avoir créé votre projet , vous allez configurer votre projet afin que l'IDE link correctement la bibliothèque libcurl.dll ( donc Project -> Settings -> Link -> Category (General) vous allé ajouter libcurl.dll ) avec votre projet il faut également mettre la copie de la DLL dans votre répertoire de projet Ensuite vous allez écrire votre code source et compiler puis exécuter et voir si ça marche.
    à bientôt

  16. #16
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 79
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Bonjour
    Essayons de faire très simple c'est-à-dire, crée un nouveau projet console simple (Win32 Console Application) et non MFC DLL car, l'objectif est de tester dans un projet neutre et si possible sans importation de DLL ou autre.
    Après avoir créé votre projet , vous allez configurer votre projet afin que l'IDE link correctement la bibliothèque libcurl.dll ( donc Project -> Settings -> Link -> Category (General) vous allé ajouter libcurl.dll ) avec votre projet il faut également mettre la copie de la DLL dans votre répertoire de projet Ensuite vous allez écrire votre code source et compiler puis exécuter et voir si ça marche.
    à bientôt
    Bonjour, bonjour,

    J'ai tout simplement crée un nouveau projet comme tu me la conseillé, donc j'ai crée un nouveau projet console simple (Win32 Console Application) en mettant comme 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
     
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
     
    #include <iostream>
    using namespace std;
     
    void main(void)
    {
    	CURL *p_curl = NULL;
     
    	p_curl = curl_easy_init();
     
    	if (p_curl == NULL) 
    	{
    		fprintf(stderr, "(%d)\t:Erreure init curl\n\t:%s\n", errno, strerror(errno));
     
    		cout << "C'est pas bon" << endl;
    	}
     
    	/*  Teste ok    */
    	fprintf(stdout, "Initialisation ok\n");
    	curl_easy_cleanup(p_curl);
     
    	Sleep(1000);
    }
    Et miracle sa fonctionne

    Donc je suppose que mon problème est liée a la création de mon projet

    je vais faire quelque teste et je te tien au courant

    Mais encore MERCI pour ta précédente aide (je sais pas si sa ce fait et si j'ai le droit mais +1 pour sambia39)

Discussions similaires

  1. [RTFEditorKit] Problème d'utilisation
    Par jean.lamy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 21/10/2004, 18h30
  2. 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
  3. [cvs] problèmes d'utilisation
    Par gromite dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/06/2004, 17h41
  4. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  5. problème d'utilisation avec turbo pascal 7.0
    Par le 27 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 03/12/2003, 10h44

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