// CreateLink - uses the Shell's IShellLink and IPersistFile interfaces
// to create and store a shortcut to the specified object.
//
// Returns the result of calling the member functions of the interfaces.
//
// Parameters:
// lpszPathObj - address of a buffer containing the path of the object.
// lpszPathLink - address of a buffer containing the path where the
// Shell link is to be stored.
// lpszDesc - address of a buffer containing the description of the
// Shell link.
HRESULT CreateLink(LPCSTR lpszPathObj, LPCSTR lpszPathLink, LPCSTR lpszDesc)
{
cout<<"(-1)bla-bla\n";
HRESULT hres;
IShellLink* psl = new IShellLink;
// Get a pointer to the IShellLink interface.
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*)&psl);
if (SUCCEEDED(hres))
{
cout<<"(0)bla-bla\n";
IPersistFile* ppf;
// Set the path to the shortcut target and add the description.
psl->SetPath(lpszPathObj);
psl->SetDescription(lpszDesc);
cout << "(1)lpszDesc=" << lpszDesc << endl;
// Query IShellLink for the IPersistFile interface for saving the
// shortcut in persistent storage.
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
if (SUCCEEDED(hres))
{
WCHAR wsz[MAX_PATH];
// Ensure that the string is Unicode.
MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH);
wcout << L"(2)wsz=" << wsz << endl; //////
// Add code here to check return value from MultiByteWideChar
// for success.
// Save the link by calling IPersistFile::Save.
hres = ppf->Save(wsz, TRUE);
ppf->Release();
}
psl->Release();
}
return hres;
}
Не могу создать ярлык на C++
Имею функцию с MSDN:
Код:
cout'ы в нее вставлены для того, чтобы понять где и чего она не выполняет. В результате, выводится только cout из начала функции, остальные cout'ы не обрабатываются.
Проект работает в режиме ANSI, функцию вызываю так:
Код:
if (SUCCEEDED(CreateLink(linkpath.c_str(),"E:\\TEMP\\1.lnk","Description")))
cout << "Link created\n";
else
cout << "Error creating link\n";
cout << "Link created\n";
else
cout << "Error creating link\n";
linkpath - std::string, впрочем, если передавать просто текстом, хотя бы на файла "E:\\temp\\1.bat" - результат не меняется.
Как я понял, кусок кода:
Код:
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*)&psl);
IID_IShellLink, (LPVOID*)&psl);
возвращает в hres неудачу. Что с этим делать - не могу понять. По идее код с msdn должен работать....
До вызова CoCreateInstance попробуйте сделать CoInitialize(NULL)
Как мне не хватало этого простого совета вчера с 1 ночи до 5 утра :)
Цитата:
IShellLink* psl = new IShellLink;
Это как?! Это в MSDN так написано? Дайте ссылку..
Это ошибка. Код уже исправлен. Можно было добавить <IRONY>.