首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于UxTheme.dll的函数proto类型/声明-动态加载

用于UxTheme.dll的函数proto类型/声明-动态加载
EN

Stack Overflow用户
提问于 2016-02-12 02:04:05
回答 1查看 289关注 0票数 1

使用Windows 2009,我试图用代码修复一个主题前的操作系统问题,即在程序开始时在Windows2000上找不到的“c++”。

这是因为使用了一些功能:

代码语言:javascript
复制
OpenThemeData
DrawThemeBackground
DrawThemeEdge
CloseThemeData
GetThemePartSize

而且,由于代码包括#include <UxTheme.hpp> (依次包括:#include "uxtheme.h")和静态加载dll的项目链接UxTheme.lib

我(最初)的目标是禁用不具有这个dll的操作系统上需要这些函数的功能,但为此,我需要动态加载UxTheme.dll (LoadLibrary())并获取所需函数(GetProcAddress())的地址。如果dll或函数无法加载,我可以禁用该功能或分配我自己的虚拟函数,而严重的启动错误就会消失。

我很难理解函数原型使用GetProcAddress()等所需的确切语法。所以我的第一个问题是,是否有人知道一个已经包含了所有这些信息的头文件,以及/或一个在公共域中执行函数指针赋值的c(pp)文件。或者,有人能给我一个函数(例如DrawThemeBackground)的头和cpp语法示例,我应该能够找出其余的!那么我还包括<UxTheme.hpp>吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-16 03:12:29

它需要我的部分进行一些尝试--一个错误,但是__stdcall是我需要的调用约定。我以前试过__cdecl,但是这个(显然)不起作用。

.h

代码语言:javascript
复制
HTHEME (__stdcall *OpenThemeData)(
    HWND hwnd,
    LPCWSTR pszClassList
    );

HRESULT (__stdcall *GetThemePartSize)(
    HTHEME hTheme,
    __in_opt HDC hdc,
    int iPartId,
    int iStateId,
    __in_opt LPCRECT prc,
    enum THEMESIZE eSize,
    __out SIZE *psz
    );

HRESULT (__stdcall *DrawThemeBackground)(
    HTHEME hTheme,
    HDC hdc,
    int iPartId,
    int iStateId,
    LPCRECT pRect,
    __in_opt LPCRECT pClipRect
    );

HRESULT (__stdcall *DrawThemeEdge)(
    HTHEME hTheme,
    HDC hdc,
    int iPartId,
    int iStateId,
    LPCRECT pDestRect,
    UINT uEdge,
    UINT uFlags,
    __out_opt LPRECT pContentRect
    );

HRESULT (__stdcall * CloseThemeData)(
    HTHEME hTheme
    );

.cpp

代码语言:javascript
复制
OpenThemeData = (HTHEME (__stdcall *)(
        HWND hwnd,
        LPCWSTR pszClassList
        )) GetProcAddress (DllHandle, "OpenThemeData") ;

GetThemePartSize = (HRESULT (__stdcall *)(
        HTHEME hTheme,
        __in_opt HDC hdc,
        int iPartId,
        int iStateId,
        __in_opt LPCRECT prc,
        enum THEMESIZE eSize,
        __out SIZE *psz
        )) GetProcAddress (DllHandle, "GetThemePartSize") ;

DrawThemeBackground = (HRESULT (__stdcall *)(
        HTHEME hTheme,
        HDC hdc,
        int iPartId,
        int iStateId,
        LPCRECT pRect,
        __in_opt LPCRECT pClipRect
        )) GetProcAddress (DllHandle, "DrawThemeBackground") ;

DrawThemeEdge = (HRESULT (__stdcall *)(
        HTHEME hTheme,
        HDC hdc,
        int iPartId,
        int iStateId,
        LPCRECT pDestRect,
        UINT uEdge,
        UINT uFlags,
        __out_opt LPRECT pContentRect
        )) GetProcAddress (DllHandle, "DrawThemeEdge") ;

CloseThemeData = (HRESULT (__stdcall * )(
        HTHEME hTheme
        )) GetProcAddress (DllHandle, "CloseThemeData") ;

现在一切都很好,在Win2K上也是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35353605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档