curl_formadd возвращает `CURL_FORMADD_OPTION_TWICE` при первом вызове
Я пытаюсь создать форму HTTP, используя libcurl, но не могу заставить ее работать должным образом. Каждый раз звоню curl_formadd
это возвращается CURL_FORMADD_OPTION_TWICE
, Единственная информация об этой ошибке указывает на то, что libcurl считает, что я пытаюсь добавить два элемента формы с одинаковым именем, хотя это первый вызов curl_formadd
и я добавляю только один элемент!
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
Что эта ошибка пытается сказать мне?
1 ответ
Читая страницу man для curl_formadd(), там написано:
Указатели firstitem и lastitem должны указывать на NULL при первом вызове этой функции.
Вы, однако, передаете NULL для этих.
Вы также, кажется, пропускаете строки неправильно. Попробуйте определить параметры Value1 и Value2 "как CString", а затем передать обычные строки, а не блоки памяти.
Наконец, вы дали CURLFORM_COPYCONTENTS неправильный код. Это не 2, а 4. См. Перечисление CURLformoption в curl.h: "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