Announcement

Collapse
No announcement yet.

Bitmaps über COM

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

  • Bitmaps über COM

    Hallo zusammen,<br>
    <br>
    hat jemand schon versucht, Bitmaps über Prozessgrenzen hinweg mittels COM zu übertragen?<br>
    <br>
    Ich habe folgendes versucht, aber es funktioniert nicht:<br>
    <br>
    <b>Auf dem Server</b><br>
    <br>
    if AppObject.GetBitmap(Name) <> nil then<br>
    begin<br>
    FPicture.Bitmap := AppObject.GetBitmap(Name);<br>
    GetOlePicture(FPicture, IPicture);<br>
    Result := IPicture;<br>
    end;<br>
    <br>
    Auf dem Client schlägt aber der Aufruf dieser COM-Methode fehl (gleich recht deftig mit dem Code $8000FFF).<br>
    <br>
    Hat irgendwer eine Idee??? Andreas Kosch fällt da sicher etwas ein :-)<br>
    <br>
    Danke und schöne Grüsse aus der Schweiz,<br>
    <br>
    Martin

  • #2
    Hallo,

    in der Tat - und verschiedene Lösungen für dieses Problem sind in meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> nachzulesen ;-)

    Wie der Name der API-Funktion Get<b>Ole</b>Picture bereits andeutet, steht <b>IPicture</b> nur innerhalb eines Prozesses zur Verfügung. In dem o.g. Buch liest sich das so: "<i>Das von OLE vordefinierte IPictureDisp-Interface (alias Picture in Delphi) sowie die beiden Hilfsfunktionen GetOlePicture und SetOlePicture können nur innerhalb eines Prozesses eingesetzt werden. Somit beschränkt sich der Einsatz auf die Kombination Client + In-Process Server (im Win32-SDK tauchen diese Funktionen im Abschnitt der ActiveX-Controls auf). Das Problem liegt dabei darin, daß GetOlePicture (Delphi) intern OleCreatePictureIndirect (Win32) aufruft - und dort wird nur ein GDI-Objekt (Picture-Handle) in einem COM-Objekt verpackt. Allerdings ist ein Bitmap-Handle nur innerhalb des eigenen Prozesses gültig, so daß bei einem DCOM-Zugriff und beim Einsatz in einem Local Server Probleme auftreten</i>".

    Man muss also auf eine der anderen Alternativen (TImage-Instanz als Text, SafeArray etc.) zurückgreifen, wenn eine Thread- bzw. Prozess-Grenze zu überwinden ist

    Comment


    • #3
      Hallo,<br>
      <br>
      danke für die rasche Antwort. Hat sich scheinbar einiges im Buch geändert (ich habe noch das Buch COM/DCOM mit Delphi) :-)<br>
      <br>
      Wie funktionieren die Alternativen? Gibt es bereits Beispiele im Forum? Ich finde so ad hoc nichts...<br>
      <br>
      Schöne Grüsse,<br>
      <br>
      Marti

      Comment


      • #4
        Hallo,

        die Seitenanzahl des neuen Buchs hat sich mehr als verdoppelt und trotzdem mussten einige Kapitel als PDF auf die CDROM ausgelagert werden. Im neuen Buch sind mehrere Beispielprojekte, die demonstrieren, wie man Grafiken übertragen kann.

        Methode a): Grafik als "Text" übertragen
        <pre>
        procedure TImgSrv.GetImage(const Filename: WideString; out SrvMsg: WideString);
        var
        ss : TStringStream;
        ms : TMemoryStream;
        img : TImage;
        begin
        ms := TMemoryStream.Create;
        try
        ss := TStringStream.Create(SrvMsg);
        try
        img := TImage.Create(nil);
        with img do
        try
        Picture.LoadFromFile(Filename);
        ms.WriteComponent(img);
        ms.Seek(0, soFromBeginning);
        ObjectBinaryToText(ms, ss);
        ss.Seek(0, soFromBeginning);
        SrvMsg := ss.DataString;
        finally
        Free;
        end;
        finally
        ss.Free;
        end;
        finally
        ms.Free;
        end;
        end;
        </pre>

        Methode b): Grafik als SafeArray übertragen
        <pre>
        function TImgSrv.GetImageEx(const Filename: WideString): OleVariant;
        var
        F: file;
        Size: Integer;
        Data: PChar;
        begin
        AssignFile(F, FileName);
        Reset(F, 1);
        try
        Size := FileSize(F);
        Result := VarArrayCreate([0, Size - 1], varByte);
        Data := VarArrayLock(Result);
        try
        BlockRead(F, Data^, Size);
        finally
        VarArrayUnlock(Result);
        end;
        finally
        CloseFile(F);
        end;
        end;
        </pre&gt

        Comment


        • #5
          Hallo,

          recht herzlichen Dank. Wenn man sich auf jemanden verlassen kann, dann ist das Andreas Kosch, das muss auch einmal gesagt werden.

          Schöne Grüsse,

          Marti

          Comment

          Working...
          X