Announcement

Collapse
No announcement yet.

Falsche Result-Werte bei In-Process COM Server

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

  • Falsche Result-Werte bei In-Process COM Server

    hallo,

    ich habe versucht, einen In-Process COM-Server mit Type-Library
    zu erstellen. Für meine Methode habe ich HRESULT als Return Type
    definiert.

    Wenn ich nun mit "Import Type Library" eine Komponente erstelle,
    diese auf einem Form einfüge und meine Methode aufrufe,
    wird meine Methode abgearbeitet, das Result, das ich danach erhalte,
    entspricht aber nicht dem von mir übergebenen.
    Ich erhalte 4362580 als Rückgabewert.

    <pre>
    //aus dem COM Server...
    unit uComInProcTest;
    {$WARN SYMBOL_PLATFORM OFF}
    interface
    uses
    Windows, ActiveX, Classes, ComObj, ComInProcTest_TLB, StdVcl;
    type
    TTestCom = class(TTypedComObject, ITestCom)
    protected
    function TestMethod: HResult; stdcall;
    end;
    implementation
    uses ComServ;
    function TTestCom.TestMethod: HResult;
    begin
    Result := <FONT COLOR="red">12345</font>;
    end;
    initialization
    TTypedComObjectFactory.Create(ComServer, TTestCom, Class_TestCom,
    ciSingleInstance, tmApartment);
    end.

    //aus dem COM-Client...
    procedure TForm1.Button1Click(Sender: TObject);
    var
    i: HResult;
    begin
    i := 0;
    i := TestCom1.TestMethod;
    ShowMessage(IntToStr(i)); //gibt <FONT COLOR="red">4362580</font> an Stelle von 12345 zurück
    end;
    </pre>

    Wo liegt mein Fehler?
    Ich habe versucht einen Long-Wert im Type-Library zu definieren,
    was das selbe Ergebnis zur Folge hatte. Wenn ich einen Variant
    verwende, bekomme ich 0 zurück.

    Wenn ich IN-Variablen definiere bekomme ich die richtigen Werte übergeben.
    Warum funktioniert es mit dem Result nicht?

    mfg
    Alexander Stracker

  • #2
    ich habe gerade das selbe auf meinem Notebook nachgebaut (Delphi 5)
    und habe mit Erstaunen festgestellt, daß es hier funktioniert.

    Um sicherzugehen habe ich das selbe dann noch einmal mit Delphi 6 auf
    meinem anderen PC probiert und bin wieder auf das Problem von vorher
    gestoßen

    Comment


    • #3
      wenn ich den Server vom Notebook auf meinem anderen PC compiliere u. registriere komme ich zu dem selben Problemfall.

      Kann etwas an meinen Options/Environment-Options bzw. den Options meines Packages falsch sein

      Comment


      • #4
        Hallo,

        man muss sich schon an die von Win32 (COM) aufgestellten Regeln halten. Ein HRESULT ist nicht nur eine Zahl, sondern besteht aus mehreren Teilen: <br>
        - Severity-Bit (1 Bit Flag) <br>
        - 4 Bit grosser reservierter Bereich <br>
        - 11 Bit grosser Bereich für Status-Code <br>
        - 16 Bit grosser Bereich für Fehler-Code

        Anstelle einen Wert wie 1234 direkt zuzuweisen, sollte die eigene Anwendung für das Zuweisen eines eigenen HRESULT-Wertes (wenn das überhaupt sinnvoll ist) auf die Funktion <b>MakeResult</b> aus der Delphi-Unit <i>ActiveX.pas</i> zurückgreifen. Der Client nutzt dann die Funktion <b>ResultCode</b>, um den Bit-Bereich so auszumaskieren, dass die eigene in HRESULT codierte Zahl ausgelesen werden kann.<br>
        Da das o.g. Beispiel "illegale" HRESULTs zusammenbaut, hängt das Verhalten von der installierten Betriebssystemversion (COM) ab.

        In meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> kümmert sich das Kapitel 5 auf 25 Seiten nur um HRESULT und SafeCall

        Comment


        • #5
          wenn ich den Server vom Notebook auf meinem anderen PC compiliere u. registriere komme ich zu dem selben Problemfall.

          Kann etwas an meinen Options/Environment-Options bzw. den Options meines Packages falsch sein

          Comment


          • #6
            s.g. Hr. Kosch,

            danke für die Info.

            Ich werde bei nächster Gelegenheit Ihr Buch bestellen ;

            Comment

            Working...
            X