2016-02-12 77 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的