2016-02-12 71 views
1

使用C++ builder 2009,我试图修复一个Pre-Theme操作系统问题的代码,即在程序启动时找不到的“UxTheme.dll”在Windows 2000函数原型类型/声明UxTheme.dll -dynamic-loading

因为使用了一些功能的这种:

而且由于代码包括#include <UxTheme.hpp>(即依次包括:#include "uxtheme.h")和项目链接UxTheme.lib是静态加载DLL 。我的(初始)目标是禁用在没有此dll的操作系统上需要这些功能的功能,但为此,我需要动态加载UxTheme.dll(LoadLibrary())并获取所需功能的地址(GetProcAddress())()(GetProcAddress()) )。 如果dll或函数无法加载,我可以禁用该功能或​​分配我自己的虚拟函数,并且令人讨厌的启动错误消失。

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

回答

0

它需要一些尝试从我的部分错误,但__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的