Re: ReadFile from COMponent
От: OlegO Россия http://www.mediachase.ru
Дата: 20.03.02 15:20
Оценка:
Здравствуйте sndralex, Вы писали:

S>Uvazhaemie Gospoda!

S>Pomogite razobrat'sya s problemoi:
S>Ya sozdau s pomosh'u ATL elementarnij COMponent s dvumya funkciyami:

S>[id(1), helpstring("method ReadFromFile")] HRESULT ReadFromFile([in] BSTR fName, [out, retval] BSTR *txtRet);

S>[id(2), helpstring("method Save2File")] HRESULT Save2File([in] BSTR fName, [in] BSTR txt2save);

S>V funkcii ReadFromFile ya prosto chitau text iz faila i vozvrashau ego.

S>I poluchau — error : Memory couldn't be 'written'
S>hotya tot zhe kod v obichnoi programme (ne v COM) rabotaet bezukoriznenno, edinstvennoe otlichie preobrazovanie iz char* v BSTR.

S>Esli uvazhaemie specialisti smogut vzglyanut' na privedennii nizhe code i ukazat' mne na oshibku budu priznatelen .




S>
S>STDMETHODIMP CFIO::ReadFromFile(BSTR fName, BSTR *txtRet)
S>{
S>    // TODO: Add your implementation code here
S>    USES_CONVERSION;
S>    _bstr_t bstrFName(fName,FALSE);
S>    HANDLE hFile;
S>    DWORD dwFileSize;
S>    DWORD dwBytesRead;
S>    BOOL bResult;
S>    char *pBuf;

S>    hFile = CreateFile(bstrFName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
S>    if (hFile == INVALID_HANDLE_VALUE) 
S>    {
S>        CloseHandle(hFile);
S>        return E_FAIL;
S>    }
S>    dwFileSize = GetFileSize(hFile,NULL);
S>    dwBytesRead = 0;
S>    if (dwFileSize == INVALID_FILE_SIZE)
S>    {
S>        CloseHandle(hFile); 
S>        return E_FAIL;
S>    } 
S>    pBuf = new char[dwFileSize];
S>    bResult = ReadFile(hFile,pBuf,dwFileSize,&dwBytesRead,NULL);
S>    if (bResult==0)
S>    {
S>        CloseHandle(hFile); 
S>        return E_FAIL;
S>    } 

S>    *txtRet = ::SysAllocString(A2OLE(pBuf));
S>//    delete pBuf;
S>    CloseHandle(hFile); 
S>    return S_OK;
S>}
S>


S>P.S.

S>proshu prosheniya za translit, poka u menya net drugoi vozmozhnosti beglo pisat' po russki

В какой момент ошибка?

Вобще-то меня подбивает-то, что ты нигде явно не ставишь нуль в конце строки
попробуй строку
pBuf = new char[dwFileSize];

заменить
pBuf = new char[dwFileSize+1];
ZeroMemory((PVOID)pBuf,dwFileSize+1);


Ну и конечно, CloseHandle(hFile); если dwFileSize == INVALID_FILE_SIZE, это тоже не к месту.
Но это так мелочь.

PS Поставь в Watch @Err,hr и посмотри, что API ф-и возвращают, особенно SysAllocString.
С уважением, OlegO.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.