C++ Builder Snippets  

Dateitypen registrieren (Dateinamenserweiterungen mir einer ausführbaren Datei assozieren):
 
Viele Programme registrieren sich bei der Installation als Standardanwendungen für bestimmte Dateitypen (assoziierte Dateitypen) um dem Anwender direktes Öffnen von Dateien aus dem Explorer heraus zu ermöglichen.

Diese Funktionalität wird folgendermaßen implementiert:
//---------------------------------------------------------------------------
// Funktion CreateFileAssociation() assoziiert Dateien mit der Erweiterung
// slExtension mit der ausfürbaren Datei slExeFile.
//
// Übergabeparameter:
//
// AnsiString slExtension       // Zu assozierende Dateinamenerweiterung
//                              // z.B. "htm", "txt" etc.
// AnsiString slDescription     // Beschreibung der Datei, z.B. "Text-Datei",
//                              // "XYZ-Datendatei" o.Ä.
// AnsiString slExeFile         // Name der ausführbaren Datei, die zum
//                              // Öfffnen, bzw. Drucken der verknüpften
//                              // Dateien verwendet wird. Wird in slExeFile
//                              // ein leerer String übergeben, verwendet
//                              // die Funktion den Namen der Programm-Exe
//                              // ParamStr(0)
// AnsiString slIconFile        // Name der Symboldatei. Wird in slIconFile
//                              // ein leerer String übergeben, verwendet
//                              // die Funktion den Namen der Programm-Exe
// int        ilIconIndex       // Symbol-Index in der Symbol-Exe oder DLL
// bool       blRegPrintCmd     // "Drucken"-Funktion für das Explorer-
//                              // Kontextmenü registrieren (beim Drucken
//                              // wird das Programm mit dem Parameter "/p"
//                              // im ParamStr(1) aufgerufen
//---------------------------------------------------------------------------
// Beispielaufruf:
//
// if(!CreateFileAssociation("xyz","XYZ Test-Datendatei", "","",0,true))
//   ShowMessage("Dateityp konnte nicht registriert werden !");
//---------------------------------------------------------------------------
bool CreateFileAssociation(AnsiString slExtension,
                           AnsiString slDescription,
                           AnsiString slExeFile,
                           AnsiString slIconFile,
                           int        ilIconIndex,
                           bool       blRegPrintCmd)
{
  // Falls kein Punkt vor der Erweiterung, Punkt hinzufügen:
  if(slExtension != EmptyStr && slExtension[1] != '.')
    slExtension = "." + slExtension;
  else if(slExtension == EmptyStr) return false;

  // Falls keinen Namen der ausführbaren Datei übergeben,
  // den Namen der Exe-Datei verwenden:
  if(slExeFile == EmptyStr) slExeFile = ParamStr(0);

  // Falls keinen Namen der Symboldatei übergeben,
  // Symbol der Exe-Datei verwenden:
  if(slIconFile == EmptyStr)
  {
    ilIconIndex = 0;
    slIconFile = ParamStr(0);
  }

  // Registry-Schlüssel anlegen:
  TRegistry* pReg = new TRegistry;
  try
  {
    pReg->RootKey = HKEY_CLASSES_ROOT;

    // Dateinamenserweiterunsschlüssel erzeugen:
    pReg->OpenKey(slExtension, true);
    pReg->WriteString("", slDescription);
    pReg->OpenKey("\\" + slDescription, true);
    pReg->WriteString("", slDescription);

    // Assoziation für das Öffnen der Dateien erzeugen:
    pReg->OpenKey("\\"+slDescription+"\\shell\\open\\command", true);
    pReg->WriteString("", slExeFile + " %1");

    // Assoziation für das Drucken der Dateien erzeugen:
    if(blRegPrintCmd)
    {
      pReg->OpenKey("\\"+slDescription+"\\shell\\print\\command", true);
      pReg->WriteString("", slExeFile + " /p %1");
    }
    // Symbol zuweisen:
    pReg->OpenKey("\\"+slDescription+"\\DefaultIcon", true);
    pReg->WriteString("", slIconFile + "," + IntToStr(ilIconIndex));
  }
  catch (...)
  {
    delete pReg;
    return false;
  }
  delete pReg;
  return true;
}
Soll die Assoziation entfernt werden, löschen Sie einfach die angelegten Registry-Schlüssel:
//---------------------------------------------------------------------------
// Funktion RemoveFileAssociation() entfernt die Assoziation der Dateien
// mit der Erweiterung slExtension.
//---------------------------------------------------------------------------
// Beispielaufruf:
//
// if(!RemoveFileAssociation("xyz"))
//   ShowMessage("Assoziation konnte nicht entfernt werden !");
//---------------------------------------------------------------------------
bool RemoveFileAssociation(AnsiString slExtension)
{
  // Falls kein Punkt vor der Erweiterung, Punkt hinzufügen:
  if(slExtension != EmptyStr && slExtension[1] != '.')
    slExtension = "." + slExtension;
  else if(slExtension == EmptyStr) return false;

  AnsiString slDescription;

  // Registry-Schlüssel löschen:
  TRegistry* pReg = new TRegistry;
  try
  {
    pReg->RootKey = HKEY_CLASSES_ROOT;
    if(pReg->KeyExists(slExtension))
    {
      pReg->OpenKey(slExtension, false);
      slDescription = pReg->ReadString("");
    }
    pReg->OpenKey("\\", false);
    if(pReg->KeyExists(slExtension))
      pReg->DeleteKey(slExtension);
    if(slDescription != EmptyStr && pReg->KeyExists(slDescription))
      pReg->DeleteKey(slDescription);
  }
  catch (...)
  {
    delete pReg;
    return false;
  }
  delete pReg;
  return true;
}
// Namen der Verknüpfungsdatei bestimmen:
AnsiString slLnkFile = IncludeTrailingBackslash(GetSystemPath(
  CSIDL_SENDTO)) + "Senden an - Beispielprojekt.lnk";
// Falls Verknüpfung existiert, Datei löschen:
if(FileExists(slLnkFile))
  DeleteFile(slLnkFile);
Beim Aufruf Ihrer Anwendung vom Windows-Explorer heraus wird der Name der zu öffnenden Datei(en) an ihr Programm als Parameter übergeben. Falls nur eine Programminstanz erlaubt sein soll, müssen Sie die Parameter per Windows-Message WM_COPYDATA an die bereits aktive Instanz senden (s. Snippet Der ggf. bereits aktiven Programminstanz Kommandozeilenparameter übergeben und das Beispielprojekt). Schauen Sie sich am besten auch das Beispielprojekt an.


  Download BCB5
Projekt-Quellcode
Download
Demo-Exe


© '99-2001 by S. Kreutzmann