Announcement

Collapse
No announcement yet.

Delphi8 und EnterpriseServices COM+

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

  • Delphi8 und EnterpriseServices COM+

    Hallo Herr Kosch,
    ich versuche gerade mit D8Ar. einen COM+ Server aufzubauen. Habe aber noch ein paar Probleme. Als Projektvorlage habe ich eine Bibliotheksanwendung genommen und eine neue Unit als Inhaltsdatei für die COM+ Attribute, Interfacedeklaration und Server-Objekt-definition versucht. Die genaue Interface bzw. Klassendefinition ist scheinbar nicht ganz richtig. Wenn ich mit regSvcs die Anwendung in die Komponentendienste installieren will kommen eine sehr große Anzahl von Fehlermeldungen die vielleicht mit Borland.Vcl.Windows zu tun haben könnte ("Der Typbiblitheksexporter hat beim Verarbeiten von Borland.Vcl.Windows._REMOTE_NAME_INFO.lpconnection Name ..einen geringfügigen Fehler festgestellt..." usw. Rest rauscht zu schnell durch) obwohl ich glaube kein VCL-Verweis integriert zu haben!? Könnten Sie mir mal eine Delphi-Variante zu COM+.NET Server.DLL zeigen. Ich glaube daß würde die unendlich Fehlersuche erleichtern.
    Wo stehen COM+Attribute, Interfacedeklarationen für Zugriffe mit D7 COM/Invoke?, wo Objektattribute und wo die Construct-definitionen etc.

    Eine zweite Frage zur Sicherheit in Komponenetenanwendungen hätte ich noch. Obwohl ich mir keiner Änderung bewußt bin reagiert ein Rechner WIN2000 NET 1.1 auf einmal mit folgenden "Sicherheitsbedenken" bzw.-problemen.
    Die Komponeneteneigenschaften sind grau hinterlegt und lassen sich nicht ändern. Eine Neuinstallation einer Komponenete wird mit folgender Meldung abgelehnt:"Sie haben keine Erlaubnis, um den gew. Vorgang auszuführen. Falls "Sicherheit" in der Systemanwendung des Zielcomputers aktiviert ist, stellen Sie bitte sicher, dass Sie sich in der entspr. Rolle befinden" .Ebenso erscheint eine Meldung beim Ausführen von regsvcs: 1:System.UnauthorizedAccessExpception - Zugriff verweigert.
    Der angemeldete User hat admin-Rechte!!
    Haben Sie vielleicht einen Tipp.

    mfg
    Wagner

  • #2
    Hallo,

    das folgende Beispiel demonstriert die Implementierung eines .NET Enterprise Service (COM+) mit Delphi 8. Diese Aufgabe kann man auf mindestens drei unterschiedlichen Wegen umsetzen, ich habe mich für die aus der Sicht von COM+ "eleganteste" Lösung entschieden: <br>
    - Auskommentierte Units SysUtils und Classes: Die Assembly-DLL ist nur noch 93 kByte (anstelle 1,9 MByte) groß <br>
    - Bindet Verweis auf System.EnterpriseServices ein <br>
    - Bindet Borland.Delphi ein, die Eigenschaft Link Units wird auf False gesetzt <br>
    - Eigenes Interface wird von der Klasse implementiert <br>
    - ClassInterface(ClassInterfaceType.None)
    <pre>
    <b>library</b> Delphi8FixInterface;
    <br>
    <font color="#003399"><i>{%DelphiDotNetAssemblyCompiler 'c:\programme\gemeinsame dateien\borland shared\bds\shared assemblies\2.0\Borland.Delphi.dll'}</i></font>
    <font color="#003399"><i>{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\S ystem.EnterpriseServices.dll'}</i></font>
    <br>
    <b>uses</b>
    System.Reflection,
    System.EnterpriseServices,
    System.Runtime.InteropServices;
    <br>
    [assembly: ApplicationName(<font color="#9933CC">'Delphi8ESFixInterfaceDemo'</font>)]
    [assembly: ApplicationActivation(ActivationOption.Server)]
    [assembly: ApplicationAccessControl(Value=True,
    Authentication=AuthenticationOption.Connect,
    ImpersonationLevel=ImpersonationLevelOption.Identi fy,
    AccessChecksLevel=AccessChecksLevelOption.Applicat ionComponent)]
    [assembly: DescriptionAttribute(<font color="#9933CC">'Delphi 8 Interface .NET Enterprise Services-Objekt'</font>)]
    [assembly: SecurityRole(<font color="#9933CC">'Benutzer'</font>, SetEveryoneAccess = True)]
    <br>
    <font color="#003399"><i>// STRG+UMSCHALT+G legt neue GUID für die Assembly fest</i></font>
    [assembly: Guid(<font color="#9933CC">'854A605E-3F7E-4625-A79B-DA6E074269BA'</font>)]
    <br>
    [assembly: AssemblyTitle(<font color="#9933CC">'Delphi8ESFix'</font>)]
    [assembly: AssemblyDescription(<font color="#9933CC">'Delphi 8 FixInterface .NET Enterprise Service'</font>)]
    [assembly: AssemblyVersion(<font color="#9933CC">'1.1.0.0'</font>)]
    [assembly: AssemblyDelaySign(False)]
    [assembly: AssemblyKeyFile(<font color="#9933CC">'ES.snk'</font>)]
    [assembly: AssemblyKeyName(<font color="#9933CC">''</font>)]
    <br>
    <b>type</b>
    IOSDelphi8ESObj = <b>interface</b>
    <b>function</b> DoWork(sInput: <b>String</b>): <b>String</b>;
    <b>end</b>;
    <br>
    [TransactionAttribute(TransactionOption.NotSupporte d),
    ConstructionEnabled(<b>Default</b>=<font color="#9933CC">'Delphi 8 FixInterface'</font>),
    JustInTimeActivation(True),
    EventTrackingEnabled(True),
    DescriptionAttribute(<font color="#9933CC">'Delphi 8 FixInterface .NET Enterprise Services-Objekt'</font>),
    Guid(<font color="#9933CC">'356C3A64-88B3-4AA6-B644-D89D103B2F41'</font>),
    ObjectPooling(MinPoolSize=2, MaxPoolSize=5),
    ClassInterface(ClassInterfaceType.None)]
    TOSDelphi8ESObj = <b>class</b>(ServicedComponent, IOSDelphi8ESObj)
    <b>private</b>
    FConstructString: <b>String</b>;
    <b>protected</b>
    <b>procedure</b> Construct(constructString: <b>String</b>); <b>override</b>;
    <b>public</b>
    <b>function</b> DoWork(sInput: <b>String</b>): <b>String</b>;
    <b>end</b>;
    <br>
    <font color="#003399"><i>{ TOSDelphi8ESObj }</i></font>
    <br>
    <b>procedure</b> TOSDelphi8ESObj.Construct(constructString: <b>String</b>);
    <b>begin</b>
    <b>inherited</b>;
    FConstructString := constructString;
    <b>end</b>;
    <br>
    <b>function</b> TOSDelphi8ESObj.DoWork(sInput: <b>String</b>): <b>String</b>;
    <b>begin</b>
    Result := sInput + <font color="#9933CC">': '</font> + FConstructString;
    ContextUtil.SetComplete;
    <b>end</b>;
    <br>
    <b>begin</b>
    <b>end</b>.
    </pre>
    Die Installation über regsvcs läuft ohne eine einzige Warnung erfolgreich durch.
    <br><br>
    Was das zweite Problem angeht, würde ich die COM+ Anwendung komplett löschen und von regsvcs neu anlegen lassen (die Attribute der COM+ Anwendung werden ja direkt über die Attribute innerhalb des Sourcecodes gesetzt):
    <pre>
    ...
    [assembly: ApplicationName('Delphi8ESFixInterfaceDemo')]
    [assembly: ApplicationActivation(ActivationOption.Server)]
    [assembly: ApplicationAccessControl(Value=True,
    Authentication=AuthenticationOption.Connect,
    ImpersonationLevel=ImpersonationLevelOption.Identi fy,
    AccessChecksLevel=AccessChecksLevelOption.Applicat ionComponent)]
    [assembly: DescriptionAttribute('Delphi 8 Interface .NET Enterprise Services-Objekt')]
    [assembly: SecurityRole('Benutzer', SetEveryoneAccess = True)]
    ...
    </pre>
    Außerdem würde ich prüfen, ob auf diesem Rechner eventuell die DCOM-Standard-Rechte "zu tief" gehängt werden. Neuere Windows-Versionen reagieren auf ein derart offenes System mit einem Abschalten der WMI-Funktionen, von denen auch die Installation von COM+ betroffen ist

    Comment


    • #3
      Hallo Herr Kosch,
      habe ein paar weitere Fragen zu D8 und EnterpriseServices. Im Gegensatz zu C# funktioniert das Compilieren eines .NET WinForm Clients nicht, da er nach Einfügen der Enterprise.dll als Referenz, anmahnt, dass die Assembly nicht importiert werden kann, "weil Sie den Namespace Borland.Delphi.System enthält". Ich habe diesen aber nicht eingebunden! Beim Blick auf die Referenz.dll sehe ich im clr auch die Borland.Delphi.System eingebunden, aber wie kommt diese da hinein?
      Der selbe Quelltext in C# funktioniert.
      Vielleicht hat es mit dieser Vorgehensweise zu tun:<B> - Bindet Borland.Delphi ein, die Eigenschaft Link Units wird auf False gesetzt </B>
      Wo finde ich die Link Units Eigenschaft?

      Ebenso vielleicht mal einen Dreizeiler wie in Delphi ein .NET Clientaufruf über DCOM zu erreichen ist.
      Zu DCOM noch eine Frage. Wie müssen die Clients zu einem DCOM-Server stehen. Müssen Sie Mitglied der Domain werden? Wie konfiguriert man z.B. SinglePC Clients die über ISDN Einwahlverbindungen Zugriff auf einen DCOM-Server haben wollen? Welche Betriebssysteme sollten es sein (W2k,XP?)

      Einen kurzen Tip mal bitte.

      Comment


      • #4
        Hallo Herr Kosch,
        die Eigenschaft "Link units" habe ich gefunden über ihren Link bei der Beantwortung der selben Frage im Forum Delphi8. Habe es befolgt und die DLL hat jetzt im ILDASM keinen Borland.Delphi.Systems Eintrag mehr, aber trotzdem, auch nach mehrmaligen Versuchen kommt die selbe Fehlermeldung im Client, dass ein Namespace von Borland.Delphi.System nicht zu .NET WINForms passt!?

        Die Frage im zweiten Teil vom 26.01.04 ist auch noch nicht gelöst. Es hat nichts mit einem speziellen COM+ Object zu tun, der Fehler taucht auch schon auf wenn ich eine leere Anwendung als Hülle eintrage. Er erstellt zwar nach einer Fehlermeldung den Eintrag XYZ aber selbst beim Löschen erscheint die selbe noch mal . "Sie haben keine Erlaubnis ..." wie oben zu lesen. Ich habe mit dcomcfg schon mal ein paar Rechte versucht aufzumachen - ohne Erfolg. Wo sollte ich event. nachsehen?
        Besten Dank schon mal im vorraus..

        Comment


        • #5
          Hallo,

          &gt;..kommt die selbe Fehlermeldung im Client,..

          was passiert, wenn alle *.dcpil-Dateien und *.pdb-Dateien im Projektverzeichnis gelöscht werden, bevor die Zuordnung der Assembly erneut erfolgt? Der Client muss ebenfalls die Delphi 8-RTL (Borland.Delphi.dll) nur als Verweis einbinden, die Eigenschaft Link Units wird auch beim Client auf False gesetzt!

          &gt;Wo sollte ich event. nachsehen?

          Bei der DCOM-Standardsicherheit. Wird diese zu weit heruntergehängt, verriegelt Windows seit einiger Zeit (ServicePacks) aus Sicherheitsgründen das System, so dass kein Zugriff über WMI erlaubt ist. Aber an WMI hängt so ziemlich alles...

          Wenn das nicht der Grund ist, was passiert, wenn der Registrierungsaufruf vom "echten" Administrator des Rechners gestartet wird?

          &#10

          Comment

          Working...
          X