无法链接到WICConvertBitmapSource

时间:2012-10-15 12:35:33

标签: c winapi mingw wic

我想使用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构建时,程序会打印函数的地址并正确终止。虽然,从以下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的声明,并从def文件中删除@12,则程序会链接并运行正常。

如何创建正确的导入库?

注意:我在Windows 7 SP1上运行MinGW。我的gcc版本是4.7.0,安装了w32api 3.17。问题出现在许多功能中,例如GdiAlphaBlendSHCreateStreamOnFileEx

1 个答案:

答案 0 :(得分:0)

导入库应该使用--kill-at标志创建,如下所示:

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

这篇文章为我澄清了一切:http://wyw.dcweb.cn/stdcall.htm