Здравствуйте 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.