我正在嘗試使用 WinInet 將檔案上傳到 PHP 頁面。我在其中一項功能上遇到訪問沖突,但不知道為什么。我已經從示例頁面構建了代碼。
這是代碼:
HINTERNET aInternet=InternetOpen("My-Custom-Agent/1.0",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
HINTERNET aConnect=InternetConnect(aInternet,"www.myserver.com",INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
if (aConnect)
{
HINTERNET aRequest=HttpOpenRequest(aConnect, (const char*)"POST","myphppage.php", NULL, NULL, (const char**)"*/*\0",0,1);
// ^^
// Exception happens on this line
// Exception thrown at 0x70C85B7C (ininet.dll) in TestApp.exe:
// 0xC00000005: Access violation reading location 0x002A2F2A
//
}
當我從服務器下載時InternetOpenURL(),一切似乎都很好。它只是不喜歡我在這里做的事情。任何線索我做錯了什么?
uj5u.com熱心網友回復:
根據HttpOpenRequest()檔案:
[in] lplpszAcceptTypes指向以null 結尾的字串陣列的指標,指示客戶端接受的媒體型別。這是一個例子。
PCTSTR rgpszAcceptTypes[] = {_T("text/*"), NULL};未能使用 NULL 指標正確終止陣列將導致崩潰。
您正在傳遞一個指向單個以空字符結尾的字串的指標,該字串被錯誤地型別轉換為const char**:
lplpszAcceptTypes -> "*/*"
但是該函式需要一個指向空終止字串指標陣列的指標,其中陣列中的最后一個元素必須為 NULL 才能終止陣列(因為沒有函式引數來指定陣列中的元素數量):
-----
lplpszAcceptTypes -> | 0 | -> "*/*"
|---|
| 1 | -> NULL
-----
看到不同?
該函式將字串文字的內容誤解為指標,但事實并非如此,因此導致 AV 崩潰。發生 AV 的地址0x002A2F2A實際上與字串文字 ( "*/*“= 0x2A 0x2F 0x2A 0x00)的內容相同的位元組。
您需要改用它:
LPCSTR rgpszAcceptTypes[] = {"*/*", NULL};
HINTERNET aRequest = HttpOpenRequest(aConnect, "POST", "myphppage.php", NULL, NULL, rgpszAcceptTypes, 0, 1);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357875.html
上一篇:如何將代碼`SetConsoleTextAttribute(hStdout,192)`中的192的值分解為前景色和背景色?
