我正在尝试在 WinUI 3 C++ 应用程序中使用 SDK。使用 SDK 时,SDK 中的 LoadLibrary 会失败。在调试期间,我检查了该过程,发现调用 LoadLibraryExA 作为测试成功加载了 DLL。但是,我不明白 LoadLibraryA 为何会失败。此失败的可能原因是什么?我如何确保 SDK 可以正确加载其 DLL?它与 MFC 配合良好,但似乎与 WinUI 3 配合不佳。
- LoadLibraryA 无法加载 DLL。即使使用完整路径,LoadLibraryA 也会失败。
- 指定了完整路径,LoadLibraryExA 成功加载主 DLL。
- 以管理员身份运行该应用程序不能解决问题。
我怀疑 _wputenv_s 可能没有正确设置环境变量,并且没有添加搜索路径。但是,我不确定如何解决这个问题。
任何帮助都将不胜感激。
IDS_PEAK_GENERIC_SDK_PATH: C:\Program Files\IDS\ids_peak\generic_sdk
.cpp
// LoadLibraryExA succeeds
HMODULE module2 = LoadLibraryExA(
"C:\\Program Files\\IDS\\ids_peak\\generic_sdk\\api\\lib\\x86_64\\ids_peak.dll",
NULL,
LOAD_WITH_ALTERED_SEARCH_PATH
);
size_t sz = 0;
if (_wgetenv_s(&sz, NULL, 0, L"IDS_PEAK_GENERIC_SDK_PATH") == 0 && sz > 0)
{
std::vector<wchar_t> env_ids_peak(sz);
if (_wgetenv_s(&sz, env_ids_peak.data(), sz, L"IDS_PEAK_GENERIC_SDK_PATH") == 0)
{
if (_wgetenv_s(&sz, NULL, 0, L"PATH") == 0 && sz > 0)
{
std::vector<wchar_t> env_path(sz);
if (_wgetenv_s(&sz, env_path.data(), sz, L"PATH") == 0)
{
std::wstring ids_peak_path(env_ids_peak.data());
ids_peak_path.append(L"\\api\\lib\\x86_64");
std::wstring path_var(env_path.data());
path_var.append(L";").append(ids_peak_path);
_wputenv_s(L"PATH", path_var.c_str());
}
}
}
}
// LoadLibraryA fails
HMODULE module = ::LoadLibraryA("ids_peak.dll");