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 :

Transcrire code PHP dans une DLL


Sujet :

C++

  1. #1
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut Transcrire code PHP dans une DLL
    Bonsoir,
    je me suis lancer un défi qui était de transcrire un code PHP pour retrouver un checksum de google dans une dll C++ (com). Au départ j'ai voulu me faire une dll en vb qui est le langage que je pratique mais j'ai des problème à cause de mes types de données et la rapidité de mon code...
    Donc je demande de l'aide à celui ou celle qui pourrait encapsuler le code php suivant dans une dll de sorte que puisse appelée la méthode GoogleCH qui me retournerait le checksum attendu :

    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
     
    <?php 
     
    /* 
     
        This code is released unto the public domain 
     
    */ 
     
     
     
    define('GOOGLE_MAGIC', 0xE6359A60); 
     
     
     
    //unsigned shift right 
     
    function zeroFill($a, $b) 
     
    { 
        $z = hexdec(80000000); 
     
            if ($z & $a) 
     
            { 
                $a = ($a>>1); 
     
                $a &= (~$z); 
     
                $a |= 0x40000000; 
     
                $a = ($a>>($b-1)); 
     
            } 
            else 
     
            { 
                $a = ($a>>$b); 
     
            } 
            return $a; 
     
    } 
     
     
    function mix($a,$b,$c) { 
      $a -= $b; $a -= $c; $a ^= (zeroFill($c,13)); 
     
      $b -= $c; $b -= $a; $b ^= ($a<<8); 
     
      $c -= $a; $c -= $b; $c ^= (zeroFill($b,13)); 
     
      $a -= $b; $a -= $c; $a ^= (zeroFill($c,12)); 
     
      $b -= $c; $b -= $a; $b ^= ($a<<16); 
     
      $c -= $a; $c -= $b; $c ^= (zeroFill($b,5)); 
     
      $a -= $b; $a -= $c; $a ^= (zeroFill($c,3));   
     
      $b -= $c; $b -= $a; $b ^= ($a<<10); 
     
      $c -= $a; $c -= $b; $c ^= (zeroFill($b,15)); 
     
     
     
      return array($a,$b,$c); 
     
    } 
     
    function GoogleCH($url, $length=null, $init=GOOGLE_MAGIC) { 
        if(is_null($length)) { 
            $length = sizeof($url); 
     
        } 
        $a = $b = 0x9E3779B9; 
     
        $c = $init; 
     
        $k = 0; 
     
        $len = $length; 
     
        while($len >= 12) { 
     
     
     
     
            $a += ($url[$k+0] +($url[$k+1]<<8) +($url[$k+2]<<16) +($url[$k+3]<<24)); 
     
     
     
            $b += ($url[$k+4] +($url[$k+5]<<8) +($url[$k+6]<<16) +($url[$k+7]<<24)); 
     
            $c += ($url[$k+8] +($url[$k+9]<<8) +($url[$k+10]<<16)+($url[$k+11]<<24)); 
     
            $mix = mix($a,$b,$c); 
     
            $a = $mix[0]; $b = $mix[1]; $c = $mix[2]; 
     
            $k += 12; 
     
            $len -= 12; 
     
        } 
     
        $c += $length; 
     
        switch($len)              /* all the case statements fall through */ 
     
        { 
            case 11: $c+=($url[$k+10]<<24); 
     
            case 10: $c+=($url[$k+9]<<16); 
     
            case 9 : $c+=($url[$k+8]<<8); 
     
              /* the first byte of c is reserved for the length */ 
     
            case 8 : $b+=($url[$k+7]<<24); 
     
            case 7 : $b+=($url[$k+6]<<16); 
     
            case 6 : $b+=($url[$k+5]<<8); 
     
            case 5 : $b+=($url[$k+4]); 
     
            case 4 : $a+=($url[$k+3]<<24); 
     
            case 3 : $a+=($url[$k+2]<<16); 
     
            case 2 : $a+=($url[$k+1]<<8); 
     
            case 1 : $a+=($url[$k+0]); 
     
             /* case 0: nothing left to add */ 
     
        } 
        $mix = mix($a,$b,$c); 
     
        /*-------------------------------------------- report the result */ 
     
        return $mix[2]; 
     
    } 
     
    //converts a string into an array of integers containing the numeric value of the char 
     
    function strord($string) { 
        for($i=0;$i<strlen($string);$i++) { 
            $result[$i] = ord($string{$i}); 
     
        } 
        return $result; 
     
    } 
    // http://www.example.com/ - Checksum: 6540747202 
    ?>

  2. #2
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    Alors personne ne saurais le faire?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ben... Il faudrait déjà qu'on comprenne précisément que ce que tu veux...

    1) Qu'est-ce qui doit utiliser la DLL?
    2) Pourquoi spécifiquement une DLL COM ? as-tu besoin d'un truc aussi lourd pour un calcul de checksum ?
    3) Que nous demandes-tu exactement? traduire le code php en C++ ? Le traduire en objet et interface COM?
    4) Qu'est-ce les fonctions sont supposées recevoir en entrée et en sortie, et surtout, sous quelle forme?

  4. #4
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    Voilà Médinoc, j'ai surement été trop flou dans mes explications :
    Je voudrais construire une DLL com car elle seulement sensée faire le travail de calcul de checksum , elle sera appelée en VB et me renverra le résultat calculé.
    D'après le code que j'ai pû récupérer en PHP, il faudrait que la DLL offre une interface unique me permettant d'appeler la méthode "GoogleCH(url)" , laquelle est sensée effectuer un calcul basé sur les autres fonctions du code qui sont des fonctions purement utilitaires.
    Je lui fournit en paramètre la chaîne de caractère $url et elle me rtourne un long en sortie...
    Je ne suis pas vraiment à l'aise avec C et ses langages dérivés sinon je coderais cela sans problème, mais là je ne peux éventuellement que vous donner à peu près les signatures des fonctions utilisées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //Fonction devant être appelée depuis l'extérieur de la dll :
    Long GoogleCH(BSTR url, int length=null,  LONG init=GOOGLE_MAGIC)
     
    //fonction réalisant du bit shifting :
    LONG zeroFill(LONG a, LONG b) 
     
    //Fonction mix qui doit renvoyée un tableau de long
    LONG[] mix(LONG a,LONG b,LONG c)
     
    //Fonction renvoyant un tableau contenant les valeurs ASCII des //caractères d'une chaîne passée en paramètre
    int[] strord(BSTR string)
    Je ne sais pas si la situation est plus claire désormais, mais j'avoue que je ne sais pas comment expliciter d'avantage le problème

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    1) COM et "seulement", pour moi, c'est incompatible. S'il faut "seulement" un calcul de checksum, une DLL simple serait préférable. D'ailleurs, il me semble que VB peut également appeler une DLL simple avec interface C (du C++ compilé avec extern "C")

    Par contre, il faut que la fonction de la DLL télécharge la page web... ça, c'est plus dur à faire, il faut au moins MFC pour télécharger en HTTP sans refaire un client(CHttpConnection) (enfin, une DLL MFC c'est faisable, et c'est faisable sans COM)

    2) Elle est calculée comment exactement, la checksum? C'est la somme de quoi? car je trouve qu'il y a pas mal de code, là, cela me parait un calcul bien complexe... Sans compter que les fonctions php elles-mêmes, elles ne sont pas trop dures à traduire en C/C++...

    //Fonction renvoyant un tableau contenant les valeurs ASCII des //caractères d'une chaîne passée en paramètre
    int[] strord(BSTR string)
    Ça, en C comme en C++, c'est le genre de truc qui ne sert à rien, la chaîne étant déjà un tableau de valeurs ASCII...

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut


    Echanger des tableau avec VB c'est pas évident, et c'est pas le meilleur forum vu que COM ne fait pas partie du standard C++.
    Tu utilises une lib particulière ?

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Au passage BSTR c'est pas une chaine ASCII mais Unicode (c'est une string VB en fait), et c'est pas géré n'importe comment (SysAllocString...).

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    VB ne fait que des BSTR ?
    Alors comment se fait-il que VB puisse appeler des fonctions de l'API normale de windows ? (je pense notamment à WritePrivateProfileStringA() qui prend des chaînes normales ANSI...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (
     ByVal lpApplicationName$, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName$
     ) As Long
    Si l'on peut faire cela avec l'API Windows, je pense qu'on peut s'en servir pour appeler une DLL C++ avec des chaînes normales (en mettant le bon nom décoré de fonction si elle est exportée en C++)...
    À partir de là, on peut télécharger la page avec CHttpConnection et calculer la fameuse checksum (si c'est bien une ckecksum... Cela ressemble plus à un calcul style CRC et Cie...)

  9. #9
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    Mon but final en fait c'est à partir d'une page ASP(VBScript) appelé l'objet DLL lui demander le résultat du checksum
    et de l'afficher dans ma page WEB.
    Le checksum est calculé sur la base d'une url qui lui est passé en paramêtre mais là, il faut faire abstraction de cela,
    je pourrai lui envoyer tout type de chaîne (aussi bien "http://www.google.fr" que "toto est malade")...
    La DLL n'a donc pas à se connecter à une page : elle reçoit une chaîne de caractère et retourne un chiffre long basé sur un algorithme
    particulier.
    Effectivement il n'y a pas forcément besoin de COM, une DLL C avec une compilation d'une interface simple en extern C me conviendrait tout aussi bien
    puisque à ce moment là je pourrais surement écrire une DLL VB qui me servira de wrapper entre la dll C et mon code ASP/VBScript.
    Le tout pour moi était la difficulté d'écrire le code C équivalent au code PHP, et dans un second temps en effet je risque peut être
    de me prendre la tête sur les types qui doivent transités de C à VB...
    Si effectivement on peut transcrire facilement le code PHP en C ça sera déjà un bon début, je pense

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Je connais pas bien VB, mais si tu appelles tel quel WritePrivateProfileString tu auras un plantage. L'astuce réside dans la déclaration de la string passée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim str As String
    str = String(255, 0)
    Mais une BSTR n'est pas trop complexe à utiliser (surtout avec des classes genre _bstr_t). Pour les tableaux c'est autre chose.

    Je crois que le checksum porte sur l'URL, pas sur la page. S'il faut télécharger la page, pas besoin des MFC. URLDownloadToFile est simple d'emploi.

  11. #11
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    J'ai apparemment posté en même temps que toi Aurélien, mais tu as bien compris le problême je pense.
    Cela va justement dans le sens des éclaircissement que je viens de donnés.

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Tu peux te simplifier la tâche en exportant une seule fonction, le reste c'est des fonctions internes. Tant qu'à faire, utilise des BSTR, c'est un peu plus complexe, mais du côté de VB ça s'utilise directement, et t'es pas limité à 255 char.
    Pour transcrire ton code, ben trouve un tutoriel sur le C et remonte toi les manches . Je connais pas PHP, mais ça a l'air proche.
    En C++ il y a un type string qui va t'éviter bien des déboires:
    http://c.developpez.com/faq/cpp/?page=strings
    le type wstring devrait être compatible dans une certaine mesure avec BSTR (sauf pour le retour).
    Tu peux jeter un oeil à la classe _bstr_t si tu es sous VC++ pour t'aider à gérer les BSTR.
    http://progtutorials.tripod.com/COM.htm

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je viens de regarder sur MSDN: Pour les chaines constantes, les BSTR peuvent directement être utilisées comme LPCWSTR (chaînes unicode constantes) ou comme BSTR.

    Par contre, les fonctions sont appelées par défaut en __stdcall
    (y penser dans la DLL)

    Je vais peut-être essayer la conversion si j'ai le temps, mais seulement si je l'ai (je suis en fin de stage, et j'ai une deadline qui approche)

  14. #14
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    Merci quand même d'y penser Médinoc, et merci Aurélien pour toutes les sources.
    Pour ce qui est de retrousser les manches je l'ai déjà fait, mais je m'aperçois à chaque fois au bout d'un moment que je n'ai pas les connaissances adéquates...
    Mais bon je pense effectivement qu'à force de m'y casser les dents quelquechose finira bien par en sortir.
    Le souci vient aussi du fait que d'après ce que je lis pour C comme pour C++, c'est une nébuleuse de types, d'appels différents,
    de compilation aussi différentes... Pour un néophyte, ce type de programme c'est loin d'être la sinécure!
    Même si pour vous, à vous lire vous avez l'air de savior de quoi vous parlez et dire que vous vous y retrouvez!

  15. #15
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Médinoc
    Je viens de regarder sur MSDN: Pour les chaines constantes, les BSTR peuvent directement être utilisées comme LPCWSTR (chaînes unicode constantes)
    Une BSTR est plus proche de la chaine Pascal que de la chaine C. Elle stockes sa longueur à l'indice -1 de la chaine. Souvent les BSTR sont terminées par NULL pour être compatibles C/C++, mais ce n'est pas une obligation. De plus, une BSTR de longueur 10 peut contenir au milieu plusieurs carcatères NULL. Faut donc être prudent. SysStringLen te renvoie de manière fiable sa longueur.
    _bstr_t simplifie le code.

  16. #16
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    un des liens que tu m'as fournis Aurélien n'est pas le bon ou il est mort....

  17. #17
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    C'est corrigé
    http://progtutorials.tripod.com/COM.htm

Discussions similaires

  1. [MySQL] Execution de code PHP dans une BDD
    Par calenfeaion dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 30/06/2006, 13h34
  2. [MySQL] Récupération de code php dans une base de données
    Par kitana dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/03/2006, 00h25
  3. Mettre un code php dans une variable...
    Par kedare dans le forum Langage
    Réponses: 6
    Dernier message: 19/09/2005, 12h55
  4. [Conception] Code php dans une base de donnée
    Par krfa1 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 13/09/2005, 10h58
  5. pb eval pour le code php dans une feuille xslt
    Par nipepsi dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 10/09/2004, 11h23

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