Windows (COM) API 行为不同 w/o 特定库
Windows (COM) API behaving differently w/o specific library
似乎 Windows API 的行为有所不同,具体取决于我是否在特定库中 link。不幸的是,这是一个非常大的库,很难找到问题所在,而且我不知道从哪里开始。
我可以在几个 API 中重现此行为。例如,我使用基于 COM 的 shell API 来确定特定文件扩展名的 "open with" 应用程序。
CComPtr<IEnumAssocHandlers> enumerator;
HRESULT hr = SHAssocEnumHandlers(L".jpg", ASSOC_FILTER_RECOMMENDED, &enumerator);
for (CComPtr<IAssocHandler> handler; enumerator->Next(1, &handler, nullptr) == S_OK; handler.Release()) {
CComHeapPtr<wchar_t> wAppName;
handler->GetName(&wAppName);
std::wcout << std::wstring(wAppName) << std::endl;
}
这在不执行任何其他操作的测试应用程序中完美运行。如果我 link 反对上述库,它会停止工作,而不是 UWP 应用程序条目,它只会打印 TWINUI.
实际上打开应用程序然后使用 IAssocHandler::Invoke
的行为也有所不同,在 Adobe Photoshop 的情况下,它会令人惊讶地将用户从 Adobe 帐户中注销(这总是可重现的 - 也许是由于不同的上下文而起作用的一些许可保护? ).
我过去遇到的另一个例子是 WIC(Windows 成像组件)API,也是基于 COM 的,它返回有关编解码器不可用(在最小测试中可用)的错误。
所以问题是:是否存在可能导致这些问题的编译器标志或宏? (例如 WinSDK 版本控制)
我还能寻找什么?
提前致以诚挚的问候和感谢
原来是加载OpenBLAS库导致的问题。它甚至可以用一个最小的例子重现:
// code in the original post --> works
LoadLibraryA("libopenblas.dll");
// not reproducible with LoadLibraryExA("libopenblas", NULL, DONT_RESOLVE_DLL_REFERENCES);
// to avoid calling DllMain
// code in the original post --> doesn't work
所以似乎 OpenBLAS 库中的某些东西破坏了 Windows API。令人惊讶的是,删除库还解决了我们过去无法解决的其他一些问题,乍一看似乎无关。
虽然我们使用的是相当旧的版本(0.2.9;DYNAMIC_ARCH
已启用),因此它可能会在更高版本中修复,但由于我们根本不再需要 OpenBLAS,所以我没有还没试过。
似乎 Windows API 的行为有所不同,具体取决于我是否在特定库中 link。不幸的是,这是一个非常大的库,很难找到问题所在,而且我不知道从哪里开始。
我可以在几个 API 中重现此行为。例如,我使用基于 COM 的 shell API 来确定特定文件扩展名的 "open with" 应用程序。
CComPtr<IEnumAssocHandlers> enumerator;
HRESULT hr = SHAssocEnumHandlers(L".jpg", ASSOC_FILTER_RECOMMENDED, &enumerator);
for (CComPtr<IAssocHandler> handler; enumerator->Next(1, &handler, nullptr) == S_OK; handler.Release()) {
CComHeapPtr<wchar_t> wAppName;
handler->GetName(&wAppName);
std::wcout << std::wstring(wAppName) << std::endl;
}
这在不执行任何其他操作的测试应用程序中完美运行。如果我 link 反对上述库,它会停止工作,而不是 UWP 应用程序条目,它只会打印 TWINUI.
实际上打开应用程序然后使用 IAssocHandler::Invoke
的行为也有所不同,在 Adobe Photoshop 的情况下,它会令人惊讶地将用户从 Adobe 帐户中注销(这总是可重现的 - 也许是由于不同的上下文而起作用的一些许可保护? ).
我过去遇到的另一个例子是 WIC(Windows 成像组件)API,也是基于 COM 的,它返回有关编解码器不可用(在最小测试中可用)的错误。
所以问题是:是否存在可能导致这些问题的编译器标志或宏? (例如 WinSDK 版本控制)
我还能寻找什么?
提前致以诚挚的问候和感谢
原来是加载OpenBLAS库导致的问题。它甚至可以用一个最小的例子重现:
// code in the original post --> works
LoadLibraryA("libopenblas.dll");
// not reproducible with LoadLibraryExA("libopenblas", NULL, DONT_RESOLVE_DLL_REFERENCES);
// to avoid calling DllMain
// code in the original post --> doesn't work
所以似乎 OpenBLAS 库中的某些东西破坏了 Windows API。令人惊讶的是,删除库还解决了我们过去无法解决的其他一些问题,乍一看似乎无关。
虽然我们使用的是相当旧的版本(0.2.9;DYNAMIC_ARCH
已启用),因此它可能会在更高版本中修复,但由于我们根本不再需要 OpenBLAS,所以我没有还没试过。