FCGICache::~FCGICache() { if( _buf ) { delete []_buf; } if( _file ) { _file->close(); /* * 临时文件 close() 后自动删除 if(!WINFile::remove(AtoT(_fileName).c_str())) { TRACE("WINFile::remove() %s failed,%s.\r\n", _fileName.c_str(), get_last_error().c_str()); } */ delete _file; } else { /* * 由于每获得一个临时文件名,系统就将创建一个空文件. * 没有使用 _file 只需把这个空文件删除即可. */ if(!WINFile::remove(AtoT(_fileName).c_str())) { TRACE("WINFile::remove() %s failed,%s.\r\n", _fileName.c_str(), get_last_error().c_str()); } } }
extern "C" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpCmdLine*/, int /*nShowCmd*/) { try { // Start Win32++ VPApp theApp(hInstance); theApp.InitInstance(); // Run the application return theApp.Run(); } // catch all CException types catch (const CException &e) { // Display the exception and quit MessageBox(NULL, e.GetText(), AtoT(e.what()), MB_ICONERROR); return -1; } }
size_t FCGICache::write(const void *buf, size_t len) { size_t wr = 0; /* 分配缓冲 */ if( _buf == NULL && _bufSize > 0 ) { _buf = new byte[_bufSize]; assert(_buf); if( NULL == _buf ) return 0; _rpos = 0; _wpos = 0; } /* 如果内存缓冲区内还有空间,则先写入内存 */ if( _bufSize - _wpos >= len ) { wr = len; } else { wr = _bufSize - _wpos; } if( wr > 0 ) { memcpy(_buf + _wpos, buf, wr); _wpos += wr; } /* 剩下的数据写入文件中 */ if( wr < len ) { if(_file == NULL) { _file = new WINFile; _file->open(AtoT(_fileName).c_str(), WINFile::rw, true); assert(_file->isopen()); _frpos = 0; _fwpos = 0; if(!_file->isopen()) { delete _file; _file = NULL; LOGGER_CFATAL(theLogger, _T("无法打开临时文件[%s],错误码[%d].\r\n"), AtoT(_fileName).c_str(), errno); } } if( _file ) { //fseek(_file, _fwpos, SEEK_SET); //size_t fwr = fwrite(reinterpret_cast<const byte*>(buf) + wr, 1, len - wr, _file); _file->seek(_fwpos, WINFile::s_set); size_t fwr = _file->write(reinterpret_cast<const byte*>(buf) + wr, len - wr); _fwpos += fwr; wr += fwr; } } // 记录总长度 _size += wr; return wr; }