E_FAIL == ЧЁ ЗА ХРЕНЬ ...

Тема в разделе "WASM.WIN32", создана пользователем Songoku, 2 окт 2007.

  1. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    Вообщем, может кто нибудь с талкивался с такой проблемой.

    есть код который загружает файл из интернета, а потом конвертирует в IPucture.
    весь прикол заключается в том, что, то он работает, а то нет, из за чего это я понять не могу,
    понятно только одно что при ошибке OleLoadPicture выбрасывает E_FAIL и всё :dntknw:


    Код (Text):
    1. HGLOBAL DownloadFile(LPCTSTR szURL, DWORD *dwBytesRead)
    2. {
    3.     *dwBytesRead    = NULL;
    4.     HGLOBAL hGlobal = NULL;
    5.     HINTERNET hInternet = InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
    6.     if (hInternet) {
    7.         HINTERNET hFile = InternetOpenUrl(hInternet,szURL,NULL,NULL,INTERNET_FLAG_RELOAD,NULL);
    8.         if (hFile){
    9.             if (InternetQueryDataAvailable(hFile,dwBytesRead,NULL,NULL))
    10.             {
    11.                 hGlobal = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, *dwBytesRead + 0x100);
    12.                 LPVOID pvData = GlobalLock(hGlobal);
    13.                 BOOL bRead =InternetReadFile(hFile,pvData,*dwBytesRead,dwBytesRead);
    14.                 GlobalUnlock(hGlobal);
    15.                 if (!bRead)
    16.                 {
    17.                     GlobalFree(hGlobal);
    18.                     hGlobal = NULL;
    19.                 }
    20.             }
    21.         InternetCloseHandle(hFile);
    22.         }
    23.         InternetCloseHandle(hInternet);
    24.     }
    25.     return (HGLOBAL)hGlobal;
    26. }
    27.  
    28.  
    29.  
    30. LPPICTURE GetImage(HGLOBAL imagefile, DWORD dwSize)
    31. {
    32.  
    33.      LPSTREAM pstm = NULL;
    34.      LPPICTURE pgpPicture;
    35.      if (CreateStreamOnHGlobal(imagefile, TRUE, &pstm)!=S_OK) return (LPPICTURE)0;
    36.  
    37.  
    38.      if  (::OleLoadPicture(pstm, dwSize, FALSE, IID_IPicture, (LPVOID *)&pgpPicture)==S_OK)
    39.      {
    40.          pstm->Release();
    41.          return pgpPicture;
    42.      }
    43.      else
    44.      {
    45.         pstm->Release();
    46.         return (LPPICTURE)0;
    47.      }
    48.  
    49. }
    50.  
    51. ...
    52.  
    53. DWORD dwSize = 0;
    54. HGLOBAL imagefile = DownloadFile("http://www.wasm.ru/pic/header.gif", &dwSize);
    55. picture = GetImage(imagefile,dwSize);
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    E_Fail в каком месте?
     
  3. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    if (::OleLoadPicture(pstm, dwSize, FALSE, IID_IPicture, (LPVOID *)&pgpPicture)==S_OK)
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    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 ...". У меня вторая функция отработала нормально, правда я сохранил файл на диск, а потом скормил его.
     
  5. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    Код (Text):
    1. LPPICTURE GetImage(HGLOBAL imagefile, DWORD dwSize)
    2. {
    3.  
    4.      LPSTREAM pstm = NULL;
    5.      LPPICTURE pgpPicture;
    6.      if (CreateStreamOnHGlobal(imagefile, TRUE, &pstm)!=S_OK) return (LPPICTURE)0;
    7.  
    8.  
    9.      if  (::OleLoadPicture(pstm, dwSize, FALSE, IID_IPicture, (LPVOID *)&pgpPicture)==S_OK)
    10.      {
    11.          pstm->Release();
    12.          return pgpPicture;
    13.      }
    14.      else
    15.      {
    16.  
    17.         HANDLE hFile = CreateFile("C:\\hardtest.jpg", GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    18.         LPVOID pvData = GlobalLock(imagefile);
    19.         WriteFile(hFile,pvData,dwSize,&dwSize,NULL);
    20.         GlobalUnlock(imagefile);
    21.         CloseHandle(hFile);
    22.         pstm->Release();
    23.         return (LPPICTURE)0;
    24.      }
    25.  
    26. }
    Я решил изменить немного функцию, так что бы в случаее не удачи она бы сбрасывала дамп не загруженной картинки, но весь прикол заклучается в том что всё велеколептно работает :dntknw: Больше всего нанавижу ошибки и глюки которые сами чинятся! А OleLoadPicturePath тоже как вариант очень интересен, сейчас пока посмотрю как она будет работатать, если глюки будут, наверное заменю! Да и ещё, у меня есть маленькая идея, я работаю на 64 битной платформе, но разрабатываю 32 бита, всем известно что когда программируешь под 64 бита, стек должен быть выравнен на 16 байт.
    Потом я ещё заметил что системные функции(Nativ) такие например как NtQueryInformationThread, дают сбой когда им суюшь обычный выделенный буффер из стека,! Я часто это видел, в таких случаях мне приходилось пользоваться VirtaulAlloc, как вараин у меня в голове крутится вот это, потому что pvData = GlobalLock(hGlobal); выбрасывает тоже смешные адресса! Всё, всем спасибо, буду очень рад услашать ваше мнение по этому поводу!
     
  6. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    Воообщем проблема заключается в том что картинки криво загружаются!
    Проблема в DownloadFile, как можно скачать файл и узнать о том правильно ли скачалось или нет?
     
  7. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    вообщем, проблема заключалась в определении размера файла (InternetQueryDataAvailable),
    я на шел альтернативный сопособ
    Код (Text):
    1. HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER,dwBytesRead, &dwSize, NULL);
    сейчас бубу тестировать, если ничего не получится вобу тогда как в этом примере показанно загружать файл :)
    http://www.winehq.org/pipermail/wine-devel/2005-February/034288.html