WinInet上传文件调用HttpOpenRequest出现访问违规该如何解决?
问题原因分析
你出现访问违规的核心错误是HttpOpenRequest的第6个参数(接受类型参数)传入方式错误:
- 该参数要求传入的是以NULL结尾的
const char*类型数组的首指针,类型为LPCSTR*也就是const char** - 你直接将字符串字面量
"*/*\0"强制转换为const char**传入,相当于把字符串本身存储的字符值当成了内存地址去读取,你遇到的错误地址0x002A2F2A刚好对应ASCII字符*(0x2A)、/(0x2F)、*(0x2A)的拼接值,就是这个错误操作直接导致的内存访问违规。
修正方案
首先定义符合要求的接受类型数组,再传入函数即可:
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) { // 先定义以NULL结尾的接受类型数组 const char* acceptTypes[] = {"*/*", NULL}; // 直接传入数组名即可,不需要强制类型转换 HINTERNET aRequest=HttpOpenRequest(aConnect, "POST","myphppage.php", NULL, NULL, acceptTypes,0,1); // 后续业务逻辑 }
之前使用InternetOpenURL没有出现问题,是因为该函数不需要手动传入接受类型数组参数,内部已经做了默认处理,所以没有触发这个参数传递错误。
内容的提问来源于stack exchange,提问作者KiraHoneybee
相关产品推荐
相关产品推荐

