[英]Download image from HTTP request triggering a breakpoint
我正在尝试使用 Win32 从 URL 将图像下载到用户的桌面上。 我已经处理了所有 HTTP 请求的东西,并且知道它一切正常。 当我 go 调用CreateFile()
时,Visual Studios 调试器只会说“异常:Application.exe 已触发断点”并且它将在 CreateFile() 行上恢复。 还有一个错误代码“检测到严重错误c0000374”
这是我的代码:
VARIANT varResponse;
VariantInit(&varResponse);
...
hr = pIWinHttpRequest->get_ResponseBody(&varResponse);
...
if (SUCCEEDED(hr)) {
long upperBounds;
long lowerBounds;
unsigned char* buff;
//Make sure that varResponse is an array of unsigned bytes
if (varResponse.vt == (VT_ARRAY | VT_UI1)) {
long Dims = SafeArrayGetDim(varResponse.parray);
//It should only have one dimension
if (Dims == 1) {
//Get Array lower and upper bounds
SafeArrayGetLBound(varResponse.parray, 1, &lowerBounds);
SafeArrayGetUBound(varResponse.parray, 1, &upperBounds);
upperBounds++;
SafeArrayAccessData(varResponse.parray, (void**)&buff);
HANDLE hFile;
DWORD dwBytesWritten;
PWSTR filepath[MAX_PATH];
HRESULT hr = SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &*filepath);
if (SUCCEEDED(hr)) {
//PathCombine(filepathForImage, filepathToDesktop, L"\\todaysDailyImage.jpg");
PathAppend(*filepath, L"todaysDailyImage.jpg");
MessageBox(NULL, *filepath, L"Check if filepath works", MB_OK);
}
hFile = CreateFile(*filepath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
//File failed
}
else {
WriteFile(hFile, buff, upperBounds - lowerBounds, &dwBytesWritten, NULL);
//File was written
}
CloseHandle(hFile);
CoTaskMemFree(filepath);
SafeArrayUnaccessData(varResponse.parray);
MessageBox(NULL, L"Everything was cleaned up", L"Update:", MB_OK);
}
}
}
我做错什么了吗?
您使用文件filepath
的方式都是错误的。
您将其声明为MAX_PATH
(260) 个PWSTR
指针的数组。
当您仅通过名称引用数组时,您最终会得到指向数组第一个元素的指针。 因此, &*filepath
与&*(&filepath[0])
相同,实际上是&filepath[0]
。 并且*filepath
与*(&filepath[0])
相同,实际上是filepath[0]
。 所以,就SHGetKnownFolderPath()
和MessageBox()
而言,它们只对数组中的第一个PWSTR
指针进行操作,而忽略其他 259 个数组元素。 那部分还可以,但是很浪费。
但是, PathAppend()
需要一个目标缓冲区,该缓冲区是一个包含MAX_PATH
个WCHAR
元素的数组。 您将附加到SHGetKnownFolderPath()
分配为其 output 的WCHAR[]
数组,该数组不足以容纳您尝试将 append 分配给它的文件名。 因此,您正在触发错误,因为您正在尝试修改尚未分配用于保存该修改的 memory。
您根本不需要PWSTR
数组。 尝试更多类似的东西:
PWSTR folderpath;
HRESULT hr = SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &folderpath);
if (FAILED(hr)) {
// ...
}
else {
PWSTR filepath;
hr = PathAllocCombine(folderpath, L"todaysDailyImage.jpg", 0, &filepath);
if (FAIlED(hr)) {
// ...
}
else {
MessageBoxW(NULL, filepath, L"Check if filepath works", MB_OK);
hFile = CreateFileW(filepath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
//File failed
}
else {
WriteFile(hFile, buff, upperBounds - lowerBounds, &dwBytesWritten, NULL);
//File was written
CloseHandle(hFile);
}
LocalFree(filepath);
}
CoTaskMemFree(folderpath);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.