首页 > 解决方案 > 未解析的外部符号 _MsiLocateComponentW@12

问题描述

我知道简单地发布代码并寻求解决方案并不是一个好主意,但我不知道是什么原因造成的。

我正在尝试根据此代码查找 PowerPoint 的安装路径,但是,编译器给出了此错误:

error LNK2019: unresolved external symbol _MsiLocateComponentW@12 referenced in function _WinMain@16

我正在使用 Visual Studio 2019 并且 IntelliSense 没有注意到错误,只有编译器。这是代码:

#include <Windows.h>
#include <msi.h>

int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) {
    LPCWSTR PowerPoint = L"{CC29E94B-7BC2-11D1-A921-00A0C91E2AA2}";

    DWORD size = 300;
    INSTALLSTATE installstate;
    LPWSTR sPath;

    sPath = new wchar_t[size];
    installstate = MsiLocateComponent(PowerPoint, sPath, &size);

    if (installstate == INSTALLSTATE_LOCAL || installstate == INSTALLSTATE_SOURCE)
        MessageBox(NULL, sPath, L"PowerPoint path", MB_OK | MB_ICONASTERISK );
    delete[] sPath;
    return 0;
}

如您所见,我包含了msi.h标题。我的代码有什么问题?

标签: c++windowswinapi

解决方案


您收到的是链接器错误,而不是编译器错误。

确保您的项目链接到msi.lib. 仅使用msi.h是不够的。

msi.h告诉编译器函数看起来像什么,以便您的代码可以调用它。

但是您还需要告诉链接器该函数实际位于何处。msi.lib告诉链接器该函数是从 导出的msi.dll,因此链接器可以将您的函数调用链接到该 DLL。

要链接到msi.lib,您可以msi.lib在项目选项中为链接器输入指定“附加依赖项”,也可以#pragma comment(lib, "msi.lib")直接在代码中使用语句。


推荐阅读