Announcement

Collapse
No announcement yet.

Schutzverletzung nur bei WideString als Rückgabewert

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

  • Schutzverletzung nur bei WideString als Rückgabewert

    Hallo,<br>
    <br>
    ein großes Problem habe ich seit kurzem mit einem COM-Server. Ich habe<br>
    eine neue Prozedur hinzugefügt, die als Rückgabetyp einen WideString<br>
    zurückliefert.<br>
    <br>
    Bei dem Aufruf der Prozedur durch den Client erhalte ich nun eine Schutz-<br>verletzung in der DLL <b>RPCRT4.DLL</b>. Sobald ich den Rückgabetyp in Wordbool<br> oder HResult ändere, funktioniert alles einwandfrei.<br>
    <br>
    Ich habe es mit Delphi 7, dann mit Delphi 6 auf Windows XP Prof.<br>
    probiert. Die Schutzverletzung lässt sich ebenfalls auf einem zweiten<br>
    PC (jedoch ebenfalls WinXP Prof.) rekonstruieren. <br>
    <br>
    Neuregistrierung mit dem Paramter /regserver und den Austausch sämtlicher<br>GUIDs haben auch nichts gebracht.<br>
    <br>
    Hat jemand eine Idee?<br>
    <br>
    Schönen Gruß,<br>
    André Mellenthin<br>
    <br>

  • #2
    Hallo,

    wie sieht ein <b>kleines</b> Minimal-Beispiel für den COM-Server und den Client aus, mit dem sich dieser Effekt jederzeit reproduzieren lässt

    Comment


    • #3
      Hallo,<br>
      <br>
      <b>also, der Server wird wie folgt erzeugt:</b> <br>
      <br>
      Datei -> Neu -> Anwendung<br>
      Anwendung speichern<br>
      Datei -> Neu -> Weitere -> ComObject (Register ActiveX)<br>
      Deklaration der Methode GetWideString<br>
      Implementierung des COM-Objektes wie folgt:<br>
      <br>
      <i>
      unit COMTest_Impl;<br>
      <br>
      {$WARN SYMBOL_PLATFORM OFF}<br>
      <br>
      interface<br>
      <br>
      uses<br>
      Windows, ActiveX, Classes, ComObj, COMTest_TLB, StdVcl;<br>
      <br>
      type<br>
      TCOMTestSvr = class(TTypedComObject, ICOMTestSvr)<br>
      protected<br>
      function GetWidestring: WideString; stdcall;<br>
      {ICOMTestSvr-Methoden hier deklarieren}<br>
      end;<br>
      <br>
      implementation<br>
      <br>
      uses ComServ;<br>
      <br>
      function TCOMTestSvr.GetWidestring: WideString;<br>
      begin<br>
      // Hier kommt er erst gar nicht hin...<br>
      result := 'Widestring';<br>
      end;<br>
      <br>
      initialization<br>
      TTypedComObjectFactory.Create(ComServer, TCOMTestSvr, Class_COMTestSvr,<br>
      ciMultiInstance, tmApartment);<br>
      end.<br>
      </i>
      <br>
      <br>
      <b>Der Client sieht wie folgt aus:</b><br>
      <br>
      Datei -> Neu -> Anwendung<br>
      TButton auf Formular ziehen<br>
      Anwendung speichern<br>
      Projekt -> Typbibliothek importieren und entsprechende wählen<br>
      Uses-Block erweitern<br>
      Button1 implementieren<br>
      <br>
      <i><br>
      procedure TForm1.Button1Click(Sender: TObject);<br>
      var<br>
      objComTest : ICOMTestSvr;<br>
      begin<br>
      CoInitialize(nil);<br>
      try<br>
      objComtest := CoCOMTestSvr.Create;<br>
      try<br>
      objComTest.GetWidestring;<br>
      finally<br>
      objComTest := nil;<br>
      end;<br>
      finally<br>
      CoUninitialize;<br>
      end;<br>
      end;<br>
      </i>
      <br>
      Den Client habe ich auch schon mit C# im Visual Studio .NET<br> erstellt, dann erhalte ich ebenfalls ann besagter Stelle eine<br> Exception des Typs "System.NullReferenceException".<br>
      <br>
      Kann es eventuell etwas mit dem .NET Framework zu tun haben?<br>
      <br>
      Schönen Gruß,<br>
      André Mellenthin<br>
      <br&gt

      Comment


      • #4
        Hallo,

        sowohl Server als auch Client liegen als separater Prozess vor, somit macht es keinen Sinn, auf TTypedComObject zurückzugreifen. Statt dessen ist <b>TAutoObject</b> (Automations-Objekt) die richtige Wahl, da hier der Standard-Marshaler hinter den Kulissen automatisch für die notwendigen Anpassungsarbeiten (Überwindung der Prozessgrenze, Transport der Parameter und Rückgabewert in den anderen Adressraum) sorgt.

        &gt;Kann es eventuell etwas mit dem .NET Framework zu tun haben?

        Nein - die CLR hat beim Aufruf von Automation-Objekten von Delphi keine Probleme, alle Automation-kompatiblen Datentypen werden voll unterstützt

        Comment


        • #5
          Hallo,<br>
          <br>
          vielen Dank schonmal. Der Rumpf war der, den mir der Delphi-Experte<br> für COM-Objekte erzeugt hat. <br>
          <br>
          Heißt das, dass <b>TTypedComObject</b> ausschließlich bei In-Process-<br>Servern verwendet werden kann oder sogar darf?<br>
          <br>
          Schönen Gruß,<br>
          André Mellenthin<br&gt

          Comment


          • #6
            Hallo,

            &gt;..ausschließlich bei In-Process-
            Servern verwendet werden kann ..

            wenn man eigene Proxy-/Stub-DLLs für den Marshaler schreibt, kann man beliebige COM-Objekte mit beliebigen Datenstrukturen in den Parametern über Prozessgrenzen aufrufen. Dies würde aber mit dem Delphi-Prinzip (RAD = Rapid Application Development) kollidieren - derartige Proxy-/Stub-DLLs sind nur bei C++ üblich :-)

            Damit es für uns im Alltag einfacher geht, stellt Borland TAutoObject zur Verfügung. Alle damit erstellten COM-Objekte nutzen als "Trittbrettfahrer" die Abkürzung, die Microsoft damals für Visual Basic 3 ins Betriebssystem eingebaut hat. In diesem Fall kümmert sich der Standard-Marshaler (alias Typbibliotheks-Marshaler) automatisch darum, wenn er in der Registry als Zuständig gekennzeichnet wird. Die Class Factory von TAutoObject macht dies automatisch im Hintergrund, so dass es beim Prozessübergreifenden Zugriff mit TAutoObject keine Probleme gibt

            Comment


            • #7
              Hallo,<br>
              <br>
              vielen Dank für diese ausführlichen Informationen.<br>
              <br>
              Wie ich bereits im Inhaltsverzeichnis Ihres Buches COM/DCOM/COM+ gesehen habe, <br>ist dies Thema eines der späteren Kapitel.<br>
              <br>
              Dort bin ich noch nicht angekommen... :-)<br>
              <br>
              Schönen Gruß,<br>
              André<br&gt

              Comment

              Working...
              X