2012-08-29 29 views
0

任何libcurl專家誰可能知道一些關於它?libcurl curl_easy_setopt long參數傳遞不正確 - va_arg(param,long)

我注意到這一點,因爲我無法打開的libcurl VERBOSE關閉:

curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L); 

當我跟蹤直通呼叫進入的libcurl,我發現0L(長)被轉換成一個非零數,導致VERBOSE永遠在線。我沒有嘗試,但我很確定任何長參數不會正確傳遞。

data->set.verbose = (0 != va_arg(param, long))?TRUE:FALSE; 

其中

#define va_arg _crt_va_arg 
#define _crt_va_arg(ap,t) (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t))) 
#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1)) 

但我不知道這些是什麼做的。
爲什麼發生這種情況以及如何解決?

我使用Visual Studio 2010的C++與libcurl的7.27.0

回答

1

va_arg()使用指針運算從您va_list param提取0L。您可以通過va_list類型herehere瞭解更多信息。它是而不是將您的0L轉換爲非零數字。

嘗試調用curl_easy_setopt()以前打開的連接。該文檔指出,你的詳細設置是「爲一些獨立的連接設置一次」(urldata.h ln 1537)。

如果你還是不相信它的工作,你可以投你CURL *爲SessionHandle *並在調試檢查它,如:

struct SessionHandle *data = reinterpret_cast<SessionHandle*>(curl); 
// Inspect data->set.verbose 

你會發現SessionHandle的定義在urldata.h中。

+0

感謝Scotty! va_last和va_args上非常有用的帖子。 SessionHandle的東西是一個很好的提示,所以我現在可以檢查curl的狀態。我仍然無法關閉詳細但可能這是另一個問題。我確實移動了電話(創建CURL句柄後),但仍然沒有運氣。不知道是否因爲我在調試時沒有每次調用global_cleanup。 –