2024-12-21 10:04:04 +08:00
// ==========================================================================
// Class Implementation :
// COXHyperLinkAction
// ==========================================================================
// Version: 9.3
// Implementation file : OXHyperLinkAction.cpp
# include "StdAfx.h"
# include "OXHyperLinkAction.h"
# include "UTB64Bit.h"
# ifdef _DEBUG
# define new DEBUG_NEW
# undef THIS_FILE
static char THIS_FILE [ ] = __FILE__ ;
# endif
// --- Effect : sets all COXHyperLinkAction properties to
// their default value
void COXHyperLinkAction : : Reset ( )
{
// By default the window associated with the object is undefined.
// Set it using SetOwnerWnd function, you probably will need to
// use this parameter in the handler of your user defined action
m_hWndOwner = NULL ;
// action is "Open" by default
m_nActionID = ID_HLACTION_OPEN ;
m_sFile = ( LPCTSTR ) NULL ;
m_sParameters = ( LPCTSTR ) NULL ;
m_sDefaultDirectory = ( LPCTSTR ) NULL ;
// if any application was launched the application window would be
// shown using SW_SHOWNORMAL style
m_nShowCmd = SW_SHOWNORMAL ;
m_nCallbackMsgID = NULL ;
m_hWndRecipient = NULL ;
m_nError = ID_HLERROR_SUCCESS ;
m_hLaunchedApp = NULL ;
}
// --- Effect : sets all COXHyperLinkAction properties using one function
void COXHyperLinkAction : : Set ( int nActionID , LPCTSTR sFile , LPCTSTR sParameters ,
LPCTSTR sDefaultDirectory , int nShowCmd ,
UINT nCallbackMsgID , HWND hWndRecipient )
{
m_nActionID = nActionID ;
m_sFile = sFile ;
m_sParameters = sParameters ;
m_sDefaultDirectory = sDefaultDirectory ;
m_nShowCmd = nShowCmd ;
m_nCallbackMsgID = nCallbackMsgID ;
m_hWndRecipient = hWndRecipient ;
}
void COXHyperLinkAction : : Set ( COXHyperLinkAction & hla )
{
* this = hla ;
}
// copy constructor
COXHyperLinkAction & COXHyperLinkAction : : operator = ( const COXHyperLinkAction & hla )
{
if ( this = = & hla )
return * this ;
m_hWndOwner = hla . m_hWndOwner ;
m_nActionID = hla . m_nActionID ;
m_sFile = hla . m_sFile ;
m_sParameters = hla . m_sParameters ;
m_sDefaultDirectory = hla . m_sDefaultDirectory ;
m_nShowCmd = hla . m_nShowCmd ;
m_nCallbackMsgID = hla . m_nCallbackMsgID ;
m_hWndRecipient = hla . m_hWndRecipient ;
m_nError = hla . m_nError ;
m_hLaunchedApp = hla . m_hLaunchedApp ;
return * this ;
}
// Executes action using ShellExecute function or sending callback message to
// recipient window. If execution fails and bErrorNotify is TRUE
// then corresponding error message will be displayed
// using ErrorNotify function which is defined as virtual
// just in case you would like more sophisticated error notification
//
BOOL COXHyperLinkAction : : ExecuteIt ( BOOL bErrorNotify )
{
BOOL bResult = TRUE ;
COXHyperLinkAction hlaCopy = * this ;
m_hLaunchedApp = NULL ;
CString sAction ;
switch ( m_nActionID )
{
case ID_HLACTION_NONE :
{
m_nError = ID_HLERROR_SUCCESS ;
return TRUE ;
}
case ID_HLACTION_USERDEFINED :
{
// if action is userdefined then we just send m_nCallbackMsgID
// message to m_hWndRecipient window. Handler function in recipient
// window have to return 1 if success and 0 otherwise
if ( m_hWndRecipient = = HWND_BROADCAST )
bResult = ( BOOL ) : : PostMessage ( m_hWndRecipient , m_nCallbackMsgID ,
( WPARAM ) 0 , ( LPARAM ) this ) ;
else
bResult = ( BOOL ) : : SendMessage ( m_hWndRecipient , m_nCallbackMsgID ,
( WPARAM ) 0 , ( LPARAM ) this ) ;
if ( bResult )
{
m_nError = ID_HLERROR_SUCCESS ;
return TRUE ;
}
else
{
TRACE ( _T ( " COXHyperLinkAction::ExecuteIt: unable to execute \n " ) ) ;
m_nError = ID_HLERROR_ACTIONFAILED ;
}
break ;
}
// if Action is not userdefined then eventually we call ShellExecute function
// to execute the Action. If action is Open or Print or Explore everything is
// pretty staightforward
// !!!!!!!!!!!!!!!!!!
// if you want to open a website using browser then you can use
// ID_HLACTION_OPEN action with m_sFile set to the address of the
// given website
// !!!!!!!!!!!!!!!!!!
case ID_HLACTION_OPEN :
{
sAction . LoadString ( IDS_OX_HLINKACTIONOPEN ) ;
break ;
}
case ID_HLACTION_PRINT :
{
sAction . LoadString ( IDS_OX_HLINKACTIONPRINT ) ;
break ;
}
case ID_HLACTION_EXPLORE :
{
sAction . LoadString ( IDS_OX_HLINKACTIONEXPLORE ) ;
break ;
}
case ID_HLACTION_EMAIL :
{
// !!!!!!!!!!!!!!!!!!
// this action is designed to use with Internet Mail or Exchange or
// Outlook
// !!!!!!!!!!!!!!!!!!
// if action is ID_HLACTION_EMAIL then we have to do some preparations
sAction . LoadString ( IDS_OX_HLINKACTIONOPEN ) ;
CString sTemp ;
//sTemp.Format(IDS_OX_HLINKACTIONMAILTO,m_sFile);//"mailto:"
sTemp . LoadString ( IDS_OX_HLINKACTIONMAILTO ) ;
m_sFile = sTemp + m_sFile ;
break ;
}
default :
{
bResult = FALSE ;
m_nError = ID_HLERROR_ACTIONUNKNOWN ;
break ;
}
}
if ( bResult )
{
// eventually we call ShellExecute function to do all dirty job
m_hLaunchedApp = ShellExecute ( NULL , sAction , m_sFile , m_sParameters ,
m_sDefaultDirectory , m_nShowCmd ) ;
// if succeed (return value is more than 32), ShellExecute will
// return handle of the launched application
if ( ( UINT_PTR ) m_hLaunchedApp < = 32 )
{
// if don't succeed, m_hLaunchedApp is code of error
bResult = FALSE ;
m_nError = PtrToUint ( ( UINT_PTR ) m_hLaunchedApp ) ;
TRACE ( _T ( " COXHyperLinkAction::ExecuteIt: unable to execute \n " ) ) ;
m_hLaunchedApp = NULL ;
}
}
// we could have changed some properties of the object so we have to reset them
hlaCopy . m_nError = m_nError ;
hlaCopy . m_hLaunchedApp = m_hLaunchedApp ;
* this = hlaCopy ;
if ( ! bResult )
{
if ( bErrorNotify )
{
// use inner function to notify about the failed action
ErrorNotify ( ) ;
}
}
else
{
m_nError = ID_HLERROR_SUCCESS ;
}
return bResult ;
}
void COXHyperLinkAction : : ErrorNotify ( )
{
if ( m_nError = = ID_HLERROR_SUCCESS )
{
return ;
}
// unable to execute the action!
MessageBeep ( 0 ) ;
CString sErrorMsg ;
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORUNKNOWN ) ) ; //"Unknown error!"
switch ( m_nError )
{
case ID_HLERROR_ACTIONUNKNOWN :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORACTIONUNKNOWN ) ) ; //"Failed to execute unknown action!"
break ;
}
case ID_HLERROR_ACTIONFAILED :
{
CString sAction ;
VERIFY ( sAction . LoadString ( m_szAction [ m_nActionID ] ) ) ;
sErrorMsg . Format ( IDS_OX_HLINKERRORACTIONFAILED , //"%s action failed!"
sAction ) ;
break ;
}
// ShellExecute error messages
case 0 :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERROROUTMEMORY ) ) ; //"The operating system is out\nof memory or resources."
break ;
}
case SE_ERR_PNF :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORPATHNOTFOUND ) ) ; //"The specified path was not found."
break ;
}
case SE_ERR_FNF :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORFILENOTFOUND ) ) ; //"The specified file was not found."
break ;
}
case ERROR_BAD_FORMAT :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERROREXENOTVALID ) ) ; //"The .EXE file is invalid\n(non-Win32 .EXE or error in .EXE image)."
break ;
}
case SE_ERR_ACCESSDENIED :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORACCESSDENIED ) ) ; //"The operating system denied\naccess to the specified file."
break ;
}
case SE_ERR_ASSOCINCOMPLETE :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORASSOCINCOMPLETE ) ) ; //"The filename association is\nincomplete or invalid."
break ;
}
case SE_ERR_DDEBUSY :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORDDEBUSY ) ) ; // "The DDE transaction could not\nbe completed because other DDE transactions\nwere being processed."
break ;
}
case SE_ERR_DDEFAIL :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORDDEFAILED ) ) ; //"The DDE transaction failed."
break ;
}
case SE_ERR_DDETIMEOUT :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORDDETIMEOUT ) ) ; //"The DDE transaction could not\nbe completed because the request timed out."
break ;
}
case SE_ERR_DLLNOTFOUND :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORDLLNOTFOUND ) ) ; //"The specified dynamic-link library was not found."
break ;
}
case SE_ERR_NOASSOC :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORNOTASSOC ) ) ; //"There is no application associated\nwith the given filename extension."
break ;
}
case SE_ERR_OOM :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERROROOM ) ) ; //"There was not enough memory to coplete the operation."
break ;
}
case SE_ERR_SHARE :
{
VERIFY ( sErrorMsg . LoadString ( IDS_OX_HLINKERRORSHARE ) ) ; //"A sharing violation occurred."
break ;
}
}
AfxMessageBox ( sErrorMsg , MB_ICONSTOP ) ;
}