3

Direct2D系统库为函数提供了 4 个重载版本D2D1CreateFactoryGetProcAddress现在假设我正在动态加载 Direct2D 库,并使用系统调用获取指向 CreateFactory 函数的指针。将返回 4 个重载函数中的哪一个?有没有办法明确指定我需要哪个功能?这是动态加载与静态链接相比的缺点吗,因为某些重载函数将无法访问?

HMODULE hDllD2D = ::LoadLibraryExA("d2d1.dll", 0, LOAD_LIBRARY_SEARCH_SYSTEM32);
FARPROC fnCreateFactory = ::GetProcAddress(hDllD2D, "D2D1CreateFactory");
// What should be the call signature of `fnCreateFactory` ?
4

1 回答 1

5

DLL 中的函数是最通用的一个,D2D1CreateFactory(D2D1_FACTORY_TYPE,REFIID,D2D1_FACTORY_OPTIONS*,void**) function. 如果您查看 中的声明d2d1.h,您会看到该函数已声明,而其他重载只是标题中的内联函数,它们调用通用函数:

#ifndef D2D_USE_C_DEFINITIONS

inline
HRESULT
D2D1CreateFactory(
    __in D2D1_FACTORY_TYPE factoryType,
    __in REFIID riid,
    __out void **factory
    )
{
    return 
        D2D1CreateFactory(
            factoryType,
            riid,
            NULL,
            factory);
}


template<class Factory>
HRESULT
D2D1CreateFactory(
    __in D2D1_FACTORY_TYPE factoryType,
    __out Factory **factory
    )
{
    return
        D2D1CreateFactory(
            factoryType,
            __uuidof(Factory),
            reinterpret_cast<void **>(factory));
}

template<class Factory>
HRESULT
D2D1CreateFactory(
    __in D2D1_FACTORY_TYPE factoryType,
    __in CONST D2D1_FACTORY_OPTIONS &factoryOptions,
    __out Factory **ppFactory
    )
{
    return
        D2D1CreateFactory(
            factoryType,            
            __uuidof(Factory),
            &factoryOptions,
            reinterpret_cast<void **>(ppFactory));
}

#endif // #ifndef D2D_USE_C_DEFINITIONS
于 2013-04-17T18:41:42.430 回答