C++模板封装Win32 API 动态调用

起因

花两周通读了一遍《C++ Primer》,积攒的疑惑一扫而光。

前因

利用C++11可变模板,封装调用dll导出函数
本以为已经很好用了,最近抽时间巩固下知识体系,发现自己道行不够!

新方案

充分利用函数模板的实参推断,取得了“近似动态语言”的使用体验。

#include <windows.h>

class WinDll
{
public:
    WinDll(const char* dll) : mLib(::LoadLibraryA(dll)) {}
    WinDll(const wchar_t* dll) : mLib(::LoadLibrary(dll)) {}
    ~WinDll() { FreeLibrary(mLib); }

    WinDll(const WinDll&) = delete;
    WinDll& operator=(const WinDll&) = delete;

    operator bool() { return !!mLib; }

    template <typename Ret, typename... Args>
    Ret Invoke(const char* name, const Args& ...args)
    {
        auto proc = GetProcAddress(mLib, name);
        typedef Ret(__stdcall* Func)(Args...);
        return (proc) ?  reinterpret_cast<Func>(proc)(args...) : (Ret());
    }

private:
    HMODULE mLib;
};

int main()
{
    WinDll user32("user32");
    if (user32) {
        user32.Invoke<int>("MessageBoxA", 0, 0, 0, 0);
        user32.Invoke<int, HWND, LPCWCHAR, LPCWCHAR>("MessageBoxW", NULL, L"Hello World!", L"Demo", MB_ICONINFORMATION | MB_OK);
    }
}

感想

C++的语义细品之后,如此简单!
都怪自己多年来只顾解决项目问题,忽略了最基础的语义内涵!

猜你喜欢

转载自www.cnblogs.com/wuyaSama/p/12452688.html