码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-03-10 01:09:52      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:自己   c++ prime   ati   ESS   log   wchar   delete   char*   prim   

起因

花两周通读了一遍《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++的语义细品之后,如此简单!
都怪自己多年来只顾解决项目问题,忽略了最基础的语义内涵!

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

标签:自己   c++ prime   ati   ESS   log   wchar   delete   char*   prim   

原文地址:https://www.cnblogs.com/wuyaSama/p/12452688.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!