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 3

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