Показать сообщение отдельно
  #12  
Старый 16.02.2017, 19:10
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

В принципе не особо сложного было перевести. Однако пои познания в С настолько скудны, что я не смог перевести в Delphi
Код:
virtual HRESULT STDMETHODCALLTYPE GetDesktops(
IObjectArray **ppDesktops) = 0;
Не могу допетрить как извратиться с **ppDesktop (указатель на указатель).
Так что если спецы подскажут, буду премного благодарен.

А так, вот функция выводит количество виртуальных десктопов. Остается только перевести остальные ф-ции и задача решена.
Код:
unit uVDMI;

interface

uses
  Windows, ActiveX, Comobj;

const
  CLSID_ImmersiveShell: TGUID = '{C2F03A33-21F5-47FA-B4BB-156362A2F239}';
  CLSID_VDMI: TGUID = '{C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B}';
                                                // 10130                                  // 10240                                  // 14393
  IID_IVDMI_ARRAY: array [0..2] of TGUID = ('{EF9F1A6C-D3CC-4358-B712-F84B635BEBE7}', '{AF8DA486-95BB-4460-B3B7-6E7A6B2962B5}', '{F31574D6-B682-4CDC-BD56-1827860ABEC6}');

type
  IVirtualDesktopManagerInternal = interface(IUnknown)
//    ['{F31574D6-B682-4CDC-BD56-1827860ABEC6}']
    function GetCount(Count: PUINT): HRESULT; stdcall;
    function notimpl1(): HRESULT; stdcall;
    function notimpl2(): HRESULT; stdcall;
    function notimpl3(): HRESULT; stdcall;
    function notimpl4(): HRESULT; stdcall;
    function notimpl5(): HRESULT; stdcall;
    function notimpl6(): HRESULT; stdcall;
    function notimpl7(): HRESULT; stdcall;
    function notimpl8(): HRESULT; stdcall;
    function notimpl9(): HRESULT; stdcall;
  end;

function GetDesktopCount: Cardinal;

implementation

function GetDesktopCount: Cardinal;
var
  shell: IServiceProvider;
  VDMI: IVirtualDesktopManagerInternal;
  i: Integer;
begin
  Result := 0;
  if Succeeded(CoCreateInstance(CLSID_ImmersiveShell, nil, CLSCTX_LOCAL_SERVER, IServiceProvider, shell)) then
  begin
    for i := Low(IID_IVDMI_ARRAY) to High(IID_IVDMI_ARRAY) do
      if Succeeded(shell.QueryService(CLSID_VDMI, IID_IVDMI_ARRAY[i], VDMI)) then
      begin
        VDMI.GetCount(@Result);
        VDMI._Release;
        Break;
      end;
    shell._Release;
  end;
end;

end.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием