2025-11-27 16:46:48 +09:00

319 lines
8.2 KiB
C++

// ==========================================================================
// 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);
}