C ++ Получить ярлык Цель - PullRequest
0 голосов
/ 13 июля 2011

Я только начал программировать на C ++, поэтому, пожалуйста, держитесь со мной :)

Мне нужно иметь возможность прочитать цель ярлыка (файл .lnk).

Я гуглил это и нашел множество результатов, которые я нашел полезными: http://cboard.cprogramming.com/windows-programming/62962-ishelllink-getpath-dev-cplusplus.html http://www.go4answers.com/Example/get-shortcut-target-cpp-win64-216615.aspx http://msdn.microsoft.com/en-us/library/bb776891%28VS.85%29.aspx http://www.codeproject.com/KB/shell/create_shortcut.aspx

Некоторые из этих веб-страниц не упоминают, какие заголовочные файлы мне нужны, и я не знаю, как найти эту информацию.

Код, который я сейчас пытаюсь заставить работать, таков:

#include <windows.h>
#include <string>

#include <objidl.h>   /* For IPersistFile */
#include <shlobj.h>   /* For IShellLink */

using namespace std;

int main(void)
{

IShellLink* psl;
wchar_t* tempStr = new wchar_t[MAX_PATH];
string path = "E:\\shortcuts\\myshortcut.lnk";

HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl);

if (SUCCEEDED(hr))
{
    IPersistFile* ppf;
    hr = psl->QueryInterface( IID_IPersistFile, (LPVOID *) &ppf);
    if (SUCCEEDED(hr))
    {
        hr = ppf->Load(path.c_str(), STGM_READ);

        if (SUCCEEDED(hr))
        {
            WIN32_FIND_DATA wfd;
            psl->GetPath(tempStr, MAX_PATH, &wfd, SLGP_UNCPRIORITY | SLGP_RAWPATH);
        }
    }
}
    return 0;
}

Вы, вероятно, можете видеть, что это в основном с одного из указанных выше веб-сайтов, однако они не упомянули, какие заголовки они использовали, поэтому я догадался (который, кажется, работает), какие из них использовать.

В настоящее время я получаю следующие ошибки:

In function 'int main()':
24|error: no matching function for call to 'IPersistFile::Load(const char*, int)'
29|error: no matching function for call to 'IShellLinkA::GetPath(wchar_t*&, int, WIN32_FIND_DATA*, int)'
||=== Build finished: 2 errors, 0 warnings ===|

Я надеялся, что кто-то сможет дать мне несколько советов по этому вопросу, будь то просто указание на некоторые более качественные ссылки или, что еще лучше, объяснение приведенного выше кода, как узнать, какие заголовки использовать и где Я иду не так, или совсем другое решение, которое достигает того же результата.

Спасибо всем!

1 Ответ

1 голос
/ 13 июля 2011

Все заголовки в порядке, но вы неправильно используете широкие (на основе wchar_t) и «нормальные» (на основе символов) строки: IPersistFile :: Load принимает широкую строку, а IShellLinkA :: GetPath принимает обычную строку. Используя это должно скомпилировать:

IShellLinkA* psl; //specify the ansi version explicitely
CoInitialize( 0 ); //you forgot this, needed for all COM calls to work
char* tempStr = new char[ MAX_PATH ];
std::wstring path = L"E:\\shortcuts\\myshortcut.lnk";

Также, если вы просто хотите указать путь, вы можете просто передать 0 вместо указателя на WIN32_FIND_DATA.

...