Вообщем, может кто нибудь с талкивался с такой проблемой. есть код который загружает файл из интернета, а потом конвертирует в IPucture. весь прикол заключается в том, что, то он работает, а то нет, из за чего это я понять не могу, понятно только одно что при ошибке OleLoadPicture выбрасывает E_FAIL и всё Код (Text): HGLOBAL DownloadFile(LPCTSTR szURL, DWORD *dwBytesRead) { *dwBytesRead = NULL; HGLOBAL hGlobal = NULL; HINTERNET hInternet = InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); if (hInternet) { HINTERNET hFile = InternetOpenUrl(hInternet,szURL,NULL,NULL,INTERNET_FLAG_RELOAD,NULL); if (hFile){ if (InternetQueryDataAvailable(hFile,dwBytesRead,NULL,NULL)) { hGlobal = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, *dwBytesRead + 0x100); LPVOID pvData = GlobalLock(hGlobal); BOOL bRead =InternetReadFile(hFile,pvData,*dwBytesRead,dwBytesRead); GlobalUnlock(hGlobal); if (!bRead) { GlobalFree(hGlobal); hGlobal = NULL; } } InternetCloseHandle(hFile); } InternetCloseHandle(hInternet); } return (HGLOBAL)hGlobal; } LPPICTURE GetImage(HGLOBAL imagefile, DWORD dwSize) { LPSTREAM pstm = NULL; LPPICTURE pgpPicture; if (CreateStreamOnHGlobal(imagefile, TRUE, &pstm)!=S_OK) return (LPPICTURE)0; if (::OleLoadPicture(pstm, dwSize, FALSE, IID_IPicture, (LPVOID *)&pgpPicture)==S_OK) { pstm->Release(); return pgpPicture; } else { pstm->Release(); return (LPPICTURE)0; } } ... DWORD dwSize = 0; HGLOBAL imagefile = DownloadFile("http://www.wasm.ru/pic/header.gif", &dwSize); picture = GetImage(imagefile,dwSize);
Songoku Например, msdn. OleLoadPicture: "... Remarks The stream must be in BMP (bitmap), WMF (metafile), or ICO (icon) format ...", а msdn. OleLoadPicturePath: "... Remarks The stream must be in BMP (bitmap), JPEG, WMF (metafile), ICO (icon), or GIF format ...". У меня вторая функция отработала нормально, правда я сохранил файл на диск, а потом скормил его.
Код (Text): LPPICTURE GetImage(HGLOBAL imagefile, DWORD dwSize) { LPSTREAM pstm = NULL; LPPICTURE pgpPicture; if (CreateStreamOnHGlobal(imagefile, TRUE, &pstm)!=S_OK) return (LPPICTURE)0; if (::OleLoadPicture(pstm, dwSize, FALSE, IID_IPicture, (LPVOID *)&pgpPicture)==S_OK) { pstm->Release(); return pgpPicture; } else { HANDLE hFile = CreateFile("C:\\hardtest.jpg", GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); LPVOID pvData = GlobalLock(imagefile); WriteFile(hFile,pvData,dwSize,&dwSize,NULL); GlobalUnlock(imagefile); CloseHandle(hFile); pstm->Release(); return (LPPICTURE)0; } } Я решил изменить немного функцию, так что бы в случаее не удачи она бы сбрасывала дамп не загруженной картинки, но весь прикол заклучается в том что всё велеколептно работает Больше всего нанавижу ошибки и глюки которые сами чинятся! А OleLoadPicturePath тоже как вариант очень интересен, сейчас пока посмотрю как она будет работатать, если глюки будут, наверное заменю! Да и ещё, у меня есть маленькая идея, я работаю на 64 битной платформе, но разрабатываю 32 бита, всем известно что когда программируешь под 64 бита, стек должен быть выравнен на 16 байт. Потом я ещё заметил что системные функции(Nativ) такие например как NtQueryInformationThread, дают сбой когда им суюшь обычный выделенный буффер из стека,! Я часто это видел, в таких случаях мне приходилось пользоваться VirtaulAlloc, как вараин у меня в голове крутится вот это, потому что pvData = GlobalLock(hGlobal); выбрасывает тоже смешные адресса! Всё, всем спасибо, буду очень рад услашать ваше мнение по этому поводу!
Воообщем проблема заключается в том что картинки криво загружаются! Проблема в DownloadFile, как можно скачать файл и узнать о том правильно ли скачалось или нет?
вообщем, проблема заключалась в определении размера файла (InternetQueryDataAvailable), я на шел альтернативный сопособ Код (Text): HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER,dwBytesRead, &dwSize, NULL); сейчас бубу тестировать, если ничего не получится вобу тогда как в этом примере показанно загружать файл http://www.winehq.org/pipermail/wine-devel/2005-February/034288.html