2014-04-17 6 views
3

J'essaye de construire un formulaire HTTP en utilisant libcurl mais je n'arrive pas à le faire fonctionner correctement. Chaque fois que j'appelle curl_formadd, il renvoie CURL_FORMADD_OPTION_TWICE. La seule information sur cette erreur indique que libcurl pense que j'essaye d'ajouter deux éléments de forme avec le même nom, même si c'est le premier appel à curl_formadd et j'ajoute seulement un élément!curl_formadd retourne `CURL_FORMADD_OPTION_TWICE` lors du premier appel

Declare Function curl_global_init Lib "libcurl" (flags As Integer) As Integer 
    Declare Function curl_formadd Lib "libcurl" (FirstItem As Ptr, LastItem As Ptr, Option1 As Integer, Value1 As Ptr, Option2 As Integer, Value2 As Ptr, EndMarker As Integer) As Integer 

    Const CURLFORM_COPYCONTENTS = 2 
    Const CURLFORM_COPYNAME = 1 
    Const CURLFORM_END = 17 

    Dim formname, formvalue As MemoryBlock 
    formname = "NAME" 
    formvalue = "CONTENTS" 

    If curl_global_init(3) = 0 Then 
    Dim first, last As Ptr 
    Dim err As Integer 
    err = curl_formadd(first, last, CURLFORM_COPYNAME, formname, CURLFORM_COPYCONTENTS, formvalue, CURLFORM_END) 
    Break 
    ' err is 2 (CURL_FORMADD_OPTION_TWICE) 
    End If 

Qu'est-ce que cette erreur essaie de me dire?

Répondre

3

La lecture de la page « man » pour curl_formadd(), il est dit là:

Les pointeurs firstItem et lastitem doivent tous deux être pointant vers NULL dans le premier appel à cette fonction.

Vous, cependant, passer NULL pour ceux-ci.

Vous semblez également passer les chaînes incorrectement. Essayez de définir les paramètres Value1 et Value2 "en tant que CString", puis passez les Strings normales, pas les Memoryblocks.

Enfin, vous avez donné un mauvais code à CURLFORM_COPYCONTENTS. Ce n'est pas 2 mais 4. Voir l'énumération CURLformoption dans curl.h: "CFINIT (NOTHING)" obtient la valeur 0, et chaque élément passé en obtient un plus élevé, donc CFINIT (COPYCONTENTS) obtient 4.

Voici le code fonctionne pour moi:

Declare Function curl_global_init Lib "libcurl" (flags As Integer) As Integer 
Declare Function curl_formadd Lib "libcurl" (ByRef FirstItem As Ptr, ByRef LastItem As Ptr, Option1 As Integer, Value1 As CString, Option2 As Integer, Value2 As CString, EndMarker As Integer) As Integer 

Const CURLFORM_COPYCONTENTS = 4 
Const CURLFORM_COPYNAME = 1 
Const CURLFORM_END = 17 
const CURL_GLOBAL_ALL = 3 

Dim formname, formvalue As String 
formname = "NAME" 
formvalue = "CONTENTS" 

If curl_global_init(CURL_GLOBAL_ALL) = 0 Then 
    Dim first, last As Ptr 
    Dim err As Integer 
    err = curl_formadd(first, last, CURLFORM_COPYNAME, formname, CURLFORM_COPYCONTENTS, formvalue, CURLFORM_END) 
    Break 
    ' err is 0 
End If 
+0

Merci, mais je reçois toujours 'CURL_FORMADD_OPTION_TWICE'. –

+0

Le code d'erreur 2 ne signifie pas CURL_FORMADD_OPTION_TWICE, mais un code d'erreur listé comme expliqué ici: "non nul signifie qu'une erreur est survenue correspondant à une constante CURL_FORMADD_ * définie dans " –

+0

'CURL_FORMADD_OPTION_TWICE' est la constante' CURL_FORMADD_ * '' avec valeur de 2. Si ce n'est pas correct, que '2' indique-t-il? –

Questions connexes