C ++获取快捷方式目标

时间:2011-07-13 09:25:30

标签: c++ gcc shortcut codeblocks shortcuts

我刚开始用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 个答案:

答案 0 :(得分:1)

所有标题都没问题,但你正在使用宽(基于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的指针。