summaryrefslogtreecommitdiffstats
path: root/base/file_util_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'base/file_util_win.cc')
-rw-r--r--base/file_util_win.cc129
1 files changed, 49 insertions, 80 deletions
diff --git a/base/file_util_win.cc b/base/file_util_win.cc
index e050324..a320aca 100644
--- a/base/file_util_win.cc
+++ b/base/file_util_win.cc
@@ -5,6 +5,7 @@
#include "base/file_util.h"
#include <windows.h>
+#include <propvarutil.h>
#include <shellapi.h>
#include <shlobj.h>
#include <time.h>
@@ -12,6 +13,7 @@
#include "base/file_path.h"
#include "base/logging.h"
+#include "base/scoped_comptr_win.h"
#include "base/scoped_handle.h"
#include "base/string_util.h"
#include "base/time.h"
@@ -258,38 +260,32 @@ bool GetFileCreationLocalTime(const std::wstring& filename,
bool ResolveShortcut(FilePath* path) {
HRESULT result;
- IShellLink *shell = NULL;
+ ScopedComPtr<IShellLink> i_shell_link;
bool is_resolved = false;
// Get pointer to the IShellLink interface
- result = CoCreateInstance(CLSID_ShellLink, NULL,
- CLSCTX_INPROC_SERVER, IID_IShellLink,
- reinterpret_cast<LPVOID*>(&shell));
+ result = i_shell_link.CreateInstance(CLSID_ShellLink, NULL,
+ CLSCTX_INPROC_SERVER);
if (SUCCEEDED(result)) {
- IPersistFile *persist = NULL;
+ ScopedComPtr<IPersistFile> persist;
// Query IShellLink for the IPersistFile interface
- result = shell->QueryInterface(IID_IPersistFile,
- reinterpret_cast<LPVOID*>(&persist));
+ result = persist.QueryFrom(i_shell_link);
if (SUCCEEDED(result)) {
WCHAR temp_path[MAX_PATH];
// Load the shell link
result = persist->Load(path->value().c_str(), STGM_READ);
if (SUCCEEDED(result)) {
// Try to find the target of a shortcut
- result = shell->Resolve(0, SLR_NO_UI);
+ result = i_shell_link->Resolve(0, SLR_NO_UI);
if (SUCCEEDED(result)) {
- result = shell->GetPath(temp_path, MAX_PATH,
+ result = i_shell_link->GetPath(temp_path, MAX_PATH,
NULL, SLGP_UNCPRIORITY);
*path = FilePath(temp_path);
is_resolved = true;
}
}
}
- if (persist)
- persist->Release();
}
- if (shell)
- shell->Release();
return is_resolved;
}
@@ -297,58 +293,46 @@ bool ResolveShortcut(FilePath* path) {
bool CreateShortcutLink(const wchar_t *source, const wchar_t *destination,
const wchar_t *working_dir, const wchar_t *arguments,
const wchar_t *description, const wchar_t *icon,
- int icon_index) {
- IShellLink *i_shell_link = NULL;
- IPersistFile *i_persist_file = NULL;
+ int icon_index, const wchar_t* app_id) {
+ ScopedComPtr<IShellLink> i_shell_link;
+ ScopedComPtr<IPersistFile> i_persist_file;
// Get pointer to the IShellLink interface
- HRESULT result = CoCreateInstance(CLSID_ShellLink, NULL,
- CLSCTX_INPROC_SERVER, IID_IShellLink,
- reinterpret_cast<LPVOID*>(&i_shell_link));
+ HRESULT result = i_shell_link.CreateInstance(CLSID_ShellLink, NULL,
+ CLSCTX_INPROC_SERVER);
if (FAILED(result))
return false;
// Query IShellLink for the IPersistFile interface
- result = i_shell_link->QueryInterface(IID_IPersistFile,
- reinterpret_cast<LPVOID*>(&i_persist_file));
- if (FAILED(result)) {
- i_shell_link->Release();
+ result = i_persist_file.QueryFrom(i_shell_link);
+ if (FAILED(result))
return false;
- }
- if (FAILED(i_shell_link->SetPath(source))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (FAILED(i_shell_link->SetPath(source)))
return false;
- }
- if (working_dir && FAILED(i_shell_link->SetWorkingDirectory(working_dir))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (working_dir && FAILED(i_shell_link->SetWorkingDirectory(working_dir)))
return false;
- }
- if (arguments && FAILED(i_shell_link->SetArguments(arguments))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (arguments && FAILED(i_shell_link->SetArguments(arguments)))
return false;
- }
- if (description && FAILED(i_shell_link->SetDescription(description))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (description && FAILED(i_shell_link->SetDescription(description)))
return false;
- }
- if (icon && FAILED(i_shell_link->SetIconLocation(icon, icon_index))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (icon && FAILED(i_shell_link->SetIconLocation(icon, icon_index)))
return false;
+
+ if (app_id && (win_util::GetWinVersion() >= win_util::WINVERSION_WIN7)) {
+ ScopedComPtr<IPropertyStore> property_store;
+ if (FAILED(property_store.QueryFrom(i_shell_link)))
+ return false;
+
+ if (!win_util::SetAppIdForPropertyStore(property_store, app_id))
+ return false;
}
result = i_persist_file->Save(destination, TRUE);
- i_persist_file->Release();
- i_shell_link->Release();
return SUCCEEDED(result);
}
@@ -356,60 +340,45 @@ bool CreateShortcutLink(const wchar_t *source, const wchar_t *destination,
bool UpdateShortcutLink(const wchar_t *source, const wchar_t *destination,
const wchar_t *working_dir, const wchar_t *arguments,
const wchar_t *description, const wchar_t *icon,
- int icon_index) {
+ int icon_index, const wchar_t* app_id) {
// Get pointer to the IPersistFile interface and load existing link
- IShellLink *i_shell_link = NULL;
- if (FAILED(CoCreateInstance(CLSID_ShellLink, NULL,
- CLSCTX_INPROC_SERVER, IID_IShellLink,
- reinterpret_cast<LPVOID*>(&i_shell_link))))
+ ScopedComPtr<IShellLink> i_shell_link;
+ if (FAILED(i_shell_link.CreateInstance(CLSID_ShellLink, NULL,
+ CLSCTX_INPROC_SERVER)))
return false;
- IPersistFile *i_persist_file = NULL;
- if (FAILED(i_shell_link->QueryInterface(
- IID_IPersistFile, reinterpret_cast<LPVOID*>(&i_persist_file)))) {
- i_shell_link->Release();
+ ScopedComPtr<IPersistFile> i_persist_file;
+ if (FAILED(i_persist_file.QueryFrom(i_shell_link)))
return false;
- }
- if (FAILED(i_persist_file->Load(destination, 0))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (FAILED(i_persist_file->Load(destination, 0)))
return false;
- }
- if (source && FAILED(i_shell_link->SetPath(source))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (source && FAILED(i_shell_link->SetPath(source)))
return false;
- }
- if (working_dir && FAILED(i_shell_link->SetWorkingDirectory(working_dir))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (working_dir && FAILED(i_shell_link->SetWorkingDirectory(working_dir)))
return false;
- }
- if (arguments && FAILED(i_shell_link->SetArguments(arguments))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (arguments && FAILED(i_shell_link->SetArguments(arguments)))
return false;
- }
- if (description && FAILED(i_shell_link->SetDescription(description))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (description && FAILED(i_shell_link->SetDescription(description)))
return false;
- }
- if (icon && FAILED(i_shell_link->SetIconLocation(icon, icon_index))) {
- i_persist_file->Release();
- i_shell_link->Release();
+ if (icon && FAILED(i_shell_link->SetIconLocation(icon, icon_index)))
return false;
+
+ if (app_id && win_util::GetWinVersion() >= win_util::WINVERSION_WIN7) {
+ ScopedComPtr<IPropertyStore> property_store;
+ if (FAILED(property_store.QueryFrom(i_shell_link)))
+ return false;
+
+ if (!win_util::SetAppIdForPropertyStore(property_store, app_id))
+ return false;
}
HRESULT result = i_persist_file->Save(destination, TRUE);
- i_persist_file->Release();
- i_shell_link->Release();
return SUCCEEDED(result);
}