Не удается связать с WICConvertBitmapSource

Я хотел бы использовать функцию из WindowsCodecs.dll, но MinGW имеет неполные и отсутствующие заголовки WinAPI, а также библиотеки импорта. Рассмотрим следующую демонстрацию:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>

// ---------- dummy declarations, because MinGW got no wincodec.h ----------
typedef REFGUID REFWICPixelFormatGUID;
typedef VOID IWICBitmapSource;

HRESULT WINAPI WICConvertBitmapSource(
    REFWICPixelFormatGUID dstFormat,
    IWICBitmapSource *pISrc,
    IWICBitmapSource **ppIDst);
// -------------------------------------------------------------------------

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpLine, int nShow)
{
#ifdef LOAD_FROM_DLL
    typedef HRESULT (WINAPI *PWICConvertBitmapSource)(
        REFWICPixelFormatGUID, IWICBitmapSource *, IWICBitmapSource **);

    HMODULE hDll = LoadLibrary("WindowsCodecs.dll");
    PWICConvertBitmapSource pFunc =
        (PWICConvertBitmapSource)GetProcAddress(hDll, "WICConvertBitmapSource");
    printf("WICConvertBitmapSource: 0x%p.\n", pFunc);
    pFunc(NULL, NULL, NULL);
    FreeLibrary(hDll);
#else
    WICConvertBitmapSource(NULL, NULL, NULL);
#endif
    return 0;
}

При построении с помощью gcc test.c -DLOAD_FROM_DEF программа печатает адрес функции и корректно завершается. Хотя при компоновке с библиотекой импорта из следующего определения:

LIBRARY WindowsCodecs.dll
EXPORTS
    WICConvertBitmapSource@12

, выскакивает эта ошибка:

The procedure entry point WICConvertBitmapSource@12 could
not be located in the dynamic link library WindowsCodecs.dll.

Удивительно, но если я удалю объявление WICConvertBitmapSource из исходного кода и @12 из файла def, программа линкуется и работает нормально.

Как создать правильную библиотеку импорта?

Примечания. Я запускаю MinGW в Windows 7 с пакетом обновления 1 (SP1). Моя версия gcc — 4.7.0 с установленным w32api 3.17. Проблема возникает со многими функциями, такими как GdiAlphaBlend или SHCreateStreamOnFileEx.


person Joulukuusi    schedule 15.10.2012    source источник


Ответы (1)


Библиотека импорта должна была быть создана с флагом --kill-at, например:

dlltool --kill-at -D WindowsCodecs.dll -d WindowsCodecs.def -l libwindowscodecs.a

Эта статья прояснила для меня все: http://wyw.dcweb.cn/stdcall.htm

person Joulukuusi    schedule 15.10.2012