powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Броузер
2 сообщений из 2, страница 1 из 1
Броузер
    #34651649
Гадёныш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
итак платформа 2005 студия с++

реализовал технологию Asynchronous Pluggable Protocol
Инфу можна найти здесь http://]http://rsdn.ru/article/inet/pluggprotocol.xml

всё работает чудесно, но картинки, которые я пытаюсь считать локально с диска на методе Read нормально отображаются только первый раз... после этого выдаёт мусор из памяти, причём мусор является частью картинки.
IStream из которого читаю вроде пишет корректно... в памяти во всяком случае весь файл картинки нормальный, записывается в область памяти который предоставляет ИЕ на методе Read тоже нормально... но итоговое значение мусор.

помогите пожайлуста или посоветуйте другой метод записи

функции считывания файла в поток и его копирование в буффер ИЕ ниже:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
//Load data to m_pIStream from DataBase
HRESULT CDataPluggableProtocol::LoadDataToIStream(LPCWSTR wstrUrl)
{
	//CString strUrl = wstrUrl;
	CString strFileName = wstrUrl;

	// parse URL
	//strFileName = strUrl.Right(strUrl.GetLength() - (strUrl.Find(_T("//"),0)+2));

	// open file
	HANDLE hFile = CreateFile(strFileName, GENERIC_READ,  0 , NULL, OPEN_EXISTING,  0 , NULL);
	_ASSERTE(INVALID_HANDLE_VALUE != hFile);

	// get file size
	DWORD dwFileSize = GetFileSize(hFile, NULL);
	_ASSERTE(- 1  != dwFileSize);

	LPVOID pvData = NULL;
	// alloc memory based on file size
    
	m_hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
	_ASSERTE(NULL != m_hGlobal);

	pvData = GlobalLock(m_hGlobal);
	_ASSERTE(NULL != pvData);

	DWORD dwBytesRead =  0 ;
	// read file and store in global memory
	BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
	_ASSERTE(FALSE != bRead);
	GlobalUnlock(m_hGlobal);
	CloseHandle(hFile);

	// create IStream* from global memory
	m_pIStream.Release();
	HRESULT hr = CreateStreamOnHGlobal(m_hGlobal, TRUE, &m_pIStream);
	_ASSERTE(SUCCEEDED(hr) && m_pIStream);
	if(FAILED(hr)) return hr;

	ULARGE_INTEGER nLen;
	LARGE_INTEGER nLen1;
	nLen1.QuadPart =  0 ;
	if(FAILED(m_pIStream->Seek(nLen1, STREAM_SEEK_END, &nLen))) return E_FAIL;
	m_lSize = nLen.LowPart;
    nLen1.QuadPart =  0 ;
    if(FAILED(m_pIStream->Seek(nLen1, STREAM_SEEK_SET, &nLen))) return E_FAIL;
	m_lPosition =  0 ;
	return S_OK;


STDMETHODIMP CDataPluggableProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead)
{
	if (!m_pIStream) return S_FALSE;
    if(m_lPosition >= m_lSize) return S_FALSE;
    BOOL Status = FALSE;

	//set position of begin
	LARGE_INTEGER nLen1;
	nLen1.QuadPart = m_lPosition;
    ULARGE_INTEGER nSeek;
	if(FAILED(m_pIStream->Seek(nLen1, STREAM_SEEK_SET, &nSeek)))
	{
		return INET_E_DOWNLOAD_FAILURE;
	}

	//read data to browser
    HRESULT hr = S_OK;
    hr = m_pIStream->Read(pv, cb, pcbRead);
	if ( SUCCEEDED( hr ))
	{
		if (*pcbRead !=  0 )
		{
			Status = TRUE;
			m_lPosition += *pcbRead;
		}
		else
			return S_FALSE;
	}

	ATLTRACE(_T("nBuffer is %ld\n"), *pcbRead);

	if (Status == FALSE) 
	{
		DWORD error = GetLastError();
		ATLTRACE(_T("Errno = %d\n"), error);
		return INET_E_DOWNLOAD_FAILURE;
	}
	else
		if (m_lSize - m_lPosition >  0 ) 	// more to read ?
		{
			if (m_pIProtSink != NULL)
				m_pIProtSink->ReportData(BSCF_INTERMEDIATEDATANOTIFICATION, m_lPosition, m_lSize);
			return S_OK;
		}

		if (m_pIProtSink != NULL)
		{
			m_pIProtSink->ReportData(BSCF_LASTDATANOTIFICATION, m_lSize, m_lSize);
			m_pIProtSink->ReportResult(S_OK,  0 , NULL);
            if(m_hGlobal) GlobalFree(m_hGlobal),m_hGlobal= 0 ;
            m_pIStream.Release();
            m_lSize =  0 ;
            m_lPosition =  0 ;
            return S_OK;
		}

	return S_FALSE;	
}
}
...
Рейтинг: 0 / 0
Броузер
    #34652449
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то у вас напутано с управлением памятью, однозначно.

в функции LoadDataToIStream :
m_hGlobal = GlobalAlloc(...) - выделяем память
pvData = GlobalLock( m_hGlobal ); - блокируем, насколько я понимаю

далее вызываем Read, в котором, если всё нормально (Status == TRUE)
if(m_hGlobal) GlobalFree( m_hGlobal ) - освобождаем память

после возвращения из Read
GlobalUnlock( m_hGlobal ) - разблокируем память

и уже потом, в довершение:
HRESULT hr = CreateStreamOnHGlobal( m_hGlobal , ... ); - опять используем её

Удивительно, что программа просто мусор выдаёт, а не падает или форматирует винчестер

По моему ИМХО требуется переписать систему управления памятью в этом классе в более корректный вариант
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Броузер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]