Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не могу создать ярлык на C++

57K
19 мая 2010 года
skobkin
5 / / 19.05.2010
Пишу консольный инсталлятор.
Имею функцию с MSDN:
Код:
// 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;
}

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";

linkpath - std::string, впрочем, если передавать просто текстом, хотя бы на файла "E:\\temp\\1.bat" - результат не меняется.
Как я понял, кусок кода:
 
Код:
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                            IID_IShellLink, (LPVOID*)&psl);

возвращает в hres неудачу. Что с этим делать - не могу понять. По идее код с msdn должен работать....
535
19 мая 2010 года
Нездешний
537 / / 17.01.2008
До вызова CoCreateInstance попробуйте сделать CoInitialize(NULL)
57K
19 мая 2010 года
skobkin
5 / / 19.05.2010
Спасибо большое.
Как мне не хватало этого простого совета вчера с 1 ночи до 5 утра :)
14
20 мая 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата:

IShellLink* psl = new IShellLink;


Это как?! Это в MSDN так написано? Дайте ссылку..

57K
20 мая 2010 года
skobkin
5 / / 19.05.2010
Это ошибка. Код уже исправлен. Можно было добавить <IRONY>.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог