c++ - UxTheme.dll 的函数原型(prototype)类型/声明 - 动态加载

标签 c++ c dll c++builder

使用 c++ Builder 2009,我试图用代码修复 Pre-Theme OS 问题,即在 Windows 2000 上程序启动期间找不到“UxTheme.dll”。

这是因为使用了一些函数:

OpenThemeData
DrawThemeBackground
DrawThemeEdge
CloseThemeData
GetThemePartSize

而且因为代码包括#include <UxTheme.hpp> (这又包括:#include "uxtheme.h")和项目链接UxTheme.lib静态加载 dll。

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

我无法理解函数原型(prototype)所需的确切语法才能使用 GetProcAddress()等等 所以我的第一个问题是,是否有人知道公共(public)领域中已经包含所有这些信息的头文件和/或执行函数指针分配的 c(pp) 文件。或者,有人可以给我其中一个函数的 header 和 cpp 语法示例(例如 DrawThemeBackground ),我应该能够弄清楚其余的!我还包括<UxTheme.hpp>吗?那么呢?

最佳答案

它需要一些试验,我的部分出错了,但 __stdcall 是我需要的调用约定。我之前尝试过 __cdecl,但这(显然)没有用。

.h

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

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 上也是如此

关于c++ - UxTheme.dll 的函数原型(prototype)类型/声明 - 动态加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35353605/

相关文章:

c++ - ReadFile() 返回空白数据

c++ - 组框外观

c - C 语言中的字到二进制数程序

C# asp.net 支持一个dll的多个版本

c++ - 使用 C++ 模板覆盖遗留的 C 风格函数

C++ 将 wstringstream 传递给另一个函数

c++ - 寻找用于信号处理的良好 C/C++ 小波库

超出数组大小的数组元素值的C数组设置

c# - 通过另一个库共享引用类库中的 C# 类

c# - 错误:类型为Image <TColor,TDepth >' exists in both ' Emgu.CV.World,版本= 3.3.0.2824和Emgu.CV,版本= 2.2.1.1150