[pywin32-checkins] pywin32/win32/src stddde.h,1.2,1.3
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
From: Mark H. <mha...@us...> - 2008-12-06 00:34:12
|
Update of /cvsroot/pywin32/pywin32/win32/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv20504/win32/src Modified Files: stddde.h Log Message: Fix broken memory allocation in DDE module and support for unicode builds without leaking mem Index: stddde.h =================================================================== RCS file: /cvsroot/pywin32/pywin32/win32/src/stddde.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** stddde.h 13 Nov 2008 09:48:01 -0000 1.2 --- stddde.h 6 Dec 2008 00:34:06 -0000 1.3 *************** *** 43,46 **** --- 43,76 ---- static CString GetFormatName(WORD wFmt); + // A class used for memory allocation; designed to be created on the stack, + // then passed around. + class CDDEAllocator + { + public: + CDDEAllocator(DWORD instance, HSZ hszItem, UINT wFmt, HDDEDATA *hret) : + m_instance(instance), m_hszItem(hszItem), m_wFmt(wFmt), m_hret(hret) {;} + BOOL Alloc(CString &cs) { + // XXX - should we check wFmt is CF_TEXT vs CF_UNICODETEXT?? + return Alloc((LPBYTE)(const TCHAR *)cs, (cs.GetLength() + 1) * sizeof(TCHAR)); + } + BOOL Alloc(LPBYTE p, DWORD cb) { + // XXX - should we check wFmt is CF_TEXT vs CF_UNICODETEXT?? + *m_hret = ::DdeCreateDataHandle(m_instance, + p, + cb, + 0, + m_hszItem, + m_wFmt, + 0); + return TRUE; + } + protected: + UINT m_wFmt; + DWORD m_instance; + HSZ m_hszItem; + HDDEDATA *m_hret; + + }; + // // Generic counted object class *************** *** 97,107 **** void Create(const TCHAR* pszName); void PostAdvise(); ! virtual BOOL Request(UINT wFmt, void** ppData, DWORD* pdwSize); //CT BEGIN ! virtual BOOL NSRequest(const TCHAR* szItem, void** ppData, DWORD* pdwSize); ! virtual BOOL NSPoke(const TCHAR* szItem, void* pData, DWORD dwSize); ! virtual BOOL Poke(void* pData, DWORD dwSize); //CT END ! virtual BOOL Poke(UINT wFmt, void* pData, DWORD dwSize); virtual BOOL IsSupportedFormat(WORD wFormat); virtual WORD* GetFormatList() --- 127,137 ---- void Create(const TCHAR* pszName); void PostAdvise(); ! virtual BOOL Request(UINT wFmt, CDDEAllocator &allocr); //CT BEGIN ! virtual BOOL NSRequest(const TCHAR* szItem, CDDEAllocator &allocr); ! virtual BOOL NSPoke(const TCHAR* szItem, void* pData, DWORD dwSize); ! virtual BOOL Poke(void* pData, DWORD dwSize); //CT END ! virtual BOOL Poke(UINT wFmt, void* pData, DWORD dwSize); virtual BOOL IsSupportedFormat(WORD wFormat); virtual WORD* GetFormatList() *************** *** 131,135 **** protected: ! virtual BOOL Request(UINT wFmt, void** ppData, DWORD* pdwSize); virtual BOOL Poke(UINT wFmt, void* pData, DWORD dwSize); virtual WORD* GetFormatList(); --- 161,165 ---- protected: ! virtual BOOL Request(UINT wFmt, CDDEAllocator &allocr); virtual BOOL Poke(UINT wFmt, void* pData, DWORD dwSize); virtual WORD* GetFormatList(); *************** *** 167,175 **** void Create(const TCHAR* pszName); BOOL AddItem(CDDEItem* pItem); ! virtual BOOL Request(UINT wFmt, const TCHAR* pszItem, ! void** ppData, DWORD* pdwSize); //CT BEGIN ! virtual BOOL NSRequest(const TCHAR * szItem, void** ppData, DWORD* pdwSize); ! virtual BOOL NSPoke(const TCHAR * szItem, void* pData, DWORD dwSize); virtual BOOL Poke(const TCHAR* pszItem, void* pData, DWORD dwSize); --- 197,206 ---- void Create(const TCHAR* pszName); BOOL AddItem(CDDEItem* pItem); ! virtual BOOL Request(UINT wFmt, const TCHAR* pszItem, CDDEAllocator &allocr); //CT BEGIN ! virtual BOOL NSRequest(const TCHAR *szItem, CDDEAllocator &allocr); ! // Note: If poke ever needs to return data, it should do like NSRequest, ! // otherwise memory management becomes impossible. ! virtual BOOL NSPoke(const TCHAR * szItem, void* pData, DWORD dwSize); virtual BOOL Poke(const TCHAR* pszItem, void* pData, DWORD dwSize); *************** *** 217,221 **** CDDEConv(CDDEServer* pServer); CDDEConv(CDDEServer* pServer, HCONV hConv, HSZ hszTopic); ! BOOL Connected() {return (m_hConv != NULL);} virtual ~CDDEConv(); virtual BOOL ConnectTo(const TCHAR* pszService, const TCHAR* pszTopic); --- 248,252 ---- CDDEConv(CDDEServer* pServer); CDDEConv(CDDEServer* pServer, HCONV hConv, HSZ hszTopic); ! BOOL Connected() {return (m_hConv != NULL);} virtual ~CDDEConv(); virtual BOOL ConnectTo(const TCHAR* pszService, const TCHAR* pszTopic); *************** *** 223,227 **** virtual BOOL AdviseData(UINT wFmt, const TCHAR* pszTopic, const TCHAR* pszItem, void* pData, DWORD dwSize); ! virtual BOOL Request(const TCHAR* pszItem, void** ppData, DWORD* pdwSize); virtual BOOL Advise(const TCHAR* pszItem); virtual BOOL Exec(const TCHAR* pszCmd); --- 254,258 ---- virtual BOOL AdviseData(UINT wFmt, const TCHAR* pszTopic, const TCHAR* pszItem, void* pData, DWORD dwSize); ! virtual BOOL Request(const TCHAR* pszItem, CString &ret); virtual BOOL Advise(const TCHAR* pszItem); virtual BOOL Exec(const TCHAR* pszCmd); *************** *** 269,273 **** DECLARE_DYNCREATE(CDDESystemItem_TopicList); protected: ! virtual BOOL Request(UINT wFmt, void** ppData, DWORD* pdwSize); }; --- 300,304 ---- DECLARE_DYNCREATE(CDDESystemItem_TopicList); protected: ! virtual BOOL Request(UINT wFmt, CDDEAllocator &allocr); }; *************** *** 276,280 **** DECLARE_DYNCREATE(CDDESystemItem_ItemList); protected: ! virtual BOOL Request(UINT wFmt, void** ppData, DWORD* pdwSize); }; --- 307,311 ---- DECLARE_DYNCREATE(CDDESystemItem_ItemList); protected: ! virtual BOOL Request(UINT wFmt, CDDEAllocator &allocr); }; *************** *** 283,287 **** DECLARE_DYNCREATE(CDDESystemItem_FormatList); protected: ! virtual BOOL Request(UINT wFmt, void** ppData, DWORD* pdwSize); }; --- 314,318 ---- DECLARE_DYNCREATE(CDDESystemItem_FormatList); protected: ! virtual BOOL Request(UINT wFmt, CDDEAllocator &allocr); }; *************** *** 291,295 **** protected: virtual BOOL Request(UINT wFmt, const TCHAR* pszItem, ! void** ppData, DWORD* pdwSize); }; --- 322,326 ---- protected: virtual BOOL Request(UINT wFmt, const TCHAR* pszItem, ! CDDEAllocator &allocr); }; *************** *** 327,331 **** virtual BOOL Request(UINT wFmt, const TCHAR* pszTopic, const TCHAR* pszItem, ! void** ppData, DWORD* pdwSize); virtual BOOL Poke(UINT wFmt, const TCHAR* pszTopic, const TCHAR* pszItem, void* pData, DWORD dwSize); --- 358,362 ---- virtual BOOL Request(UINT wFmt, const TCHAR* pszTopic, const TCHAR* pszItem, ! CDDEAllocator &allocr); virtual BOOL Poke(UINT wFmt, const TCHAR* pszTopic, const TCHAR* pszItem, void* pData, DWORD dwSize); |