在Delphi的runetime中导入特定的(在我的例子中是-Themes.ThemesService.ThemesEnabled)函数/过程

在Delphi的runetime中导入特定的(在我的例子中是-Themes.ThemesService.ThemesEnabled)函数/过程,delphi,api,methods,dllimport,Delphi,Api,Methods,Dllimport,我认为主题告诉了一切 我只需要这个方法。不需要浪费约6Mb的包含单元,如果我只需要该单元中的一个方法(主题) 我在考虑UxTheme单元,但它没有包含适当的功能。我需要导入什么Windows DLL?此方法代表什么API函数 谢谢 另一个问题不仅是为了涵盖这个特殊的方法,还包括其他方法,因为我需要用MSXML和MM单位做同样的事情…@HX\u unbanned,显然您有点困惑。因为将主题单元添加到项目中只会增加exe的大小(大约321KB)。无论如何,如果您想手动检查应用程序是否已设置主题(主题

我认为主题告诉了一切

我只需要这个方法。不需要浪费约6Mb的包含单元,如果我只需要该单元中的一个方法(主题)

我在考虑UxTheme单元,但它没有包含适当的功能。我需要导入什么Windows DLL?此方法代表什么API函数

谢谢


另一个问题不仅是为了涵盖这个特殊的方法,还包括其他方法,因为我需要用MSXML和MM单位做同样的事情…

@HX\u unbanned,显然您有点困惑。因为将主题单元添加到项目中只会增加exe的大小(大约321KB)。无论如何,如果您想手动检查应用程序是否已设置主题(主题已启用),则必须执行以下步骤

1) 检查库的版本(必须是major或等于6)

2) 加载uxtheme.dll库

3) 导入
IsThemeActive
IsAppThemed
函数

4) 检查这些函数的值(两者都必须为真)

检查一下这个样品

function  ThemesEnabled :Boolean;
const
  ComCtlVersionIE6 = $00060000;
var
  ThemeLib        : THandle;
  IsThemeActive   : function: Boolean; stdcall;
  IsAppThemed     : function: Boolean; stdcall;
begin
  Result:=GetFileVersion('comctl32.dll')>=ComCtlVersionIE6;
  if not Result then exit;
  ThemeLib := LoadLibrary('uxtheme.dll');
  try
    if ThemeLib > 0 then
    begin
        IsAppThemed   := GetProcAddress(ThemeLib, 'IsAppThemed');
        IsThemeActive := GetProcAddress(ThemeLib, 'IsThemeActive');
        Result:=IsAppThemed and IsThemeActive;
    end
    else
    Result:=False;
  finally
   FreeLibrary(ThemeLib);
  end;
end;

嗯。好的,这是正确的解决方案,但是-实际上,将UxThemes单元添加到项目中会使大小增加约321kb。。。如果我添加主题单元,编译后的exe将额外增加~6,5 MB。顺便问一下,有没有办法在相应的Windows DLL(API调用)中找到delphi函数?谢谢。我会尽快测试;)是的,HX。只需搜索源代码。Delphi函数将调用API函数,因此当您找到其中一个函数时,您将在附近找到另一个函数。Rob,我想问一个更一般化的问题,例如,在MSXML接口上使用相同的方法…;)