1146 lines
37 KiB
C++
1146 lines
37 KiB
C++
#include "stdafx.h"
|
|
#include <ole2.h>
|
|
#include <shlobj.h>
|
|
#include <iis64.h>
|
|
#include "log.h"
|
|
#include "shellutl.h"
|
|
|
|
extern OCMANAGER_ROUTINES gHelperRoutines;
|
|
|
|
HRESULT MySetLinkInfoTip(LPCTSTR lpszLink, LPCTSTR lpszDescription)
|
|
{
|
|
HRESULT hres;
|
|
IShellLink* pShellLink;
|
|
WIN32_FIND_DATA wfd;
|
|
|
|
CoInitialize(NULL);
|
|
|
|
hres = CoCreateInstance( CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID*)&pShellLink);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
IPersistFile* pPersistFile;
|
|
hres = pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
WCHAR wsz[_MAX_PATH];
|
|
|
|
// Ensure that the string is WCHAR.
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
_tcscpy(wsz, lpszLink);
|
|
#else
|
|
MultiByteToWideChar( CP_ACP, 0, lpszLink, -1, wsz, _MAX_PATH);
|
|
#endif
|
|
hres = pPersistFile->Load(wsz, STGM_READ);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
hres = pShellLink->Resolve(NULL, SLR_ANY_MATCH | SLR_NO_UI);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
if (lpszDescription)
|
|
{
|
|
pShellLink->SetDescription(lpszDescription);
|
|
// Save the link by calling IPersistFile::Save.
|
|
hres = pPersistFile->Save(wsz, TRUE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("MySetLinkInfoTip(): pShellLink->Resolve FAILED\n")));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("MySetLinkInfoTip(): pPersistFile->Load FAILED\n")));
|
|
}
|
|
pPersistFile->Release();
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("MySetLinkInfoTip(): QueryInterface FAILED\n")));
|
|
}
|
|
pShellLink->Release();
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("MySetLinkInfoTip(): CoCreateInstance FAILED\n")));
|
|
}
|
|
CoUninitialize();
|
|
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MySetLinkInfoTip(): Link=%1!s!, Desc=%2!s!\n"), lpszLink, lpszDescription));
|
|
return hres;
|
|
}
|
|
|
|
|
|
HRESULT MyQueryLink(LPCTSTR lpszLink, LPTSTR lpszProgram, LPTSTR lpszArgs, LPTSTR lpszDir, LPTSTR lpszIconPath, int *piIconIndex)
|
|
{
|
|
HRESULT hres;
|
|
IShellLink* pShellLink;
|
|
WIN32_FIND_DATA wfd;
|
|
|
|
CoInitialize(NULL);
|
|
|
|
hres = CoCreateInstance( CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID*)&pShellLink);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
IPersistFile* pPersistFile;
|
|
hres = pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
WCHAR wsz[_MAX_PATH];
|
|
|
|
// Ensure that the string is WCHAR.
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
_tcscpy(wsz, lpszLink);
|
|
#else
|
|
MultiByteToWideChar( CP_ACP, 0, lpszLink, -1, wsz, _MAX_PATH);
|
|
#endif
|
|
hres = pPersistFile->Load(wsz, STGM_READ);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
hres = pShellLink->Resolve(NULL, SLR_ANY_MATCH | SLR_NO_UI);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
pShellLink->GetPath(lpszProgram, _MAX_PATH, (WIN32_FIND_DATA *)&wfd, SLGP_SHORTPATH);
|
|
pShellLink->GetArguments(lpszArgs, _MAX_PATH);
|
|
pShellLink->GetWorkingDirectory(lpszDir, _MAX_PATH);
|
|
pShellLink->GetIconLocation(lpszIconPath, _MAX_PATH, piIconIndex);
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("MyQueryLink(): pShellLink->Resolve FAILED\n")));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_WARN, _T("MyQueryLink(): pPersistFile->Load FAILED\n")));
|
|
}
|
|
pPersistFile->Release();
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("MyQueryLink(): QueryInterface FAILED\n")));
|
|
}
|
|
pShellLink->Release();
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("MyQueryLink(): CoCreateInstance FAILED\n")));
|
|
}
|
|
CoUninitialize();
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("MyQueryLink(): Program=%1!s!, Args=%2!s!, WorkDir=%3!s!, IconPath=%4!s!, IconIndex=%5!d!\n"), lpszProgram, lpszArgs, lpszDir, lpszIconPath, *piIconIndex));
|
|
return hres;
|
|
}
|
|
|
|
HRESULT MyCreateLink(LPCTSTR lpszProgram, LPCTSTR lpszArgs, LPCTSTR lpszLink, LPCTSTR lpszDir, LPCTSTR lpszIconPath, int iIconIndex, LPCTSTR lpszDescription)
|
|
{
|
|
HRESULT hres;
|
|
IShellLink* pShellLink;
|
|
|
|
CoInitialize(NULL);
|
|
|
|
//CoInitialize must be called before this
|
|
// Get a pointer to the IShellLink interface.
|
|
hres = CoCreateInstance( CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID*)&pShellLink);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
IPersistFile* pPersistFile;
|
|
|
|
// Set the path to the shortcut target, and add the description.
|
|
pShellLink->SetPath(lpszProgram);
|
|
pShellLink->SetArguments(lpszArgs);
|
|
pShellLink->SetWorkingDirectory(lpszDir);
|
|
pShellLink->SetIconLocation(lpszIconPath, iIconIndex);
|
|
if (lpszDescription)
|
|
{
|
|
pShellLink->SetDescription(lpszDescription);
|
|
}
|
|
|
|
// Query IShellLink for the IPersistFile interface for saving the
|
|
// shortcut in persistent storage.
|
|
hres = pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
WCHAR wsz[_MAX_PATH];
|
|
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
_tcscpy(wsz, lpszLink);
|
|
#else
|
|
// Ensure that the string is WCHAR.
|
|
MultiByteToWideChar( CP_ACP,0,lpszLink,-1,wsz,_MAX_PATH);
|
|
#endif
|
|
|
|
// Save the link by calling IPersistFile::Save.
|
|
hres = pPersistFile->Save(wsz, TRUE);
|
|
if (!SUCCEEDED(hres))
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("MyCreateLink(): pPersistFile->Save FAILED\n")));
|
|
}
|
|
|
|
pPersistFile->Release();
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("MyCreateLink(): pShellLink->QueryInterface FAILED\n")));
|
|
}
|
|
pShellLink->Release();
|
|
}
|
|
else
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("MyCreateLink(): CoCreateInstance FAILED\n")));
|
|
}
|
|
CoUninitialize();
|
|
return hres;
|
|
}
|
|
|
|
BOOL MyDeleteLink(LPTSTR lpszShortcut)
|
|
{
|
|
TCHAR szFile[_MAX_PATH];
|
|
SHFILEOPSTRUCT fos;
|
|
|
|
ZeroMemory(szFile, sizeof(szFile));
|
|
_tcscpy(szFile, lpszShortcut);
|
|
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("MyDeleteLink(): %s.\n"), szFile));
|
|
|
|
if (IsFileExist(szFile))
|
|
{
|
|
ZeroMemory(&fos, sizeof(fos));
|
|
fos.hwnd = NULL;
|
|
fos.wFunc = FO_DELETE;
|
|
fos.pFrom = szFile;
|
|
fos.fFlags = FOF_SILENT | FOF_NOCONFIRMATION;
|
|
int iTemp = SHFileOperation(&fos);
|
|
if (iTemp != 0)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("MyDeleteLink(): SHFileOperation FAILED\n")));
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void MyMoveLink(LPCTSTR lpszItemDesc, LPCTSTR lpszOldGroup, LPCTSTR lpszNewGroup)
|
|
{
|
|
TCHAR szOldLink[_MAX_PATH], szNewLink[_MAX_PATH];
|
|
TCHAR szProgram[_MAX_PATH], szArgs[_MAX_PATH], szDir[_MAX_PATH], szIconPath[_MAX_PATH];
|
|
int iIconIndex;
|
|
|
|
MyGetGroupPath(lpszOldGroup, szOldLink);
|
|
_tcscat(szOldLink, _T("\\"));
|
|
_tcscat(szOldLink, lpszItemDesc);
|
|
_tcscat(szOldLink, _T(".lnk"));
|
|
|
|
MyGetGroupPath(lpszNewGroup, szNewLink);
|
|
if (!IsFileExist(szNewLink))
|
|
MyAddGroup(lpszNewGroup);
|
|
_tcscat(szNewLink, _T("\\"));
|
|
_tcscat(szNewLink, lpszItemDesc);
|
|
_tcscat(szNewLink, _T(".lnk"));
|
|
|
|
MyQueryLink(szOldLink, szProgram, szArgs, szDir, szIconPath, &iIconIndex);
|
|
MyDeleteLink(szOldLink);
|
|
MyCreateLink(szProgram, szArgs, szNewLink, szDir, szIconPath, iIconIndex, NULL);
|
|
|
|
return;
|
|
}
|
|
|
|
void MyGetSendToPath(LPTSTR szPath)
|
|
{
|
|
LPITEMIDLIST pidlSendTo;
|
|
HRESULT hRes = NOERROR;
|
|
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("SendTo path=%1!s!\n"), szPath));
|
|
|
|
hRes = SHGetSpecialFolderLocation(NULL, CSIDL_SENDTO, &pidlSendTo);
|
|
if (hRes != NOERROR)
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("MyGetSendToPath() SHGetSpecialFolderLocation (CSIDL_SENDTO) FAILED. hresult=0x%x\n"), hRes));}
|
|
|
|
int iTemp = SHGetPathFromIDList(pidlSendTo, szPath);
|
|
if (iTemp != TRUE)
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("MyGetSendToPath() SHGetPathFromIDList FAILED\n")));}
|
|
|
|
return;
|
|
}
|
|
|
|
void MyGetDeskTopPath(LPTSTR szPath)
|
|
{
|
|
LPITEMIDLIST pidlDeskTop;
|
|
HRESULT hRes = NOERROR;
|
|
|
|
#ifndef _CHICAGO_
|
|
hRes = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, &pidlDeskTop);
|
|
#else
|
|
hRes = SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &pidlDeskTop);
|
|
#endif
|
|
if (hRes != NOERROR)
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("MyGetDeskTopPath() SHGetSpecialFolderLocation (CSIDL_COMMON_DESKTOPDIRECTORY) FAILED. hresult=0x%x\n"), hRes));}
|
|
|
|
int iTemp = SHGetPathFromIDList(pidlDeskTop, szPath);
|
|
if (iTemp != TRUE)
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("MyGetDeskTopPath() SHGetPathFromIDList FAILED\n")));}
|
|
|
|
return;
|
|
}
|
|
|
|
void MyGetGroupPath(LPCTSTR szGroupName, LPTSTR szPath)
|
|
{
|
|
int nLen = 0;
|
|
LPITEMIDLIST pidlPrograms;
|
|
HRESULT hRes = NOERROR;
|
|
|
|
#ifndef _CHICAGO_
|
|
hRes = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_PROGRAMS, &pidlPrograms);
|
|
if (hRes != NOERROR)
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("MyGetGroupPath() SHGetSpecialFolderLocation (CSIDL_COMMON_PROGRAMS) FAILED. hresult=0x%x\n"), hRes));}
|
|
#else
|
|
hRes = SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &pidlPrograms);
|
|
if (hRes != NOERROR)
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("MyGetGroupPath() SHGetSpecialFolderLocation (CSIDL_PROGRAMS) FAILED. hresult=0x%x\n"), hRes));}
|
|
#endif
|
|
int iTemp = SHGetPathFromIDList(pidlPrograms, szPath);
|
|
if (iTemp != TRUE)
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("MyGetGroupPath() SHGetPathFromIDList FAILED\n")));}
|
|
|
|
nLen = _tcslen(szPath);
|
|
if (szGroupName)
|
|
{
|
|
if (szPath[nLen-1] != _T('\\')){_tcscat(szPath, _T("\\"));}
|
|
_tcscat(szPath, szGroupName);
|
|
}
|
|
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("MyGetGroupPath(%s). Returns %s.\n"), szGroupName, szPath));
|
|
return;
|
|
}
|
|
|
|
BOOL MyAddGroup(LPCTSTR szGroupName)
|
|
{
|
|
CString csPath;
|
|
TCHAR szPath[_MAX_PATH];
|
|
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
csPath = szPath;
|
|
if (CreateLayerDirectory(csPath) != TRUE)
|
|
{
|
|
iisDebugOut((LOG_TYPE_ERROR, _T("MyAddGroup() CreateLayerDirectory FAILED\n")));
|
|
}
|
|
SHChangeNotify(SHCNE_MKDIR, SHCNF_PATH, szPath, 0);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL MyIsGroupEmpty(LPCTSTR szGroupName)
|
|
{
|
|
TCHAR szPath[_MAX_PATH];
|
|
TCHAR szFile[_MAX_PATH];
|
|
WIN32_FIND_DATA FindData;
|
|
HANDLE hFind;
|
|
BOOL bFindFile = TRUE;
|
|
BOOL fReturn = TRUE;
|
|
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
|
|
_tcscpy(szFile, szPath);
|
|
_tcscat(szFile, _T("\\*.*"));
|
|
|
|
hFind = FindFirstFile(szFile, &FindData);
|
|
while((INVALID_HANDLE_VALUE != hFind) && bFindFile)
|
|
{
|
|
if(*(FindData.cFileName) != _T('.'))
|
|
{
|
|
fReturn = FALSE;
|
|
break;
|
|
}
|
|
|
|
//find the next file
|
|
bFindFile = FindNextFile(hFind, &FindData);
|
|
}
|
|
FindClose(hFind);
|
|
|
|
return fReturn;
|
|
}
|
|
|
|
BOOL MyDeleteGroup(LPCTSTR szGroupName)
|
|
{
|
|
BOOL fResult;
|
|
TCHAR szPath[_MAX_PATH];
|
|
TCHAR szFile[_MAX_PATH];
|
|
SHFILEOPSTRUCT fos;
|
|
WIN32_FIND_DATA FindData;
|
|
HANDLE hFind;
|
|
BOOL bFindFile = TRUE;
|
|
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
|
|
//we can't remove a directory that is not empty, so we need to empty this one
|
|
|
|
_tcscpy(szFile, szPath);
|
|
_tcscat(szFile, _T("\\*.*"));
|
|
|
|
ZeroMemory(&fos, sizeof(fos));
|
|
fos.hwnd = NULL;
|
|
fos.wFunc = FO_DELETE;
|
|
fos.fFlags = FOF_SILENT | FOF_NOCONFIRMATION;
|
|
|
|
hFind = FindFirstFile(szFile, &FindData);
|
|
while((INVALID_HANDLE_VALUE != hFind) && bFindFile)
|
|
{
|
|
if(*(FindData.cFileName) != _T('.'))
|
|
{
|
|
//copy the path and file name to our temp buffer
|
|
memset( (PVOID)szFile, 0, sizeof(szFile));
|
|
_tcscpy(szFile, szPath);
|
|
_tcscat(szFile, _T("\\"));
|
|
_tcscat(szFile, FindData.cFileName);
|
|
//add a second NULL because SHFileOperation is looking for this
|
|
_tcscat(szFile, _T("\0"));
|
|
|
|
//delete the file
|
|
fos.pFrom = szFile;
|
|
int iTemp = SHFileOperation(&fos);
|
|
if (iTemp != 0)
|
|
{iisDebugOut((LOG_TYPE_ERROR, _T("MyDeleteGroup(): SHFileOperation FAILED\n")));}
|
|
}
|
|
|
|
//find the next file
|
|
bFindFile = FindNextFile(hFind, &FindData);
|
|
}
|
|
FindClose(hFind);
|
|
|
|
fResult = RemoveDirectory(szPath);
|
|
if (fResult)
|
|
{
|
|
SHChangeNotify(SHCNE_RMDIR, SHCNF_PATH, szPath, 0);
|
|
}
|
|
return(fResult);
|
|
}
|
|
|
|
void MyAddSendToItem(LPCTSTR szItemDesc, LPCTSTR szProgram, LPCTSTR szArgs, LPCTSTR szDir)
|
|
{
|
|
TCHAR szPath[_MAX_PATH];
|
|
|
|
MyGetSendToPath(szPath);
|
|
|
|
_tcscat(szPath, _T("\\"));
|
|
_tcscat(szPath, szItemDesc);
|
|
_tcscat(szPath, _T(".lnk"));
|
|
|
|
MyCreateLink(szProgram, szArgs, szPath, szDir, NULL, 0, NULL);
|
|
}
|
|
|
|
void MyDeleteLinkWildcard(TCHAR *szDir, TCHAR *szFileName)
|
|
{
|
|
WIN32_FIND_DATA FindFileData;
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
TCHAR szFileToBeDeleted[_MAX_PATH];
|
|
|
|
_stprintf(szFileToBeDeleted, _T("%s\\%s"), szDir, szFileName);
|
|
|
|
hFile = FindFirstFile(szFileToBeDeleted, &FindFileData);
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
do {
|
|
if ( _tcsicmp(FindFileData.cFileName, _T(".")) != 0 && _tcsicmp(FindFileData.cFileName, _T("..")) != 0 )
|
|
{
|
|
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
// this is a directory, so let's skip it
|
|
}
|
|
else
|
|
{
|
|
// this is a file, so let's Delete it.
|
|
TCHAR szTempFileName[_MAX_PATH];
|
|
_stprintf(szTempFileName, _T("%s\\%s"), szDir, FindFileData.cFileName);
|
|
// set to normal attributes, so we can delete it
|
|
SetFileAttributes(szTempFileName, FILE_ATTRIBUTE_NORMAL);
|
|
// delete it, hopefully
|
|
InetDeleteFile(szTempFileName);
|
|
}
|
|
}
|
|
|
|
// get the next file
|
|
if ( !FindNextFile(hFile, &FindFileData) )
|
|
{
|
|
FindClose(hFile);
|
|
break;
|
|
}
|
|
} while (TRUE);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void MyDeleteSendToItem(LPCTSTR szAppName)
|
|
{
|
|
TCHAR szPath[_MAX_PATH];
|
|
TCHAR szPath2[_MAX_PATH];
|
|
|
|
/*
|
|
MyGetSendToPath(szPath);
|
|
_tcscat(szPath, _T("\\"));
|
|
_tcscat(szPath, szAppName);
|
|
_tcscat(szPath, _T(".lnk"));
|
|
MyDeleteLink(szPath);
|
|
*/
|
|
|
|
MyGetSendToPath(szPath);
|
|
_tcscpy(szPath2, szAppName);
|
|
_tcscat(szPath2, _T(".lnk"));
|
|
|
|
MyDeleteLinkWildcard(szPath, szPath2);
|
|
}
|
|
|
|
void MyAddDeskTopItem(LPCTSTR szItemDesc, LPCTSTR szProgram, LPCTSTR szArgs, LPCTSTR szDir, LPCTSTR szIconPath, int iIconIndex)
|
|
{
|
|
TCHAR szPath[_MAX_PATH];
|
|
|
|
MyGetDeskTopPath(szPath);
|
|
|
|
_tcscat(szPath, _T("\\"));
|
|
_tcscat(szPath, szItemDesc);
|
|
_tcscat(szPath, _T(".lnk"));
|
|
|
|
MyCreateLink(szProgram, szArgs, szPath, szDir, szIconPath, iIconIndex, NULL);
|
|
}
|
|
|
|
HRESULT GetLNKProgramRunInfo(LPCTSTR lpszLink, LPTSTR lpszProgram)
|
|
{
|
|
HRESULT hres;
|
|
int iDoUninit = FALSE;
|
|
IShellLink* pShellLink = NULL;
|
|
WIN32_FIND_DATA wfd;
|
|
|
|
if (SUCCEEDED(CoInitialize(NULL)))
|
|
{iDoUninit = TRUE;}
|
|
|
|
hres = CoCreateInstance( CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID*)&pShellLink);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
IPersistFile* pPersistFile = NULL;
|
|
hres = pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
WCHAR wsz[_MAX_PATH];
|
|
|
|
// Ensure that the string is WCHAR.
|
|
#if defined(UNICODE) || defined(_UNICODE)
|
|
_tcscpy(wsz, lpszLink);
|
|
#else
|
|
MultiByteToWideChar( CP_ACP, 0, lpszLink, -1, wsz, _MAX_PATH);
|
|
#endif
|
|
hres = pPersistFile->Load(wsz, STGM_READ);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
hres = pShellLink->Resolve(NULL, SLR_ANY_MATCH | SLR_NO_UI);
|
|
if (SUCCEEDED(hres))
|
|
{
|
|
pShellLink->GetPath(lpszProgram, _MAX_PATH, (WIN32_FIND_DATA *)&wfd, SLGP_SHORTPATH);
|
|
}
|
|
}
|
|
if (pPersistFile)
|
|
{pPersistFile->Release();pPersistFile = NULL;}
|
|
}
|
|
if (pShellLink)
|
|
{pShellLink->Release();pShellLink = NULL;}
|
|
}
|
|
|
|
if (TRUE == iDoUninit)
|
|
{CoUninitialize();}
|
|
return hres;
|
|
}
|
|
|
|
BOOL IsFileNameInDelimitedList(LPTSTR szCommaDelimList,LPTSTR szExeNameWithoutPath)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
TCHAR *token = NULL;
|
|
TCHAR szCopyOfDataBecauseStrTokIsLame[_MAX_PATH];
|
|
_tcscpy(szCopyOfDataBecauseStrTokIsLame,szCommaDelimList);
|
|
|
|
// breakup the szCommaDelimList into strings and see if it contains the szExeNameWithoutPath string
|
|
token = _tcstok(szCopyOfDataBecauseStrTokIsLame, _T(",;\t\n\r"));
|
|
while(token != NULL)
|
|
{
|
|
// check if it matches our .exe name.
|
|
if (0 == _tcsicmp(token,szExeNameWithoutPath))
|
|
{
|
|
return TRUE;
|
|
}
|
|
// Get next token
|
|
token = _tcstok(NULL, _T(",;\t\n\r"));
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
int LNKSearchAndDestroyRecursive(LPTSTR szDirToLookThru, LPTSTR szSemiColonDelmitedListOfExeNames, BOOL bDeleteItsDirToo)
|
|
{
|
|
int iReturn = FALSE;
|
|
WIN32_FIND_DATA FindFileData;
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
TCHAR szFilePath[_MAX_PATH];
|
|
TCHAR szFilename_ext_only[_MAX_EXT];
|
|
|
|
DWORD retCode = GetFileAttributes(szDirToLookThru);
|
|
|
|
if (retCode == 0xFFFFFFFF || !(retCode & FILE_ATTRIBUTE_DIRECTORY))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
_tcscpy(szFilePath, szDirToLookThru);
|
|
AddPath(szFilePath, _T("*.*"));
|
|
|
|
iisDebugOut((LOG_TYPE_TRACE, _T("LNKSearchAndDestroyRecursive:%s,%s,%d\n"),szDirToLookThru, szSemiColonDelmitedListOfExeNames, bDeleteItsDirToo));
|
|
|
|
hFile = FindFirstFile(szFilePath, &FindFileData);
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
do {
|
|
if ( _tcsicmp(FindFileData.cFileName, _T(".")) != 0 && _tcsicmp(FindFileData.cFileName, _T("..")) != 0 )
|
|
{
|
|
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
TCHAR szFullNewDirToLookInto[_MAX_EXT];
|
|
_tcscpy(szFullNewDirToLookInto, szDirToLookThru);
|
|
AddPath(szFullNewDirToLookInto,FindFileData.cFileName);
|
|
|
|
// this is a directory, so let's go into this
|
|
// directory recursively
|
|
LNKSearchAndDestroyRecursive(szFullNewDirToLookInto,szSemiColonDelmitedListOfExeNames,bDeleteItsDirToo);
|
|
}
|
|
else
|
|
{
|
|
// check if this file is a .lnk file
|
|
// if it is then let's open it and
|
|
// see if it points to our .exe we're looking for...
|
|
|
|
// get only the filename's extention
|
|
_tsplitpath( FindFileData.cFileName, NULL, NULL, NULL, szFilename_ext_only);
|
|
|
|
// check for .lnk
|
|
if (0 == _tcsicmp(szFilename_ext_only, _T(".lnk")))
|
|
{
|
|
TCHAR szFilename_only[_MAX_FNAME];
|
|
TCHAR szFullPathAndFilename[_MAX_PATH];
|
|
TCHAR szTemporaryString[_MAX_PATH];
|
|
|
|
// this is a .lnk,
|
|
// open it and check the .exe..
|
|
_tcscpy(szFullPathAndFilename,szDirToLookThru);
|
|
AddPath(szFullPathAndFilename,FindFileData.cFileName);
|
|
_tcscpy(szTemporaryString,_T(""));
|
|
|
|
if (SUCCEEDED(GetLNKProgramRunInfo(szFullPathAndFilename, szTemporaryString)))
|
|
{
|
|
_tsplitpath( szTemporaryString, NULL, NULL, szFilename_only, szFilename_ext_only);
|
|
_tcscpy(szTemporaryString, szFilename_only);
|
|
_tcscat(szTemporaryString, szFilename_ext_only);
|
|
|
|
//iisDebugOut((LOG_TYPE_TRACE, _T("open:%s,%s\n"),szFullPathAndFilename,szTemporaryString));
|
|
|
|
// see if it is on our list of comma delimited names...
|
|
if (TRUE == IsFileNameInDelimitedList(szSemiColonDelmitedListOfExeNames,szTemporaryString))
|
|
{
|
|
SetFileAttributes(szFullPathAndFilename, FILE_ATTRIBUTE_NORMAL);
|
|
// delete it, hopefully
|
|
InetDeleteFile(szFullPathAndFilename);
|
|
|
|
// DELETE the file that references this .exe
|
|
if (bDeleteItsDirToo)
|
|
{
|
|
// Get it's dirname and delete that too...
|
|
RecRemoveEmptyDir(szDirToLookThru);
|
|
}
|
|
|
|
iReturn = TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// get the next file
|
|
if ( !FindNextFile(hFile, &FindFileData) )
|
|
{
|
|
FindClose(hFile);
|
|
break;
|
|
}
|
|
} while (TRUE);
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
void MyDeleteDeskTopItem(LPCTSTR szAppName)
|
|
{
|
|
TCHAR szPath[_MAX_PATH];
|
|
TCHAR szPath2[_MAX_PATH];
|
|
|
|
/*
|
|
MyGetDeskTopPath(szPath);
|
|
_tcscat(szPath, _T("\\"));
|
|
_tcscat(szPath, szAppName);
|
|
_tcscat(szPath, _T(".lnk"));
|
|
//if this is an upgrade, then the directories could have changed.
|
|
//see if we need to delete the old one...
|
|
MyDeleteLink(szPath);
|
|
*/
|
|
|
|
MyGetDeskTopPath(szPath);
|
|
_tcscpy(szPath2, szAppName);
|
|
_tcscat(szPath2, _T(".lnk"));
|
|
|
|
MyDeleteLinkWildcard(szPath, szPath2);
|
|
}
|
|
|
|
void DeleteFromGroup(LPCTSTR szGroupName, LPTSTR szApplicationExec)
|
|
{
|
|
TCHAR szPath[_MAX_PATH];
|
|
|
|
// Get path to that group
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
|
|
LNKSearchAndDestroyRecursive(szPath, szApplicationExec, FALSE);
|
|
}
|
|
|
|
// boydm -------------------------------------------------------------------------------------------
|
|
// Adds a web URL shortcut file . The URL is passed in and is put into the file in the form of a INI file.
|
|
BOOL AddURLShortcutItem( LPCTSTR szGroupName, LPCTSTR szItemDesc, LPCTSTR szURL )
|
|
{
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE_WIN32_API, _T("AddURLShortcutItem(): %1!s!,%2!s!,%3!s!\n"), szGroupName, szItemDesc, szURL));
|
|
// this first part of getting the paths is copied from MyAddItem below
|
|
TCHAR szPath[_MAX_PATH];
|
|
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
if (!IsFileExist(szPath))
|
|
{
|
|
MyAddGroup(szGroupName);
|
|
}
|
|
_tcscat(szPath, _T("\\"));
|
|
_tcscat(szPath, szItemDesc);
|
|
_tcscat(szPath, _T(".url"));
|
|
|
|
// now use the private profile routines to easily create and fill in the content for the .url file
|
|
return WritePrivateProfileString(
|
|
_T("InternetShortcut"), // pointer to section name
|
|
_T("URL"), // pointer to key name
|
|
szURL, // pointer to string to add
|
|
szPath // pointer to initialization filename
|
|
);
|
|
}
|
|
|
|
void MyAddItem(LPCTSTR szGroupName, LPCTSTR szItemDesc, LPCTSTR szProgram, LPCTSTR szArgs, LPCTSTR szDir, LPCTSTR lpszIconPath)
|
|
{
|
|
TCHAR szPath[_MAX_PATH];
|
|
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
if (!IsFileExist(szPath))
|
|
MyAddGroup(szGroupName);
|
|
|
|
_tcscat(szPath, _T("\\"));
|
|
_tcscat(szPath, szItemDesc);
|
|
_tcscat(szPath, _T(".lnk"));
|
|
|
|
if (lpszIconPath && IsFileExist(lpszIconPath))
|
|
{
|
|
MyCreateLink(szProgram, szArgs, szPath, szDir, lpszIconPath, 0, NULL);
|
|
}
|
|
else
|
|
{
|
|
MyCreateLink(szProgram, szArgs, szPath, szDir, NULL, 0, NULL);
|
|
}
|
|
}
|
|
|
|
void MyAddItemInfoTip(LPCTSTR szGroupName, LPCTSTR szAppName, LPCTSTR szDescription)
|
|
{
|
|
TCHAR szPath[_MAX_PATH];
|
|
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
_tcscat(szPath, _T("\\"));
|
|
_tcscat(szPath, szAppName);
|
|
_tcscat(szPath, _T(".lnk"));
|
|
|
|
MySetLinkInfoTip(szPath, szDescription);
|
|
}
|
|
|
|
|
|
void MyDeleteItem(LPCTSTR szGroupName, LPCTSTR szAppName)
|
|
{
|
|
TCHAR szPath[_MAX_PATH];
|
|
TCHAR szPath2[_MAX_PATH];
|
|
|
|
/*
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
_tcscat(szPath, _T("\\"));
|
|
_tcscat(szPath, szAppName);
|
|
_tcscat(szPath, _T(".lnk"));
|
|
MyDeleteLink(szPath);
|
|
|
|
// try to remove items added by AddURLShortcutItem()
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
_tcscat(szPath, _T("\\"));
|
|
_tcscat(szPath2, szAppName);
|
|
_tcscat(szPath2, _T(".url"));
|
|
MyDeleteLink(szPath);
|
|
*/
|
|
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
_tcscpy(szPath2, szAppName);
|
|
_tcscat(szPath2, _T(".lnk"));
|
|
MyDeleteLinkWildcard(szPath, szPath2);
|
|
|
|
MyGetGroupPath(szGroupName, szPath);
|
|
_tcscpy(szPath2, szAppName);
|
|
_tcscat(szPath2, _T(".url"));
|
|
MyDeleteLinkWildcard(szPath, szPath2);
|
|
|
|
if (MyIsGroupEmpty(szGroupName)) {MyDeleteGroup(szGroupName);}
|
|
}
|
|
|
|
//
|
|
// Used when the strings are passed in.
|
|
//
|
|
int MyMessageBox(HWND hWnd, LPCTSTR lpszTheMessage, UINT style)
|
|
{
|
|
int iReturn = TRUE;
|
|
CString csTitle;
|
|
|
|
MyLoadString(IDS_IIS_ERROR_MSGBOXTITLE,csTitle);
|
|
|
|
// call MyMessageBox which will log to the log file and
|
|
// check the global variable to see if we can even display the popup
|
|
iReturn = MyMessageBox(hWnd, lpszTheMessage, csTitle, style | MB_SETFOREGROUND);
|
|
return iReturn;
|
|
}
|
|
|
|
//
|
|
// Used when the strings are passed in.
|
|
//
|
|
int MyMessageBox(HWND hWnd, LPCTSTR lpszTheMessage, LPCTSTR lpszTheTitle, UINT style)
|
|
{
|
|
int iReturn = IDOK;
|
|
|
|
// make sure it goes to iisdebugoutput
|
|
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("MyMessageBox: Title:%1!s!, Msg:%2!s!\n"), lpszTheTitle, lpszTheMessage));
|
|
|
|
if (style & MB_ABORTRETRYIGNORE)
|
|
{
|
|
iReturn = IDIGNORE;
|
|
}
|
|
|
|
// Check global variable to see if we can even display the popup!
|
|
if (g_pTheApp->m_bAllowMessageBoxPopups)
|
|
{
|
|
// Suppress the message if unattened or remove all
|
|
// Who cares the user can't do anything about it anyway?
|
|
// no use upsetting them, we do log to the OCM though
|
|
//
|
|
if (! g_pTheApp->m_fUnattended || g_pTheApp->m_dwSetupMode != SETUPMODE_REMOVEALL)
|
|
{
|
|
iReturn = MessageBox(hWnd, lpszTheMessage, lpszTheTitle, style | MB_SETFOREGROUND);
|
|
}
|
|
}
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
//
|
|
// Used when the string and an error code passed in.
|
|
//
|
|
int MyMessageBox(HWND hWnd, CString csTheMessage, HRESULT iTheErrorCode, UINT style)
|
|
{
|
|
SetErrorFlag(__FILE__, __LINE__);
|
|
|
|
int iReturn = TRUE;
|
|
CString csMsg, csErrMsg;
|
|
|
|
csMsg = csTheMessage;
|
|
|
|
TCHAR pMsg[_MAX_PATH] = _T("");
|
|
HRESULT nNetErr = (HRESULT) iTheErrorCode;
|
|
DWORD dwFormatReturn = 0;
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,NULL, iTheErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
if ( dwFormatReturn == 0) {
|
|
if (nNetErr >= NERR_BASE)
|
|
{
|
|
HMODULE hDll = (HMODULE)LoadLibrary(_T("netmsg.dll"));
|
|
if (hDll)
|
|
{
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE,hDll, iTheErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
FreeLibrary(hDll);
|
|
}
|
|
}
|
|
}
|
|
|
|
HandleSpecificErrors(iTheErrorCode, dwFormatReturn, csMsg, pMsg, &csErrMsg);
|
|
|
|
// Call MyMessageBox which will add title bar and log to log file
|
|
iReturn = MyMessageBox(hWnd, csErrMsg, style | MB_SETFOREGROUND);
|
|
|
|
// Log the eror message to OCM
|
|
if (gHelperRoutines.OcManagerContext)
|
|
{
|
|
if ( gHelperRoutines.ReportExternalError ) {gHelperRoutines.ReportExternalError(gHelperRoutines.OcManagerContext,_T("IIS"),NULL,(DWORD_PTR)(LPCTSTR)csErrMsg,ERRFLG_PREFORMATTED);}
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Used when the String ID's are passed in.
|
|
//
|
|
int MyMessageBox(HWND hWnd, UINT iTheMessage, UINT style)
|
|
{
|
|
int iReturn = TRUE;
|
|
CString csMsg;
|
|
|
|
MyLoadString(iTheMessage,csMsg);
|
|
|
|
// Call MyMessageBox which will add title bar and log to log file
|
|
iReturn = MyMessageBox(hWnd, csMsg, style | MB_SETFOREGROUND);
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
//
|
|
// Used when the String ID's are passed in.
|
|
// And the tthere is an error code which needs to get shown and
|
|
//
|
|
int MyMessageBox(HWND hWnd, UINT iTheMessage, int iTheErrorCode, UINT style)
|
|
{
|
|
SetErrorFlag(__FILE__, __LINE__);
|
|
|
|
int iReturn = TRUE;
|
|
CString csMsg, csErrMsg;
|
|
|
|
MyLoadString(iTheMessage,csMsg);
|
|
|
|
TCHAR pMsg[_MAX_PATH] = _T("");
|
|
int nNetErr = (int)iTheErrorCode;
|
|
DWORD dwFormatReturn = 0;
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,NULL, iTheErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
if ( dwFormatReturn == 0) {
|
|
if (nNetErr >= NERR_BASE)
|
|
{
|
|
HMODULE hDll = (HMODULE)LoadLibrary(_T("netmsg.dll"));
|
|
if (hDll)
|
|
{
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE,hDll, iTheErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
FreeLibrary(hDll);
|
|
}
|
|
}
|
|
}
|
|
|
|
HandleSpecificErrors(iTheErrorCode, dwFormatReturn, csMsg, pMsg, &csErrMsg);
|
|
|
|
// Call MyMessageBox which will add title bar and log to log file
|
|
iReturn = MyMessageBox(hWnd, csErrMsg, style | MB_SETFOREGROUND);
|
|
|
|
// Log the eror message to OCM
|
|
if (gHelperRoutines.OcManagerContext)
|
|
{
|
|
if ( gHelperRoutines.ReportExternalError ) {gHelperRoutines.ReportExternalError(gHelperRoutines.OcManagerContext,_T("IIS"),NULL,(DWORD_PTR)(LPCTSTR)csErrMsg,ERRFLG_PREFORMATTED);}
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int MyMessageBox(HWND hWnd, UINT iTheMessage, LPCTSTR lpszTheFileNameOrWhatever, UINT style)
|
|
{
|
|
int iReturn = TRUE;
|
|
CString csMsgForSprintf, csMsg;
|
|
|
|
// Get the iTheMessage from the resouce file
|
|
// csMsgForSprintf should now look something like: "cannot find file %s".
|
|
MyLoadString(iTheMessage,csMsgForSprintf);
|
|
|
|
// now load the passed in filename or whatever.
|
|
// csMsg should now look like: "cannot find file Whatever";
|
|
csMsg.Format( csMsgForSprintf, lpszTheFileNameOrWhatever);
|
|
|
|
// Call MyMessageBox which will add title bar and log to log file
|
|
iReturn = MyMessageBox(hWnd, csMsg, style | MB_SETFOREGROUND);
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int MyMessageBox(HWND hWnd, UINT iTheMessage, LPCTSTR lpszTheFileNameOrWhatever, int iTheErrorCode, UINT style)
|
|
{
|
|
SetErrorFlag(__FILE__, __LINE__);
|
|
|
|
int iReturn = TRUE;
|
|
CString csMsgForSprintf, csMsg, csErrMsg;
|
|
|
|
// Get the iTheMessage from the resouce file
|
|
// csMsgForSprintf should now look something like: "cannot find file %s".
|
|
MyLoadString(iTheMessage,csMsgForSprintf);
|
|
|
|
// now load the passed in filename or whatever.
|
|
// csMsg should now look like: "cannot find file Whatever";
|
|
csMsg.Format( csMsgForSprintf, lpszTheFileNameOrWhatever);
|
|
|
|
TCHAR pMsg[_MAX_PATH] = _T("");
|
|
int nNetErr = (int)iTheErrorCode;
|
|
DWORD dwFormatReturn = 0;
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,NULL, iTheErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
if ( dwFormatReturn == 0) {
|
|
if (nNetErr >= NERR_BASE)
|
|
{
|
|
HMODULE hDll = (HMODULE)LoadLibrary(_T("netmsg.dll"));
|
|
if (hDll)
|
|
{
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE,hDll, iTheErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
FreeLibrary(hDll);
|
|
}
|
|
}
|
|
}
|
|
|
|
HandleSpecificErrors(iTheErrorCode, dwFormatReturn, csMsg, pMsg, &csErrMsg);
|
|
|
|
// Call MyMessageBox which will add title bar and log to log file
|
|
iReturn = MyMessageBox(hWnd, csErrMsg, style | MB_SETFOREGROUND);
|
|
|
|
// Log the eror message to OCM
|
|
if (gHelperRoutines.OcManagerContext)
|
|
{
|
|
if ( gHelperRoutines.ReportExternalError ) {gHelperRoutines.ReportExternalError(gHelperRoutines.OcManagerContext,_T("IIS"),NULL,(DWORD_PTR)(LPCTSTR)csErrMsg,ERRFLG_PREFORMATTED);}
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int MyMessageBox(HWND hWnd, UINT iTheMessage, LPCTSTR lpszTheFileNameOrWhatever1, LPCTSTR lpszTheFileNameOrWhatever2, int iTheErrorCode, UINT style)
|
|
{
|
|
SetErrorFlag(__FILE__, __LINE__);
|
|
|
|
int iReturn = TRUE;
|
|
CString csMsgForSprintf, csMsg, csErrMsg;
|
|
|
|
// Get the iTheMessage from the resouce file
|
|
// csMsgForSprintf should now look something like: "cannot find file %s %s".
|
|
MyLoadString(iTheMessage,csMsgForSprintf);
|
|
|
|
// now load the passed in filename or whatever.
|
|
// csMsg should now look like: "cannot find file Whatever1 Whatever2";
|
|
csMsg.Format( csMsgForSprintf, lpszTheFileNameOrWhatever1, lpszTheFileNameOrWhatever2);
|
|
|
|
TCHAR pMsg[_MAX_PATH] = _T("");
|
|
int nNetErr = (int)iTheErrorCode;
|
|
DWORD dwFormatReturn = 0;
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,NULL, iTheErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
if ( dwFormatReturn == 0) {
|
|
if (nNetErr >= NERR_BASE)
|
|
{
|
|
HMODULE hDll = (HMODULE)LoadLibrary(_T("netmsg.dll"));
|
|
if (hDll)
|
|
{
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE,hDll, iTheErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
FreeLibrary(hDll);
|
|
}
|
|
}
|
|
}
|
|
|
|
HandleSpecificErrors(iTheErrorCode, dwFormatReturn, csMsg, pMsg, &csErrMsg);
|
|
|
|
// Call MyMessageBox which will add title bar and log to log file
|
|
iReturn = MyMessageBox(hWnd, csErrMsg, style | MB_SETFOREGROUND);
|
|
|
|
// Log the eror message to OCM
|
|
if (gHelperRoutines.OcManagerContext)
|
|
{
|
|
if ( gHelperRoutines.ReportExternalError ) {gHelperRoutines.ReportExternalError(gHelperRoutines.OcManagerContext,_T("IIS"),NULL,(DWORD_PTR)(LPCTSTR)csErrMsg,ERRFLG_PREFORMATTED);}
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
int MyMessageBox(HWND hWnd, UINT iTheMessage, LPCTSTR lpszTheFileNameOrWhatever1, LPCTSTR lpszTheFileNameOrWhatever2, LPCTSTR lpszTheFileNameOrWhatever3, int iTheErrorCode, UINT style)
|
|
{
|
|
SetErrorFlag(__FILE__, __LINE__);
|
|
|
|
int iReturn = TRUE;
|
|
CString csMsgForSprintf, csMsg, csErrMsg;
|
|
|
|
// Get the iTheMessage from the resouce file
|
|
// csMsgForSprintf should now look something like: "cannot find file %s %s".
|
|
MyLoadString(iTheMessage,csMsgForSprintf);
|
|
|
|
// now load the passed in filename or whatever.
|
|
// csMsg should now look like: "cannot find file Whatever1 Whatever2 Whatever3";
|
|
csMsg.Format( csMsgForSprintf, lpszTheFileNameOrWhatever1, lpszTheFileNameOrWhatever2, lpszTheFileNameOrWhatever3);
|
|
|
|
TCHAR pMsg[_MAX_PATH] = _T("");
|
|
int nNetErr = (int)iTheErrorCode;
|
|
DWORD dwFormatReturn = 0;
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,NULL, iTheErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
if ( dwFormatReturn == 0) {
|
|
if (nNetErr >= NERR_BASE)
|
|
{
|
|
HMODULE hDll = (HMODULE)LoadLibrary(_T("netmsg.dll"));
|
|
if (hDll)
|
|
{
|
|
dwFormatReturn = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE,hDll, iTheErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
FreeLibrary(hDll);
|
|
}
|
|
}
|
|
}
|
|
|
|
HandleSpecificErrors(iTheErrorCode, dwFormatReturn, csMsg, pMsg, &csErrMsg);
|
|
|
|
// Call MyMessageBox which will add title bar and log to log file
|
|
iReturn = MyMessageBox(hWnd, csErrMsg, style | MB_SETFOREGROUND);
|
|
|
|
// Log the eror message to OCM
|
|
if (gHelperRoutines.OcManagerContext)
|
|
{
|
|
if ( gHelperRoutines.ReportExternalError ) {gHelperRoutines.ReportExternalError(gHelperRoutines.OcManagerContext,_T("IIS"),NULL,(DWORD_PTR)(LPCTSTR)csErrMsg,ERRFLG_PREFORMATTED);}
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
int MyMessageBoxArgs(HWND hWnd, TCHAR *pszfmt, ...)
|
|
{
|
|
int iReturn = TRUE;
|
|
TCHAR tszString[1000];
|
|
va_list va;
|
|
va_start(va, pszfmt);
|
|
_vstprintf(tszString, pszfmt, va);
|
|
va_end(va);
|
|
|
|
// Call MyMessageBox which will add title bar and log to log file
|
|
iReturn = MyMessageBox(hWnd, tszString, MB_OK | MB_SETFOREGROUND);
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
void GetErrorMsg(int errCode, LPCTSTR szExtraMsg)
|
|
{
|
|
SetErrorFlag(__FILE__, __LINE__);
|
|
|
|
TCHAR pMsg[_MAX_PATH];
|
|
|
|
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),pMsg, _MAX_PATH, NULL);
|
|
_tcscat(pMsg, szExtraMsg);
|
|
MyMessageBox(NULL, pMsg, _T(""), MB_OK | MB_SETFOREGROUND);
|
|
|
|
return;
|
|
}
|
|
|
|
void MyLoadString(int nID, CString &csResult)
|
|
{
|
|
TCHAR buf[MAX_STR_LEN];
|
|
|
|
if (LoadString((HINSTANCE) g_MyModuleHandle, nID, buf, MAX_STR_LEN))
|
|
csResult = buf;
|
|
|
|
return;
|
|
}
|
|
|