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 :

Convertir une chaîne de caractère en datetime


Sujet :

C++

  1. #21
    Membre averti
    Homme Profil pro
    C++, Java
    Inscrit en
    Juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : C++, Java
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 52
    Par défaut
    J'avance !!

    J'ai déjà trouvé comment récupérer ma colonne AD au bon format.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    hr = pDSSearch->GetColumn( hSearch, L"accountExpires", &col );
    if ( SUCCEEDED(hr) ) 
    {
    	LARGE_INTEGER lInt = col.pADsValues->LargeInteger;
    	pDSSearch->FreeColumn( &col );
     
    }
    De cette manière, je récupère bien dans lInt la même valeur qu'en PowerShell.

    Par exemple j'ai la valeur 130977754857711587 pour la date du 20/01/16.

    En PowerShell, si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PS D:> [datetime]::fromfiletime(130977754857711587)
     
    mercredi 20 janvier 2016 15:58:05
     
    PS D:>
    J'ai donc bien récupéré dans mon LargeInteger ma date au même format que la fonction get-date de PowerShell.
    Il ne me reste plus donc qu'à convertir cette valeur en date.

    Si quelqu'un a une idée...
    J'ai fait des recherches sur Google, sans trop de succès.

  2. #22
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Convertir un LARGE_INTEGER en FILETIME est pourtant parmi ce qu'il y a de plus trivial:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	LARGE_INTEGER li = ...;
    	FILETIME ft = { li.LowPart, li.HighPart };
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #23
    Membre averti
    Homme Profil pro
    C++, Java
    Inscrit en
    Juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : C++, Java
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 52
    Par défaut
    J'ai en effet su récupérer immédiatement le LowPart et le HighPart de mon LARGE_INTEGER, mais de là à l'exploiter...

    Maintenant, en créant un FILETIME comme tu le proposes, j'ai tenté sans succès de le convertir en SYSTEMTIME en suivant les indications données ici, car c'est un pointeur vers mon ft qu'il faut que je mette en paramètre, et pas mon ft directement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FILETIME ft = { lInt.LowPart, lInt.HighPart };
    SYSTEMTIME sysTime;
    FileTimeToSystemTime(ft,sysTime);
    Erreur sur FileTimeToSystemTime(ft,sysTime);

    Je dois avoir l'esprit trop embrouillé sans doute à force...

  4. #24
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par NHCAT Voir le message
    Erreur sur FileTimeToSystemTime(ft,sysTime);

    Je dois avoir l'esprit trop embrouillé sans doute à force...
    Parameters

    lpFileTime [in]

    A pointer to a FILETIME structure containing the file time to be converted to system (UTC) date and time format.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileTimeToSystemTime(&ft, sysTime);
    De toute façon c'est simple avec l'API Win32, si le paramètre fait plus de 4 octets, on passe un pointeur.

    Et si le paramètre fait <= 4 octets mais que c'est une structure, on passe généralement un pointeur aussi.

  5. #25
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Note: Le SYSTEMTIME aussi est passé par pointeur, normalement.

    Et aussi:
    si le paramètre fait plus de 4 octets, on passe un pointeur.
    Noter que cette règle, établie à l'époque de Windows 32 Bits, est basée dessus: Si un paramètre fait 32 bits sous Win32 mais 64 bits sous Win64, il restera passé par valeur.

    Et cette règle ne s'applique pas aux double non plus, car ils sont passés par les registres réservés au calcul à virgule flottante.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #26
    Membre averti
    Homme Profil pro
    C++, Java
    Inscrit en
    Juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : C++, Java
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 52
    Par défaut
    Bonjour,

    J'ai tenté maintes et maintes choses en suivant les pistes que vous m'avez données, mais sans succès. :'(
    Je désespère...

    J'ai donc ma valeur en LARGEINTEGER récupérée dans l'AD, mais impossible d'en faire une date lisible, que je pourrais convertir en CString pour ensuite l'afficher dans mon interface.
    Et même problème dans le sens inverse : impossible de construire un LARGEINTEGER à partir de ma date en CString, pour renseigner mon AD à partir des données saisies dans l'interface.

    J'ai tenté la fonction DosDateTimeToFileTime: https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx

    J'ai tenté le CTIME : http://www.developpez.net/forums/d38...me-systemtime/
    en passant par le DWORD : http://forums.codeguru.com/showthrea...tring-to-DWORD

    et d'autres choses encore. Mais rien n'y fait, ça ne marche pas.

  7. #27
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Ta date récupérée dans l'AD est un LARGE_INTEGER correspondant à un FILETIME UTC.

    Donc:
    1) Convertir en FILETIME:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FILETIME ft = { lInt.LowPart, lInt.HighPart };
    2) Convertir en SYSTEMTIME:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SYSTEMTIME st;
    FileTimeToSystemTime(&ft, &st);
    2.5) Convertir de UTC en local si nécessaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DYNAMIC_TIME_ZONE_INFORMATION tz;
    GetDynamicTimeZoneInformation(&tz);
    SYSTEMTIME stLocal;
    SystemTimeToTzSpecificLocalTime(&tz, &st, &stLocal);
    3) Convertir en CString:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CStringW strW; //Nécessite Visual 2005 ou supérieur, il me semble
    int bufferSize = GetTimeFormatEx(LOCALE_SYSTEM_DEFAULT, 0, &stLocal, NULL, NULL, 0);
    LPWSTR buf = strW.GetBuffer(bufferSize);
    GetTimeFormatEx(LOCALE_SYSTEM_DEFAULT, 0, &stLocal, NULL, buf, bufferSize);
    strW.ReleaseBuffer(), buf=NULL;
    CString str(strW);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #28
    Membre averti
    Homme Profil pro
    C++, Java
    Inscrit en
    Juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : C++, Java
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 52
    Par défaut
    Bonjour,

    Merci encore une fois pour ton aide.
    Cependant, je n'ai pas réussi à faire fonctionner ta solution : lors de la dernière étape, j'avais une anomalie au niveau de la fonction GetTimeFormatEx qui attend du LPWCSTR alors que LOCALE_SYSTEM_DEFAULT n'est pas à ce format.

    Mais j'ai trouvé une autre solution qui fonctionne !!!

    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
    hr = pDSSearch->GetColumn( hSearch, L"accountExpires", &col );
    if ( SUCCEEDED(hr) ) 
    {
    	LARGE_INTEGER lInt = col.pADsValues->LargeInteger;
     
    	//convertir lInt en date exploitable
    	FILETIME ft = { lInt.LowPart, lInt.HighPart }; //Conversion en FILETIME
     
    	SYSTEMTIME st;
    	FileTimeToSystemTime(&ft, &st); //Conversion en SYSTEMTIME
     
    	sObjetAccountExpire.Format( "%d%02d%02d",
    		st.wDay,
    		st.wMonth,
    		st.wYear );
     
    	pDSSearch->FreeColumn( &col );
     
    }
    else{
    	sObjetAccountExpire = "";
    }
    De cette manière, je récupère dans sObjetAccountExpire ma date au format JJMMAAAA comme je le voulais.

    Ouf !! Voilà une chose de faite.
    Me reste maintenant à trouver comment faire l'inverse : à partir de ma date au format JJMMAAAA contenue dans un CString, créer un LARGE_INTEGER contenant mon datetime pour valoriser Account-Expires.

  9. #29
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 154
    Billets dans le blog
    4
    Par défaut
    Salut,

    nous t'avons donné depuis les premières réponses toutes les pierres pour parvenir à ton résultat.
    Médinoc t'a écrit tout le code. Mais nous ne sommes pas là pour faire ton travail.
    Alors en réfléchissant un peu, suis les liens et infos que tous t'ont donné, et tu devrais être capable d'y parvenir..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #30
    Membre averti
    Homme Profil pro
    C++, Java
    Inscrit en
    Juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : C++, Java
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 52
    Par défaut
    Désolé, mais je ne maîtrise pas bien toutes ces notions, et je débute en C++, donc j'ai essaye de m'en sortir à partir des éléments que vous m'avez donnés.
    D'ailleurs merci beaucoup pour votre aide.

    J'ai fini par trouver cette fonction .Format qui m'a bien aidé pour terminer cette partie du code.

  11. #31
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Apparemment j'ai confondu, c'était LOCALE_NAME_SYSTEM_DEFAULT qu'il fallait utiliser.
    Ou plutôt LOCAL_NAME_USER_DEFAULT, maintenant que j'y pense.

    Il t'aurait suffit de 10 secondes de recherche sur Google avec le nom de la fonction pour trouver ça.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #32
    Membre averti
    Homme Profil pro
    C++, Java
    Inscrit en
    Juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : C++, Java
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 52
    Par défaut
    Bonjour à vous,

    J'approche du bout de mes développement, mais je fais face à un nouveau point de blocage.
    J'ai donc à présent réussi à récupérer ma date d'expiration dans l'AD et à la convertir de manière à l'afficher dans mon interface, je m'occupe donc maintenant de valoriser la date dans l'AD à partir de celle saisie dans l'interface.

    La date saisie dans mon interface est récupérée dans un CString nommée sExpire.
    J'ai donc écrit le code suivant :

    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
    LARGE_INTEGER lInt;
    FILETIME ft;
    SYSTEMTIME st;
     
    //Découpage date
    CString sExpireJ = sExpire.Left(2);
    CString sExpireM = sExpire.Left(4).Right(2);
    CString sExpireA = sExpire.Right(4);
     
    //conversion en DWORD
    DWORD dExpireJ = atol((char*)(LPCTSTR)sExpireJ);
    DWORD dExpireM = atol((char*)(LPCTSTR)sExpireM);
    DWORD dExpireA = atol((char*)(LPCTSTR)sExpireA);
     
    //valorisation du SYSTEMTIME
    st.wDay = dExpireJ;
    st.wMonth = dExpireM;
    st.wYear = dExpireA;
     
    //conversion en FileTime
    SystemTimeToFileTime(&st, &ft);
    De cette manière, j'ai transformé ma date en CString en une date au format FileTime.

    Or la fonction de mon application qui écrit dans l'AD attend un CString.
    Lorsque je code un filetime en dur de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sExpire = "130977754857711587";
    hr = Put_Attribut(*pADs,L"accountExpires",sExpire);
    Ca fonctionne très bien.
    Il me faut donc renseigner mon CString avec la valeur de mon FileTime.

    Sachant que dans le sens inverse, j'avais du passer par un LARGE_INTEGER, j'ai tenté de trouver comment créer mon LARGE_INTEGER à partir de mon FileTime, en faisant pas mal de recherche sur Google, et en reprenant tous vos messages précédents en espérant y trouver la solution à mon problème, mais je reste bloqué à cette étape.

    Quand à la conversion de mon LARGE_INTEGER en CString, j'ai tenté la méthode suivante trouvé sur le msdn :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHAR szTemp[MAX_PATH] = {0};
    LARGE_INTEGER i ={100};
    sprintf(szTemp,"%ld",i);
    Mais cette opération crée une chaîne a priori sur 32 bits seulement, au lieu des 64 bits nécessaires.

    Auriez-vous une piste à m'indiquer pour y arriver ?

    Merci d'avance.

  13. #33
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 154
    Billets dans le blog
    4
    Par défaut
    A priori ta struct FILETIME c'est juste 2 DWORD https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
    Je tenterais quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHAR szTemp[MAX_PATH] = {0};
    FILETIME ft;
    sprintf(szTemp,"%ld%ld", ft.dwHighDateTime, ft.dwLowDateTime);
    Pourquoi passer par un LARGE_INTEGER ?
    S'agit-il de ce LARGE_INTEGER ? https://msdn.microsoft.com/en-us/lib...e_integer.aspx
    Parce que si c'est le cas, il possède un QuadPart qui retourne un int64, et même une fonction ToString()
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #34
    Membre averti
    Homme Profil pro
    C++, Java
    Inscrit en
    Juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : C++, Java
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 52
    Par défaut
    Je voulais passer par un LARGE_INTEGER pour faire en faite la mécanique inverse de celle de consultation AD -> conversion -> Affichage Date.

    Or comme pour ça j'ai du récupérer la valeur de mon champ dans un LARGE_INTEGER, pour ensuite le convertir en FILETIME, puis en SYSTEMTIME, je voulais faire ici l'inverse.
    Mais je vais tenter le coup à partir des éléments que tu m'as indiqués.

    Merci pour ton aide.

  15. #35
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHAR szTemp[MAX_PATH] = {0};
    FILETIME ft;
    sprintf(szTemp,"%ld%ld", ft.dwHighDateTime, ft.dwLowDateTime);
    Wow, ce doit être la version la plus horrible et la plus non-réversible que j'aie jamais vue de convertir un FILETIME en chaîne de caractères: Exprimer ses deux mots en décimal et les concaténer sans le moindre séparateur.

    @NHCAT: Quel est la documentation de cette fonction ou cet attribut? Es-tu sûr qu'il n'y a pas moyen de le transmettre directement avec le bon type?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #36
    Membre averti
    Homme Profil pro
    C++, Java
    Inscrit en
    Juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : C++, Java
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 52
    Par défaut
    Ma fonction Put_Attribut est la suivante (Fonction existante dans l'appli quand je l'ai récupérée) :

    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
    HRESULT CLdap::Put_Attribut(IADs & pADs,BSTR sNomAttribut, CString sValeurAttribut)
    {
     
    //  Mise en place de l'Account
    	VARIANT var;
    	WCHAR swTemp[MAX_BUF] ;
    	HRESULT hr;
     
    	if (sValeurAttribut == "")
    	{
    		V_VT(&var)=VT_NULL;
    	   	hr = pADs.PutEx(ADS_PROPERTY_CLEAR,sNomAttribut,var);
    		return hr;
    	}
    	else
    	{
    	   	StringToWCHAR(swTemp[0] , sValeurAttribut  , MAX_BUF ) ;
       		VariantInit(&var);
       		V_BSTR(&var) = swTemp ;
       		V_VT(&var)=VT_BSTR;
       		hr = pADs.Put(sNomAttribut,var);
    		return hr;
    	}
     
    }
    Si je code en dur un FileTime que je récupère en PowerShell, ça fonctionne parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sExpire = "130977754857711587";
    hr = Put_Attribut(*pADs,L"accountExpires",sExpire);
    Lorsque je récupère ensuite la valeur du champ dans un LARGE_INTEGER, celui-ci a bien la valeur que j'ai codée en dur ci-dessus.

    J'ai utilisé le QuadPart dans le sens ConsultationAD -> AffichageInterface pour augmenter ma date d'un jour (la date de l'AD est la date de fin de validité, et je veux afficher la date à partir de laquelle le compte n'est plus actif, donc le lendemain), de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const unsigned __int64 iNanoToSeconds = 10000000; // 10 millions
    const unsigned __int64 jour = iNanoToSeconds * 60*60*24*1;
     
    lInt.QuadPart += jour;
    Parmi mes recherches depuis hier, j'avais trouvé cette page dont j'ai tenté d'adapter le code pour mon cas, mais je n'ai pas obtenu la valeur correct pour charger mon AD.

    J'ai tenté la solution de Bousk, mais après avoir créé un compte en saisissant la date du 10/05/2016, lorsque je le consulte ensuite il m'affiche la date du 27/12/1612. Donc la conversion n'est semble-t-il pas bonne.

  17. #37
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Ouh, c'est moche ça. Très moche.

    Quand COM demande une BSTR, il faut lui donner une vraie BSTR, pas une chaîne de wchar_t à laquelle il manque le préfixe.

    Edit: Franchement, tu es sous MFC, utilises-donc un COleVariant plutôt qu'un VARIANT initialisé de manière hasardeuse!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #38
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 154
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Wow, ce doit être la version la plus horrible et la plus non-réversible que j'aie jamais vue de convertir un FILETIME en chaîne de caractères: Exprimer ses deux mots en décimal et les concaténer sans le moindre séparateur.
    On m'appelle pas le cow-boy par hasard! J'ai fait avec ce qui m'a été fourni et j'ai bricolé ça, si ça marche du premier coup ça me suffit.
    Cela dit, j'y préfèrerais surement une écriture avec un intermédiaire int64 i = ft.dwHighDateTime<<32 | ft.dwLowDateTime; pour avoir un meilleur aperçu du bordel.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  19. #39
    Membre averti
    Homme Profil pro
    C++, Java
    Inscrit en
    Juillet 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : C++, Java
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 52
    Par défaut
    Je veux bien te croire, Médinoc.

    Cette application doit être remplacée par une autre, mais en attendant on m'a refilé le code, avec trois jours de formation C++/MFC, et je dois me débrouiller à appliquer quelques évolutions le temps qu'elle soit remplacée.
    D'où mon manque de maîtrise de nombreux éléments qui semblent être une base pour vous (cette notion de 32bits/64bits etc... pour un développeur PACBASE comme moi... ).
    Donc je t'avouerai que je n'ai pas nécessairement envie d'aller recoder de l'existant, sachant que de toute façon d'ici un an ou deux l'application sera mise à la poubelle.

    Je me contente d'assurer au mieux les petites évolutions demandées.
    Jusqu'à présent, n'ayant pas eut à gérer de conversions aussi complexes, je m'en étais sorti plutôt bien, mais là...

  20. #40
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 541
    Par défaut
    HRESULT CLdap:ut_Attribut(IADs & pADs,BSTR sNomAttribut, CString sValeurAttribut)
    Mélanger du BSTR et du CString dans une même signature, c'est les emmerdes assurées.
    Le code de la méthodes confirme que c'est du pur bricolage.
    Vous galérez parce que le code de cette méthode est un immonde globiboulga.

    Le plus simple, c'est de faire une autre méthode qui prend un LARGE_INTEGER en troisième paramètre et pas cet horrible CString.

    Vous faites un code bien plus propre et bien plus simple en utilisant des COleVariant, comme l'indique @Médinoc.

    Je pense que c'est une fonction qui ne devrait pas faire plus de 5 lignes. (Je n'ai pas de MFC ni d'AD sous la main, désolé).

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/04/2008, 17h36
  2. Convertir une chaîne de caractère (saisie dans un textbox) en décimal
    Par sab_etudianteBTS dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/09/2007, 21h17
  3. Convertir une chaîne de caractères XML en Node
    Par Invité dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/07/2007, 14h06
  4. Réponses: 4
    Dernier message: 22/12/2006, 15h10
  5. Convertir une chaîne de caractères
    Par PedroBD dans le forum Langage
    Réponses: 3
    Dernier message: 13/11/2006, 17h25

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