【问题标题】:How can I use the C++ shlwapi library in Visual Studio?如何在 Visual Studio 中使用 C++ shlwapi 库?
【发布时间】:2016-11-05 04:14:20
【问题描述】:

我想制作一个简单的程序来按扩展名对文件进行分类,但是在尝试编译时出现错误

严重性代码描述项目文件行错误LNK2019未解决 函数“void”中引用的外部符号 __imp__PathFileExistsW@4 __cdecl 分类文件(void)" (?classifyFiles@@YAXXZ)

我的代码是调用 PathFileExists 的地方是这样的:

void classifyFiles() {
    for (int i = 0; i < files.max_size(); i++) {
        //if each folder doesn't exist, create folder
        LPCWSTR folderName = (L"\\" + extensions.at(i)).c_str();
        if (!PathFileExistsW(folderName)) {
            CreateDirectory(folderName, NULL);
        };
        LPCWSTR destination = (extensions.at(i) + files.at(i)).c_str();
        //move file
        MoveFile(files.at(i).c_str(), destination);
    }
}

我用谷歌搜索了一下,似乎仅包含 Shlwapi.h 标头还不够,还需要链接库。但我找不到任何关于如何在 Visual Studio 中执行此操作的答案。

注意:我也发现问题是每个菜单和所有内容(这是我第一次使用 Visual Studio),所以请说明在哪里可以找到内容,如果可能的话包括屏幕截图。

参考:https://msdn.microsoft.com/en-us/library/windows/desktop/bb773584(v=vs.85).aspx

【问题讨论】:

  • @meJustAndrew 这令人头疼。我找不到从 Windows 下载文件的位置,所以也许我不必这样做。我必须从 X 网站下载它。我在库目录中创建了一个新行,但我无法设置 dll,因为它没有出现在屏幕上。你知道我应该怎么做才能让这个 shlwapi 库正常工作吗?
  • 我解决了这个问题。问题是我使用的是 IF。您不能将 IF'S 与 BOOL 类型一起使用。无需添加任何奇怪的额外配置。
  • pragma 指令是将设置传递给链接器的一种方式。 IDE 手册中解释了如何使用 IDE 指定链接器设置。

标签: c++ windows visual-studio


【解决方案1】:

首先你需要add VC++ directories 然后你需要设置链接器输入。

【讨论】:

    【解决方案2】:

    为了构建成功,我做了两件事: 添加
    #pragma comment(lib, "Shlwapi.lib")
    在包含之后。 在我的具体情况下,出于某种原因,更改以下代码行会有所不同,即使它们是相同的。改变:

    if (!PathFileExistsW(folderName))
    

    收件人:

    if (PathFileExistsW(folderName) == FALSE)
    

    出于某种原因,使用 PathFileExists 的值就像第一个输出了一个链接错误,即使其他一切都正常。第二天,我再次对其进行了测试,并且两种方式都有效。也许这是我的想象,并且犯了一些错误。

    【讨论】:

    • 实际上,您总是希望与FALSE 进行比较,因为错误条件始终为0(而FALSE 是常数0)。一个真正的条件可以是任何个非零值,并且不一定是TRUE(它是一个常数1)。您说的“错误”的原始代码实际上很好,并且是惯用的 C++。
    • 把链接器指令放在哪里都没有关系。毕竟这是一个链接器设置,编译器会将它发送到目标代码中,而不管它在哪里看到它。
    • 使用!== FALSE 获得BOOL 值之间没有没有区别。无论您使用哪一个,对链接器都没有任何影响。 ! 正确地将零解释为假,将非零解释为真。该函数清楚地记录为如果文件存在则返回“TRUE;否则,FALSE”。没有返回其他值。 ! 适用于所有返回 BOOL 的 API。
    • 嗯,很奇怪,只改变那一行我就可以构建代码
    • @Cody Gray:我知道,但我觉得如果由于某种原因返回了一个不同于 1 的数字(如负数),则不应将其视为 true。无论如何,这是我第一次使用 BOOL 类型。如果我说的代码错误实际上是好的,那么我只会更加困惑。更改该行摆脱了链接错误。我之前有 pragma 行并且一直有错误。现在我遇到了 FindFirstFile 总是返回 INVALID_HANDLE_VALUE 的另一个问题。
    【解决方案3】:

    将 shlwapi.lib 添加到你的依赖列表中:

    配置属性->链接器->输入->附加依赖

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 2011-08-01
      • 2014-12-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多