【发布时间】:2021-12-25 18:09:12
【问题描述】:
我正在尝试使用 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() 从服务器下载时,一切似乎都很好。它只是不喜欢我在这里某处所做的事情。任何线索我做错了什么?
【问题讨论】:
-
与您的问题无关,但在 C++ 中,所有文字字符串实际上都是常量字符数组,它衰减为指向常量字符的指针(即
const char*)。换句话说,不需要(const char*)"POST"中的演员表。事实上,每当你觉得需要进行这样的 C 风格转换时,你应该把它当作你做错了什么的标志。 -
回到错误的 C 样式转换,字符串
"*/*\0"将衰减为const char*类型的指针。绝对不可能将其用作指向指针的指针(您尝试使用强制转换为const char**)。而且很可能是坠机的原因。如果您删除演员表,编译器应该(正确地)抱怨。抛开这些抱怨不是一个好主意。 -
某个程序员老兄,这就是答案。但雷米(下)也给出了一个可行的答案,但没有具体说明。既然你先回答了,如果你想在下面给出答案,我会给你功劳。
-
@KiraHoneybee 我的回答怎么没有提供细节?
-
读取位置 0x002A2F2A - 这是
"*/*"的二进制值。字符串数据解释为指针。错误已经给你强烈的提示
标签: c++ windows winapi networking