Rejestracja rozszerzenia w Windows 8+ (Interfejs IApplicationAssociationRegistrationUI)

0

Witam,
Chciałbym zapytać szanownych kolegów o powiązania plików w Windows 8+
Jestem ciekaw jak Wy rozwiązaliście ten problem. Otóż, jeśli się nie mylę,
w Windows 8 nie jest możliwe skojarzenie rozszerzenia z aplikacją poprzez
programową modyfikację rejestru (na prawach administratora).

Załóżmy, że chcę powiązać rozszerzenie .mp3 z programem AIMP.
W Windows XP/Win7 (Vista) nie jest to większym problemem. Natomiast Windows 8,
mimo dodania odpowiednich wpisów do rejestru nie pozwala na tę zmianę - wymagane
jest ręczne zaznaczenie w odpowiednim oknie Panelu Sterowania (Programy Domyślne).

Teraz, robię to tak, że dodaję odpowiednie wpisy do rejestru (w oparciu o : http://msdn.microsoft.com/en-us/library/windows/desktop/cc144154(v=vs.85).aspx),
a następnie otwieram programowo aplet Programy Domyślne Panelu Sterowania:

// Pobierz katalog systemowy
function Get_SystemDir: string;
var
   Dir: array [0..MAX_PATH] of Char;
begin
   GetSystemDirectory(Dir, MAX_PATH);
   Result := IncludeTrailingBackslash(Dir);
end;
// Otwórz aplet Panelu Sterowania
ShellExecute(handle,'open',PChar(Get_SystemDir + 'control.exe'), PChar('/name Microsoft.DefaultPrograms /page pageDefaultProgram'), '', SW_SHOWNORMAL);

http://social.msdn.microsoft.com/Forums/vstudio/en-US/c11c1760-c72e-45f3-8d29-28c80b937d6f/how-can-i-launch-set-default-programs-from-mfc?forum=vclanguage

Mając otwarty aplet, użytkownik zaznacza program AIMP i wybiera opcję "Ustaw ten program jako domyślny"
lub wybiera poszczególne rozszerzenia "Wybierz ustawienia domyślne dla tego programu".

Moim zdaniem ta konieczność jest bez sensu... Czy jest inny sposób?
Również, rejestrując rozszerzenie dla programu AIMP, warto od razu otworzyć stronę apletu Programy Domyślne -> AIMP -> Wybierz ustawienia domyślne dla tego programu
Niestety, nie potrafię tego zrealizować przy użyciu Delphi. Służy do tego interfejs IApplicationAssociationRegistrationUI (który nie jest w pełni wspierany w Windows 8, ale
samo otwarcie apletu działa). Jako, że mam duże doświadczenie w pisaniu skryptów NSIS, potrafię to zrobić w NSIS. Implementacja wygląda tak:

!include LogicLib.nsh
!include Win\COM.nsh
!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationAssociationRegistrationUI} ${IID_IApplicationAssociationRegistrationUI} r0 ""
${If} $0 <> 0
	${IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI} $0 '("AIMP").r1'
    DetailPrint hresult=$1
    ${IUnknown::Release} $0 ""
${EndIf}

Rezultatem wykonania skryptu jest wyświetlenie okna apletu Programy domyślne z rozszerzeniami przypisanymi programowi AIMP.

Czy ktoś z Was potrafi to zrobić w Delphi? Byłbym wdzięczny za kawałek działającego kodu. Moje próby z interfejsem IApplicationAssociationRegistrationUI
spełzły na niczym (niestety, nie mam doświadczenia w interfejsach, programowaniu COM).

http://msdn.microsoft.com/en-us/library/windows/desktop/bb776329(v=vs.85).aspx

EDYCJA
Po wielu próbach, udało mi się to zrealizować!

const
  CLSID_ApplicationAssociationRegistrationUI: TGUID = '{1968106d-f3b5-44cf-890e-116fcb9ecef1}';
  IID_IApplicationAssociationRegistrationUI: TGUID = '{1f76a169-f994-40ac-8fc8-0959e8874710}';

type
  IApplicationAssociationRegistrationUI = interface(IUnknown)
     function LaunchAdvancedAssociationUI(pszAppRegName: PWideChar): HRESULT;  stdcall;
 end;


var
  pAAR: IApplicationAssociationRegistrationUI;
  Res : HRESULT;
begin
   Res := CoCreateInstance(CLSID_ApplicationAssociationRegistrationUI,
   nil, CLSCTX_ALL, IID_IApplicationAssociationRegistrationUI, pAAR);

   if SUCCEEDED(Res) then
   begin
     pAAR.LaunchAdvancedAssociationUI('AIMP');
   end;
end;

Reasumując, jestem ciekaw jak Wy wiążecie dane rozszerzenie pliku z danym programem w Windows 8+.
Pozdrawiam,
-Pawel

0

Delphi ma takie fajne coś co się nazywa safecall:
zamiast

function LaunchAdvancedAssociationUI(pszAppRegName: PWideChar): HRESULT;  stdcall;

piszesz:

procedure LaunchAdvancedAssociationUI(pszAppRegName: PWideChar); safecall;

i zamiast zwracać hresulta będzie rzucać wyjątkiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1