Results 1 to 11 of 11

Thread: Casten van een interface naar een GUID-loze interface

  1. #1

    Angry Casten van een interface naar een GUID-loze interface

    Hallo,

    Deze code werkt wel in Delphi 2006 / BDS 4, maar niet in Delphi 6:

    Code:
    function Cast(aTarget: IInterface): IReadWriteSync;
    begin
      Supports(aTarget, IReadWriteSync, Result);
    end;
    Delphi 6 zegt:
    Interface 'IReadWriteSync' has no interface identification

    Terwijl dit in Delphi 2006 gewoon werkt! (het compiled, en runt correct)

    Hoe krijg ik dit in Delphi 6 aan de praat terwijl ik de IReadWriteSync interface (uit sysutils) niet kan aanpassen?

  2. #2
    Heel misschien met as, maar anders heb je pech.

    Code:
      Result := aTarget as IreadWriteSync.
    En hebben ze onder D2006 wel een guid toegevoegd of ben je daar in .Net ipv win32 bezig?
    We adore chaos because we like to restore order - M.C. Escher

  3. #3
    Wacht ff:

    Delphi 6:

    Code:
    IReadWriteSync = interface
        procedure BeginRead;
        procedure EndRead;
        function BeginWrite: Boolean;
        procedure EndWrite;
      end;

    Delphi 2006:

    Code:
    IReadWriteSync = interface
        ['{7B108C52-1D8F-4CDB-9CDF-57E071193D3F}']
        procedure BeginRead;
        procedure EndRead;
        function BeginWrite: Boolean;
        procedure EndWrite;
      end;
    In Delphi 2006 heerft IReadWriteSync wel een GUID gekregen!


    Nu is de vraag dus: hoe kan ik in delphi 6 een IInterface naar een IReadWriteSync casten?

  4. #4
    Quote Originally Posted by Lord Larry
    Heel misschien met as, maar anders heb je pech.
    Delphi 6: Operator not applicable to this operand type

  5. #5
    En deze?

    Code:
    Result := IUnknown(aTarget) as IreadWriteSync;
    Marcel

  6. #6
    Supports INLDelphiMember Johan Stokking's Avatar
    Join Date
    Sep 2003
    Location
    Assen
    Posts
    649
    Volgens mij kun je niet casten als de interface niet afstamt van IInterface en geen GUID heeft.

  7. #7
    Quote Originally Posted by Marcel
    En deze?
    Code:
    Result := IUnknown(aTarget) as IreadWriteSync;
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      intf: IInterface;
      rws: IReadWriteSync;
    begin
      intf := TMREWSync.Create as IInterface;
      rws := IUnknown(intf) as IReadWriteSync;
    end;
    Geeft ook: 'Operator not applicable to this operand type'


    (PS: Pasconvert geeft een error: Internal Application Error, Access violation at address 40008EEA in module 'rtl70.bpl'. Read of address 00C7517C, /srccnv)

  8. #8
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Misschien denk ik wel te simpel hoor, maar is je interface een GUID geven niet gewoon een optie? Die zal je nodig hebben als je een QueryInterface wilt aanroepen (waar Supports en 'as' ook op neerkomen uiteindelijk), weinig keuze dus...


    Edit: ik kijk te simpel, mistte het "SysUtils" verhaal...
    Qui custodiet ipsos custodes

  9. #9
    Supports INLDelphiMember Johan Stokking's Avatar
    Join Date
    Sep 2003
    Location
    Assen
    Posts
    649
    Je interface moet een GUID hebben. Jammer dat dit niet standaard in SysUtils zit. Een smerige oplossing is de interface definitie even aan te passen door de GUID erbij te zetten... Hoe creatief je ook bent, het zal niet gaan om op een andere manier de interface te verkrijgen vermoed ik.
    Last edited by Johan Stokking; 26-Jan-06 at 19:20.

  10. #10
    Misschien kun je nog iets handigs uit deze thread halen?

  11. #11
    Ik heb het volgende gedaan:

    Code:
    IMyReadWriteSync = interface(IReadWriteSync)
      ['{42149CA1-4B25-447F-FA3C-CD45E595FE42}']
    end;
    En dan afgeleiden gemaakt van klassen die IReadWriteSync ondersteunen, met toevoeging van IMyReadWriteSync . Mooi is anders, maar het werkt wel.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •