Add the ability to open the target file of a Shortcut (.lnk)
Fix #8483, close #8810
This commit is contained in:
parent
d9959c1a7c
commit
e44ed31434
|
@ -250,7 +250,7 @@ CXX = $(CROSS_COMPILE)g++
|
||||||
CXXFLAGS = $(INCLUDESPECIAL) -DTIXML_USE_STL -DTIXMLA_USE_STL $(UNICODE) -std=c++17 -fpermissive
|
CXXFLAGS = $(INCLUDESPECIAL) -DTIXML_USE_STL -DTIXMLA_USE_STL $(UNICODE) -std=c++17 -fpermissive
|
||||||
INCLUDES = $(patsubst %,-I%,$(DIRS)) -I./include
|
INCLUDES = $(patsubst %,-I%,$(DIRS)) -I./include
|
||||||
LDFLAGS = -Wl,--subsystem,windows -municode -mwindows
|
LDFLAGS = -Wl,--subsystem,windows -municode -mwindows
|
||||||
LIBS = -lcomdlg32 -lcomctl32 -lgdi32 -lole32 -loleacc -lshell32 -lshlwapi -ldbghelp -lversion -lcrypt32 -lsensapi -lwintrust -lwinmm
|
LIBS = -lcomdlg32 -lcomctl32 -lgdi32 -lole32 -loleacc -lshell32 -lshlwapi -ldbghelp -lversion -lcrypt32 -lsensapi -lwintrust -lwinmm -luuid
|
||||||
|
|
||||||
RC = $(CROSS_COMPILE)windres
|
RC = $(CROSS_COMPILE)windres
|
||||||
|
|
||||||
|
|
|
@ -130,12 +130,55 @@ DWORD WINAPI Notepad_plus::monitorFileOnChange(void * params)
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void resolveLinkFile(generic_string& linkFilePath)
|
||||||
|
{
|
||||||
|
IShellLink* psl;
|
||||||
|
WCHAR targetFilePath[MAX_PATH];
|
||||||
|
WIN32_FIND_DATA wfd;
|
||||||
|
|
||||||
|
HRESULT hres = CoInitialize(NULL);
|
||||||
|
if (SUCCEEDED(hres))
|
||||||
|
{
|
||||||
|
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
|
||||||
|
if (SUCCEEDED(hres))
|
||||||
|
{
|
||||||
|
IPersistFile* ppf;
|
||||||
|
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
|
||||||
|
if (SUCCEEDED(hres))
|
||||||
|
{
|
||||||
|
// Load the shortcut.
|
||||||
|
hres = ppf->Load(linkFilePath.c_str(), STGM_READ);
|
||||||
|
if (SUCCEEDED(hres) && hres != S_FALSE)
|
||||||
|
{
|
||||||
|
// Resolve the link.
|
||||||
|
hres = psl->Resolve(NULL, 0);
|
||||||
|
if (SUCCEEDED(hres) && hres != S_FALSE)
|
||||||
|
{
|
||||||
|
// Get the path to the link target.
|
||||||
|
hres = psl->GetPath(targetFilePath, MAX_PATH, (WIN32_FIND_DATA*)&wfd, SLGP_SHORTPATH);
|
||||||
|
if (SUCCEEDED(hres) && hres != S_FALSE)
|
||||||
|
{
|
||||||
|
linkFilePath = targetFilePath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ppf->Release();
|
||||||
|
}
|
||||||
|
psl->Release();
|
||||||
|
}
|
||||||
|
CoUninitialize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive, bool isReadOnly, int encoding, const TCHAR *backupFileName, FILETIME fileNameTimestamp)
|
BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive, bool isReadOnly, int encoding, const TCHAR *backupFileName, FILETIME fileNameTimestamp)
|
||||||
{
|
{
|
||||||
const rsize_t longFileNameBufferSize = MAX_PATH; // TODO stop using fixed-size buffer
|
const rsize_t longFileNameBufferSize = MAX_PATH; // TODO stop using fixed-size buffer
|
||||||
if (fileName.size() >= longFileNameBufferSize - 1) // issue with all other sub-routines
|
if (fileName.size() >= longFileNameBufferSize - 1) // issue with all other sub-routines
|
||||||
return BUFFER_INVALID;
|
return BUFFER_INVALID;
|
||||||
|
|
||||||
|
generic_string targetFileName = fileName;
|
||||||
|
resolveLinkFile(targetFileName);
|
||||||
|
|
||||||
//If [GetFullPathName] succeeds, the return value is the length, in TCHARs, of the string copied to lpBuffer, not including the terminating null character.
|
//If [GetFullPathName] succeeds, the return value is the length, in TCHARs, of the string copied to lpBuffer, not including the terminating null character.
|
||||||
//If the lpBuffer buffer is too small to contain the path, the return value [of GetFullPathName] is the size, in TCHARs, of the buffer that is required to hold the path and the terminating null character.
|
//If the lpBuffer buffer is too small to contain the path, the return value [of GetFullPathName] is the size, in TCHARs, of the buffer that is required to hold the path and the terminating null character.
|
||||||
//If [GetFullPathName] fails for any other reason, the return value is zero.
|
//If [GetFullPathName] fails for any other reason, the return value is zero.
|
||||||
|
@ -143,7 +186,7 @@ BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive,
|
||||||
NppParameters& nppParam = NppParameters::getInstance();
|
NppParameters& nppParam = NppParameters::getInstance();
|
||||||
TCHAR longFileName[longFileNameBufferSize];
|
TCHAR longFileName[longFileNameBufferSize];
|
||||||
|
|
||||||
const DWORD getFullPathNameResult = ::GetFullPathName(fileName.c_str(), longFileNameBufferSize, longFileName, NULL);
|
const DWORD getFullPathNameResult = ::GetFullPathName(targetFileName.c_str(), longFileNameBufferSize, longFileName, NULL);
|
||||||
if (getFullPathNameResult == 0)
|
if (getFullPathNameResult == 0)
|
||||||
{
|
{
|
||||||
return BUFFER_INVALID;
|
return BUFFER_INVALID;
|
||||||
|
@ -163,12 +206,12 @@ BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive,
|
||||||
bool isSnapshotMode = backupFileName != NULL && PathFileExists(backupFileName);
|
bool isSnapshotMode = backupFileName != NULL && PathFileExists(backupFileName);
|
||||||
if (isSnapshotMode && !PathFileExists(longFileName)) // UNTITLED
|
if (isSnapshotMode && !PathFileExists(longFileName)) // UNTITLED
|
||||||
{
|
{
|
||||||
wcscpy_s(longFileName, fileName.c_str());
|
wcscpy_s(longFileName, targetFileName.c_str());
|
||||||
}
|
}
|
||||||
_lastRecentFileList.remove(longFileName);
|
_lastRecentFileList.remove(longFileName);
|
||||||
|
|
||||||
generic_string fileName2Find;
|
generic_string fileName2Find;
|
||||||
generic_string gs_fileName{ fileName };
|
generic_string gs_fileName{ targetFileName };
|
||||||
|
|
||||||
|
|
||||||
// "fileName" could be:
|
// "fileName" could be:
|
||||||
|
@ -177,7 +220,7 @@ BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive,
|
||||||
// 3. a file name with relative path to open or create
|
// 3. a file name with relative path to open or create
|
||||||
|
|
||||||
// Search case 1 & 2 firstly
|
// Search case 1 & 2 firstly
|
||||||
BufferID foundBufID = MainFileManager.getBufferFromName(fileName.c_str());
|
BufferID foundBufID = MainFileManager.getBufferFromName(targetFileName.c_str());
|
||||||
|
|
||||||
if (foundBufID == BUFFER_INVALID)
|
if (foundBufID == BUFFER_INVALID)
|
||||||
fileName2Find = longFileName;
|
fileName2Find = longFileName;
|
||||||
|
@ -364,19 +407,19 @@ BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (globbing || ::PathIsDirectory(fileName.c_str()))
|
if (globbing || ::PathIsDirectory(targetFileName.c_str()))
|
||||||
{
|
{
|
||||||
vector<generic_string> fileNames;
|
vector<generic_string> fileNames;
|
||||||
vector<generic_string> patterns;
|
vector<generic_string> patterns;
|
||||||
if (globbing)
|
if (globbing)
|
||||||
{
|
{
|
||||||
const TCHAR * substring = wcsrchr(fileName.c_str(), TCHAR('\\'));
|
const TCHAR * substring = wcsrchr(targetFileName.c_str(), TCHAR('\\'));
|
||||||
if (substring)
|
if (substring)
|
||||||
{
|
{
|
||||||
size_t pos = substring - fileName.c_str();
|
size_t pos = substring - targetFileName.c_str();
|
||||||
|
|
||||||
patterns.push_back(substring + 1);
|
patterns.push_back(substring + 1);
|
||||||
generic_string dir(fileName.c_str(), pos + 1); // use char * to evoke:
|
generic_string dir(targetFileName.c_str(), pos + 1); // use char * to evoke:
|
||||||
// string (const char* s, size_t n);
|
// string (const char* s, size_t n);
|
||||||
// and avoid to call (if pass string) :
|
// and avoid to call (if pass string) :
|
||||||
// string (const string& str, size_t pos, size_t len = npos);
|
// string (const string& str, size_t pos, size_t len = npos);
|
||||||
|
@ -386,8 +429,8 @@ BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
generic_string fileNameStr = fileName;
|
generic_string fileNameStr = targetFileName;
|
||||||
if (fileName[fileName.size() - 1] != '\\')
|
if (targetFileName[targetFileName.size() - 1] != '\\')
|
||||||
fileNameStr += TEXT("\\");
|
fileNameStr += TEXT("\\");
|
||||||
|
|
||||||
patterns.push_back(TEXT("*"));
|
patterns.push_back(TEXT("*"));
|
||||||
|
|
Loading…
Reference in New Issue