// Guid.cpp: implementation of the CGuid class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Guid.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CGuid::CGuid() :m_status(null) { memset( &m_guid, 0, sizeof(GUID) ); } CGuid::CGuid( const CGuid& ref ) { memcpy( &m_guid, &ref.m_guid, sizeof(GUID) ); m_status = ref.m_status; } CGuid::CGuid( const GUID &guid ) { memcpy( &m_guid, &guid, sizeof(GUID) ); m_status = valid; } CGuid::CGuid( const CString strSrc ) { BSTR bszSrc; CString strGuid; if (strSrc.GetLength( ) == 36) { strGuid = _T("{") + strSrc + _T("}"); bszSrc = strGuid.AllocSysString(); } else bszSrc = strSrc.AllocSysString(); if (CLSIDFromString( bszSrc, &m_guid ) != S_OK ) m_status = invalid; else m_status = valid; SysFreeString( bszSrc ); } CGuid::CGuid( LPCWSTR lpszSrc ) { if (CLSIDFromString( (LPWSTR)lpszSrc, &m_guid ) != S_OK ) m_status = invalid; else m_status = valid; } const CGuid& CGuid::operator=(const CGuid& guidSrc) { memcpy( &m_guid, &guidSrc.m_guid, sizeof(GUID) ); m_status = guidSrc.m_status; return *this; } const CGuid& CGuid::operator=(const GUID& guidSrc) { memcpy( &m_guid, &guidSrc, sizeof(GUID) ); m_status = valid; return *this; } const CGuid& CGuid::operator=(const CString strSrc) { BSTR bszSrc; CString strGuid; if (strSrc.GetLength( ) == 36) { strGuid = _T("{") + strSrc + _T("}"); bszSrc = strGuid.AllocSysString(); } else bszSrc = strSrc.AllocSysString(); if (CLSIDFromString( bszSrc, &m_guid ) != S_OK ) { m_status = invalid; // MDF BY WHB 20111112 Èç¹ûÊÇ¿Õ×Ö·û´®Çå¿Õm_guid if (strSrc.IsEmpty( )) memset( &m_guid, 0, sizeof(GUID) ); } else m_status = valid; SysFreeString( bszSrc ); return *this; } const CGuid& CGuid::operator=(LPCWSTR lpszSrc) { if (CLSIDFromString( (LPWSTR)lpszSrc, &m_guid ) != S_OK ) m_status = invalid; else m_status = valid; return *this; } bool CGuid::operator==(const CGuid& guid) const { return (m_status == guid.m_status && IsEqualGUID( m_guid, guid.m_guid ) ); } bool CGuid::operator==(const GUID& guid) const { return IsEqualGUID( m_guid, guid ) != 0; } bool CGuid::operator!=(const CGuid& guid) const { return (m_status != guid.m_status || !IsEqualGUID( m_guid, guid.m_guid ) ); } bool CGuid::operator!=(const GUID& guid) const { return !IsEqualGUID( m_guid, guid ); } bool CGuid::operator<(const CGuid& guid) const { return memcmp( &m_guid, &guid.m_guid, sizeof(GUID) ) < 0; } bool CGuid::operator<(const GUID& guid) const { return memcmp( &m_guid, &guid, sizeof(GUID) ) < 0; } bool CGuid::operator>(const CGuid& guid) const { return memcmp( &m_guid, &guid, sizeof(GUID) ) > 0; } bool CGuid::operator>(const GUID& guid) const { return memcmp( &m_guid, &guid, sizeof(GUID) ) > 0; } CGuid::operator CString() const { CString strGuid; if ( m_status != valid ) return strGuid; OLECHAR szGuid[50]; StringFromGUID2( m_guid, szGuid, 50 ); strGuid = szGuid; return strGuid; } CGuid::operator BSTR() const { BSTR bszGuid = NULL; if ( m_status != valid ) return bszGuid; OLECHAR szGuid[50]; StringFromGUID2( m_guid, szGuid, 50 ); bszGuid = SysAllocString( szGuid ); return bszGuid; } CGuid::operator GUID() const { return m_guid; } bool CGuid::IsValid() const { return m_status == valid; } bool CGuid::NewID() { HRESULT hr = CoCreateGuid( &m_guid ); if ( hr == S_OK ) { m_status = valid; return true; } return false; } CString CGuid::GetString() const { CString strGuid; if ( m_status != valid ) return strGuid; OLECHAR szGuid[50]; StringFromGUID2( m_guid, szGuid, 50 ); strGuid = szGuid; return strGuid; } CString CGuid::GetString1() const { CString strGuid; if ( m_status != valid ) return strGuid; OLECHAR szGuid[50]; StringFromGUID2( m_guid, szGuid, 50 ); strGuid = szGuid; strGuid = strGuid.Mid( 1, 36 ); return strGuid; } bool CGuid::FromString1( CString strSrc ) { if ( strSrc.IsEmpty() ) return false; CString strGuid; BSTR bszGuid; strSrc.TrimLeft(); strSrc.TrimRight(); strGuid.Format( _T( "{%s}" ), strSrc ); bszGuid = strGuid.AllocSysString(); if ( CLSIDFromString( bszGuid, &m_guid ) != S_OK ) m_status = invalid; else m_status = valid; SysFreeString( bszGuid ); return (valid == m_status); }