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.ч: "CFINIT(ничего)" возвращает значение 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