Announcement

Collapse
No announcement yet.

TLB-files in resource files einbinden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TLB-files in resource files einbinden

    Hallo zusammen,

    kann mir jemand zeigen, wie ich mehrere TLB Files in resourcefiles einbinde und diese dann beim Programmstart registriere? Ich habe gelesen, dass das funktionieren soll; habe aber kein Ahnung, wie ich das hinbekomme.

    Knut

  • #2
    Hallo,

    die TLB-Daten müssen nur dann im System registriert werden, wenn der <i>Typbibliothek-Marshaler</i> (alias Standard-Marshaler) von Windows eingebunden werden soll. Bei Delphi ist das (im Gegensatz zu C++) immer der Fall, das Delphi kein Custom Marshaling vorsieht. Dies bedeutet aber auch, dass der Typbibliothek-Marshaler die TLB-Daten über den Registry-Eintrag auch finden und <b>laden</b> können muss. Somit schränkt dieser Mechanismus die eigenen Freiheiten der Implementierung ein.

    Das geplante Vorhaben wird nur dann funktionieren, wenn das Programm <br>
    a) alle TLBs als Ressourcen in ein Modul einbindet, <br>
    b) beim Registrieren jede TLB unter einem eigenen Dateinamen auf der Festplatte ablegt, und <br>
    c) jede dieser TLB-Datei über den üblichen Weg <b>einzeln</b> registriert.

    Da sich der Aufwand nicht lohnt, ist es üblicher, die verschiedenen TLB-Dateien separat mit zu installieren und zu registrieren

    Comment


    • #3
      Moin,

      die rc.Datei muß in etwa so aussehen.

      1 TYPELIB c:\tlbs\abc.tlb
      2 TYPELIB c:\tlbs\bcd.tlb
      ...
      21 TYPELIB c:\tlbs\xyz.tlb

      ID's lückenlos vergeben!!
      rc.Datei dann mit der brcc32.exe kompilieren und ins Projekt einbinden.

      Mit folgender Procedure lassen sich dann bei jedem Programmstart die tlbs registrieren (Achtung die ExeImage unit stammt aus Delphis ResXplor Demo).

      --------------------------------------------
      uses classes,Forms,Sysutils,Dialogs,
      ActiveX, ComObj, ExeImage;

      resourcestring
      strExRegFailure = 'Die TypeLibrary mit der ResourceID ''%d'' konnte nicht registriert werden.'#10#13'Fehlermeldung : %s';

      procedure RegisterTypeLibs(AOwner: TComponent);
      var
      AppName :WideString;
      tlib: ITypeLib;
      i,j :Integer;
      FExeFile: TExeImage;
      begin
      FExeFile := TExeImage.CreateImage(AOwner, Application.ExeName);
      for i := 0 to FExeFile.Resources.Count -1 do
      begin
      if FExeFile.Resources.Items[i].Name = 'TYPELIB' then
      begin
      for j := 1 to FExeFile.Resources.Items[i].List.Count do
      begin
      AppName := Application.ExeName + '\' + IntToStr(j);
      try
      OleCheck(LoadTypeLib(PWideChar(AppName), tlib));
      OleCheck(RegisterTypeLib(tlib, PWideChar(AppName),nil));
      except
      on e:Exception do
      ShowMessage(Format(strExRegFailure,[j,E.Message]));
      end;
      end;
      end;
      end;
      end;

      ----------------------------------------------

      Grüße
      Ral

      Comment


      • #4
        Moin,

        die rc.Datei muß in etwa so aussehen.

        1 TYPELIB c:\tlbs\abc.tlb
        2 TYPELIB c:\tlbs\bcd.tlb
        ...
        21 TYPELIB c:\tlbs\xyz.tlb

        ID's lückenlos vergeben!!
        rc.Datei dann mit der brcc32.exe kompilieren und ins Projekt einbinden.

        Mit folgender Procedure lassen sich dann bei jedem Programmstart die tlbs registrieren (Achtung die ExeImage unit stammt aus Delphis ResXplor Demo).

        --------------------------------------------
        <PRE>
        uses classes,Forms,Sysutils,Dialogs,
        ActiveX, ComObj, ExeImage;

        resourcestring
        strExRegFailure = 'Die TypeLibrary mit der ResourceID ''%d'' konnte nicht registriert werden.'#10#13'Fehlermeldung : %s';

        procedure RegisterTypeLibs(AOwner: TComponent);
        var
        AppName :WideString;
        tlib: ITypeLib;
        i,j :Integer;
        FExeFile: TExeImage;
        begin
        FExeFile := TExeImage.CreateImage(AOwner, Application.ExeName);
        for i := 0 to FExeFile.Resources.Count -1 do
        begin
        if FExeFile.Resources.Items[i].Name = 'TYPELIB' then
        begin
        for j := 1 to FExeFile.Resources.Items[i].List.Count do
        begin
        AppName := Application.ExeName + '\' + IntToStr(j);
        try
        OleCheck(LoadTypeLib(PWideChar(AppName), tlib));
        OleCheck(RegisterTypeLib(tlib, PWideChar(AppName),nil));
        except
        on e:Exception do
        ShowMessage(Format(strExRegFailure,[j,E.Message]));
        end;
        end;
        end;
        end;
        end;
        </PRE>
        ----------------------------------------------

        Grüße
        Ral

        Comment


        • #5
          Moin,

          die rc.Datei muß in etwa so aussehen.

          <PRE>
          1 TYPELIB c:\tlbs\abc.tlb
          2 TYPELIB c:\tlbs\bcd.tlb
          ...
          21 TYPELIB c:\tlbs\xyz.tlb
          </PRE>

          ID's lückenlos vergeben!!
          rc.Datei dann mit der brcc32.exe kompilieren und ins Projekt einbinden.

          Mit folgender Procedure lassen sich dann bei jedem Programmstart die tlbs registrieren (Achtung die ExeImage unit stammt aus Delphis ResXplor Demo).

          --------------------------------------------
          <PRE>
          uses classes,Forms,Sysutils,Dialogs,
          ActiveX, ComObj, ExeImage;

          resourcestring
          strExRegFailure = 'Die TypeLibrary mit der ResourceID ''%d'' konnte nicht registriert werden.'#10#13'Fehlermeldung : %s';

          procedure RegisterTypeLibs(AOwner: TComponent);
          var
          AppName :WideString;
          tlib: ITypeLib;
          i,j :Integer;
          FExeFile: TExeImage;
          begin
          FExeFile := TExeImage.CreateImage(AOwner, Application.ExeName);
          for i := 0 to FExeFile.Resources.Count -1 do
          begin
          if FExeFile.Resources.Items[i].Name = 'TYPELIB' then
          begin
          for j := 1 to FExeFile.Resources.Items[i].List.Count do
          begin
          AppName := Application.ExeName + '\' + IntToStr(j);
          try
          OleCheck(LoadTypeLib(PWideChar(AppName), tlib));
          OleCheck(RegisterTypeLib(tlib, PWideChar(AppName),nil));
          except
          on e:Exception do
          ShowMessage(Format(strExRegFailure,[j,E.Message]));
          end;
          end;
          end;
          end;
          end;
          </PRE>
          ----------------------------------------------

          Grüße
          Ral

          Comment


          • #6
            Danke für die Antworten,

            der von Ralf beschriebene Weg funktioniert für meine Aufgabe einwandfrei. Habe es schon in meine Applikation eingebaut und mit Erfolg getestet.

            Danke

            Knu

            Comment

            Working...
            X