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 110 111 112 113 114
   |  
class CAboutDlg : public CDialog
{
public:
	CAboutDlg();
	static DWORD CALLBACK RichEditStreamInCallback(DWORD dwCookie,LPBYTE pbBuff, LONG cb, LONG FAR *pcb); 
	static DWORD CALLBACK CAboutDlg::RichEditStreamOutCallback(DWORD dwCookie, 
								  LPBYTE pbBuff, LONG cb, LONG FAR *pcb);
 
 
	bool	m_bNewFile;
	CString m_strRtfFileName;
	HANDLE  m_hFile;
//...............
};
// .cpp
DWORD CALLBACK CAboutDlg::RichEditStreamOutCallback(DWORD dwCookie, 
								  LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
 
{
	CAboutDlg* pDlg = reinterpret_cast<CAboutDlg*>(dwCookie); 
 
	if(pDlg->m_bNewFile)
	{
		pDlg->m_bNewFile=false;
		pDlg->m_hFile = CreateFile(pDlg->m_strRtfFileName,
			GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
		if(pDlg->m_hFile == INVALID_HANDLE_VALUE)
		{
			pDlg->m_hFile = CreateFile(pDlg->m_strRtfFileName,
				GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
		}
	}
	if(pDlg->m_hFile == INVALID_HANDLE_VALUE)	return 1;
 
   DWORD bytesWritten;
   WriteFile(pDlg->m_hFile,pbBuff,cb,&bytesWritten,NULL);
 
    *pcb = bytesWritten;
	if(bytesWritten != (DWORD)cb || bytesWritten == 0)
	{
	   if(pDlg->m_hFile != INVALID_HANDLE_VALUE)
	   {
			CloseHandle(pDlg->m_hFile);
			pDlg->m_bNewFile=true;	
		}
	}
   return 0;
}
// ----------------------------------------------------------------------------
DWORD CALLBACK CAboutDlg::RichEditStreamInCallback(DWORD dwCookie, 
								  LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
{
	CAboutDlg* pDlg = reinterpret_cast<CAboutDlg*>(dwCookie); 
 
	if(pDlg->m_bNewFile)
	{
		pDlg->m_bNewFile=false;
		pDlg->m_hFile = CreateFile(pDlg->m_strRtfFileName,
			GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
	}
	if(pDlg->m_hFile == INVALID_HANDLE_VALUE)
		return 1;
 
	//read some data	
	DWORD bytesRead;
	int rt = ReadFile(pDlg->m_hFile,pbBuff,cb,&bytesRead,NULL);
	if(rt == FALSE)
		return 1;
 
	*pcb = bytesRead;
	if(bytesRead != (DWORD)cb || bytesRead == 0)
	{
		if(pDlg->m_hFile != INVALID_HANDLE_VALUE)
		{
			CloseHandle(pDlg->m_hFile);
			pDlg->m_bNewFile=true;
		}
	}
	return 0;
}
BOOL CAboutDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
 
	m_strRtfFileName="c:\\initial.rtf";
	m_bNewFile=true;
	m_hFile=INVALID_HANDLE_VALUE;
 
	// TODO: Add extra initialization here
	CRichEditCtrl* pRichEditCtrl = new CRichEditCtrl;
	pRichEditCtrl->Create(WS_CHILD|WS_BORDER|ES_MULTILINE,CRect(10,10,100,200),this,1);
	EDITSTREAM es;
 
	es.dwCookie =(DWORD_PTR )this;
    es.dwError = 0; 
    es.pfnCallback = (EDITSTREAMCALLBACK)RichEditStreamInCallback;
	pRichEditCtrl->StreamIn(SF_RTF,es);
 
	// traitement ici 
	//
	//
	m_strRtfFileName="c:\\other.rtf";
	es.dwCookie =(DWORD_PTR )this;
    es.dwError = 0; 
    es.pfnCallback = (EDITSTREAMCALLBACK)RichEditStreamOutCallback;
	pRichEditCtrl->StreamOut(SF_RTF,es);
 
	pRichEditCtrl->DestroyWindow();
	delete pRichEditCtrl;
 
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
} | 
Partager