Esempio n. 1
0
ULONG CV8File::Deflate(unsigned char *DataIn, ULONG DataInSize, unsigned char **DataOut)
{
	// ������� ����� ����� �� string
    HRESULT hr;
    //USES_CONVERSION;

	/*
	IzlibEnginePtr iLibEngine;
	CoInitialize(NULL);
	hr = iLibEngine.CreateInstance(L"V75.zlibEngine");

	if (FAILED(hr))
	{
		AfxMessageBox("err");
		return 0;
	}
	*/
	
    IStreamPtr pStreamNew;
    IStream *pIStrNew;
    if (S_OK == CreateStreamOnHGlobal(NULL, TRUE, &pIStrNew))
	{
		pStreamNew.Attach(pIStrNew, false);
		
		
		ULONG pcbWritten = 0;
		if (pIStrNew->Write(DataIn, DataInSize, &pcbWritten) != S_OK)
		{
			AfxMessageBox("err");
			//pBkEndUI->DoMessageLine("pStreamOut->Read(&lpStr[0], cbStreamSizeOut, &pcbRead) != S_OK", mmBlackErr);	                            
			return 0;
		}              
		
	}
	
    LARGE_INTEGER __zero;
	__zero.QuadPart = __int64(0);
    if (pStreamNew->Seek(__zero, 0, NULL) == S_OK)
    {
	}
	
	
	ULONG cbStreamSizeOut;
    IStreamPtr pStreamOut;
    IStream *pIStrOut;
    if (S_OK == CreateStreamOnHGlobal(NULL, TRUE, &pIStrOut))
    {     
		pStreamOut.Attach(pIStrOut, false);
		try 
		{
			//CoInitialize(NULL);
			//IzlibEnginePtr iLibEngine;
			//hr = iLibEngine.CreateInstance(L"V75.zlibEngine");
			
			//if (FAILED(hr))
			//{
			//	//pBkEndUI->DoMessageLine("error iLibEngine->pkDecompress", mmBlackErr);          
			//	AfxMessageBox("err");
			//	return 0;
			//}
			
			hr = iLibEngine->pkCompress(pStreamNew, pStreamOut);            
			
			if (FAILED(hr))
			{
				//pBkEndUI->DoMessageLine("error iLibEngine->pkDecompress", mmBlackErr);          
				AfxMessageBox("err");
				return 0;
			}          
			else
			{          
				STATSTG St;
				pStreamOut->Stat(&St, STATFLAG_NONAME);
				cbStreamSizeOut = St.cbSize.LowPart;

				LARGE_INTEGER __zero;
				__zero.QuadPart = __int64(0);
				if (pStreamOut->Seek(__zero, 0, NULL) == S_OK)
				{
					
					*DataOut = (unsigned char*)realloc(*DataOut, cbStreamSizeOut);
					ULONG pcbRead = 0;
					if (pStreamOut->Read(*DataOut, cbStreamSizeOut, &pcbRead) != S_OK)
					{
						AfxMessageBox("err");
						//pBkEndUI->DoMessageLine("pStreamOut->Read(&lpStr[0], cbStreamSizeOut, &pcbRead) != S_OK", mmBlackErr);	                            
						return 0;
					}
				}
				else
				{
					AfxMessageBox("err");
					//pBkEndUI->DoMessageLine("pStreamOut->Seek(__zero, 0, NULL) != S_OK", mmBlackErr);	                            
					return 0;
				}
			}
			
		} 
		catch (_com_error& err) 
		{
			//CString str;
			//str.Format("V75.zlibEngine Error:%s", err.ErrorMessage());
			AfxMessageBox(err.ErrorMessage());
			//pBkEndUI->DoMessageLine(str, mmBlackErr);
			return 0;
		}                  
    }
    else
    {
		//pBkEndUI->DoMessageLine("error in CreateStreamOnHGlobal", mmBlackErr);    
		AfxMessageBox("err");
		return 0; 
    }        
    return cbStreamSizeOut;    

}