2014-04-17 29 views
3

我试图用libcurl构造一个HTTP表单,但是我无法让它正常工作。每次我拨打curl_formadd时,都会返回CURL_FORMADD_OPTION_TWICE。关于这个错误的唯一信息表明libcurl认为我试图添加两个具有相同名称的表单元素,即使它第一次调用curl_formadd,而我只添加了一个元素!curl_formadd在第一次调用时返回`CURL_FORMADD_OPTION_TWICE`

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 

什么是这个错误试图告诉我?

回答

3

阅读curl_formadd()的“人”页面,它说:

指针和与firstItem应lastitem无论是在第一次调用这个函数是指向NULL。

但是,您为这些传递NULL。

您似乎也错误地传递了字符串。尝试将Value1和Value2参数定义为“CString”,然后传递正常的字符串,而不是内存块。

最后,你给了CURLFORM_COPYCONTENTS错误的代码。它不是2但是4.请参阅curl.h中的CURLformoption枚举:“CFINIT(NOTHING)”获得值0,并且每个项目都会得到一个更高的值,因此CFINIT(COPYCONTENTS)会获得4.

下面是代码适用于我:

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

谢谢,但我仍然得到'CURL_FORMADD_OPTION_TWICE'。 –

+0

错误代码2并不意味着CURL_FORMADD_OPTION_TWICE,而是列出了如下所述的错误代码:“非零意味着发生了错误,对应于在中定义的CURL_FORMADD_ *常量” –

+0

“CURL_FORMADD_OPTION_TWICE”是具有“CURL_FORMADD_ *值为2.如果这不正确,'2'表示什么? –

相关问题