DSA_Sort отсутствует в libcomctl32.a: неопределенная ссылка на __imp_DSA_Sort - PullRequest
0 голосов
/ 09 января 2019

Компиляция тестового приложения с использованием GoogleMock с mingw 64. Даже при том, что я связываюсь с comctl32, я получаю эту ошибку ::

In function `DSA_Sort(_DSA*, int (*)(void const*, void const*, long long), long long)':
C:/msys64/mingw64/x86_64-w64-mingw32/include/commctrl.h:5350: undefined reference to `__imp_DSA_Sort'

Без ссылки на comctl32 дополнительные __imp_DSA_XXX() не определены, как __imp_DSA_DestroyCallback(). objdump libcomctl32.a -t не показывает DSA_Sort(), но показывает DSA_DestroyCallback.

V6.0.0 sources comctl32.def не показывает DSA_Sort(). Это в commctrl.def и coredll.def, и, конечно, commctrl.h.

Является ли отсутствующий DSA_sort() в libcomctl32.a ошибкой mingw-w64 или эта функция в каком-то другом файле libxxx.a? Который из? Если это ошибка, как следует сообщать об этом?

1 Ответ

0 голосов
/ 14 января 2019

Comctl32.dll

ld \Windows\System32\comctl32.dll --output-def=comctl32.def

не показывает DSA_Sort(), хотя в документации сказано, что оно должно быть там.

DSA_Sort

https://docs.microsoft.com/en-us/windows/desktop/api/dpa_dsa/nf-dpa_dsa-dsa_sort

Lib: ComCtl32.dll

BOOL DSA_Sort(
  HDSA         pdsa,
  PFNDACOMPARE pfnCompare,
  LPARAM       lParam
);

dsa_dsa.h

\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\dpa_dsa.h

определяет DSA_Sort() так же, как MinGW commctrl.h.

Но dpa_dsa.h имеет #include "dpa_dsa.inl", если определено ISOLATION_AWARE_ENABLED, который MinGW не поддерживает (https://sourceforge.net/p/mingw-w64/feature-requests/44/).

\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\dpa_dsa.inl

содержит:

#define DSA_Sort IsolationAwareDSA_Sort

и имеет эту встроенную реализацию:

ISOLATION_AWARE_INLINE BOOL IsolationAwarePrivatenCv IsolationAwareDSA_Sort(_Inout_ HDSA pdsa,_In_ PFNDACOMPARE pfnCompare,_In_ LPARAM lParam)
{
    BOOL fResult = FALSE;
    typedef BOOL (WINAPI* PFN)(_Inout_ HDSA pdsa,_In_ PFNDACOMPARE pfnCompare,_In_ LPARAM lParam);
    static PFN s_pfn;
    PFN __IsolationAware_pfn = s_pfn;
    ULONG_PTR ulpCookie = 0;
    const BOOL fActivateActCtxSuccess =
        IsolationAwarePrivateT_SAbnPgpgk ||
        IsolationAwarePrivateT_SqbjaYRiRY ||
        IsolationAwarePrivatenPgViNgRzlnPgpgk(&ulpCookie);
    if (!fActivateActCtxSuccess)
        return fResult;
    __try
    {
        if (__IsolationAware_pfn == NULL)
        {
            __IsolationAware_pfn = (PFN) Dpa_dsaIsolationAwarePrivatetRgCebPnQQeRff_pbZPgYQP_QYY("DSA_Sort");
            if (__IsolationAware_pfn == NULL)
                __leave;
            s_pfn = __IsolationAware_pfn;
        }
        fResult = __IsolationAware_pfn(pdsa,pfnCompare,lParam);
    }
    __finally
    {
        if (!IsolationAwarePrivateT_SAbnPgpgk
         || !IsolationAwarePrivateT_SqbjaYRiRY
        )
        {
            const BOOL fPreserveLastError = (fResult == FALSE);
            const DWORD dwLastError = fPreserveLastError ? GetLastError() : NO_ERROR;
            (void)IsolationAwareDeactivateActCtx(0, ulpCookie);
            if (fPreserveLastError)
                SetLastError(dwLastError);
        }
    }
    return fResult;
}

С

#if !ISOLATION_AWARE_USE_STATIC_LIBRARY
FARPROC IsolationAwarePrivatenCv Dpa_dsaIsolationAwarePrivatetRgCebPnQQeRff_pbZPgYQP_QYY(LPCSTR pszProcName);
#endif /* ISOLATION_AWARE_USE_STATIC_LIBRARY */

Похоже, что Windows API явно скрывает эту функцию от MinGW.

Смотри также: https://www.geoffchappell.com/studies/windows/shell/comctl32/api/da/dsa/index.htm

...