Announcement

Collapse
No announcement yet.

COM mit C# nutzen

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

  • COM mit C# nutzen

    Hallo,

    ich habe folgendes Problem:

    Beim Map&Guide Mapserver wird ein COM-Object angeboten, dass Koordinaten-Transformationen machen kann. Dieses Object kann ich unter Delphi nutzen, allerdings will ich jetzt auch eine C#-Version basteln.

    Das COM-Object ist folgendermaßen definiert:

    <pre>
    02637 // ITransform
    02638
    02670 [
    02671 object,
    02672 uuid(0A86A069-6322-4685-9B4C-41FD4BA476F7),
    02673 helpstring("ITransform Interface"),
    02674 pointer_default(unique)
    02675 ]
    02676 interface ITransform : IUnknown
    02677 {
    02689 HRESULT get_LogicalRect([out] RECT *pVal);
    02690
    02704 HRESULT put_LogicalRect([in] RECT newVal, [in] ENavigateFlags navFlags);
    02705
    02716 HRESULT get_PixelRect([out] RECT *pVal);
    02717
    02734 HRESULT put_PixelRect([in] RECT newVal, [in] ENavigateFlags navFlags);
    02735
    02748 HRESULT get_RotationAngle([out] double *pVal);
    02749
    02765 HRESULT put_RotationAngle([in] double newVal, [in] ENavigateFlags navFlags);
    02766
    02788 HRESULT Trans([in] ECoordFormat cfIn, [in] ECoordFormat cfOut, [in, out, size_is(clPoints)] POINT *rgPoints, [in] long clPoints);
    02789
    02819 HRESULT ShrinkTrans([in] ECoordFormat cfIn, [in] ECoordFormat cfOut, [in, out, size_is(*pclPoints)] POINT *rgPoints, [in, out] long *pclPoints);
    02820 };
    </pre>

    Da ich nur das "Trans()" brauche, habe also folgende Sachen definiert:

    <pre>
    enum ECoordFormat
    {
    cfLOGICAL = 0,
    cfPIXEL = 1,
    cfSUPERKONFORM = 2,
    cfMERCATOR = 3,
    cfGEODECIMAL = 4,
    cfGEOMINSEK = 5,
    cfUTM = 6,
    cfGK = 7,
    cfUSAKONF = 8
    };

    enum ENavigateFlags
    {
    navCHANGE = 0,
    navCHECK = 1,
    navNOHISTORY = 2,
    navNEWDC = 4,
    navNOREFRESH = 8
    };

    struct tagPOINT
    {
    public int x;
    public int y;
    }

    [ComImport, Guid("7182D86C-87E5-40DB-A1F3-0A02EC1E46C3")]
    class Transform
    {
    }

    // Declare ITransform as a COM Interface which
    // derives from the IUnknown Interface.
    [Guid("0A86A069-6322-4685-9B4C-41FD4BA476F7"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown )]
    Interface ITransform // cannot list any base Interfaces here
    {

    void Trans( [In] ECoordFormat cfIn,
    [In] ECoordFormat cfOut,
    [In, Out] tagPOInT rgPoints,
    [In] long clPoints);

    //HRESULT ITransform::Trans (
    // [in] ECoordFormat cfIn,
    // [in] ECoordFormat cfOut,
    // [in, out, size_is(clPoints)] POINT * rgPoints,
    // [in] long clPoints
    )

    </pre>

    wenn ich dann aber versuche das Object zu erzeugen, kommt ein "unbekannter" Fehler:

    <pre>
    Transform t = new Transform();
    ITransform Transformer = (ITransform) t;
    tagPOInT p;
    p.x = 3544826;
    p.y = 5797182;

    Transformer.Trans(ECoordFormat.cfGK,ECoordFormat.c fMERCATOR,p,1);
    </pre>

    Kann mir jemand helfen?

  • #2
    Hallo,

    gibt es einen Grund, warum der Runtime Callable Wrapper (RCW) für das COM-Objekt nicht automatisch über die IDE angelegt wurde, sondern selbst von Hand zusammengebaut wird?

    &#10

    Comment


    • #3
      Nee, ich wusste nicht dass das geht (hatte es aber gehofft). Ich werde jetzt mal intensiver suchen. Vielleicht hilft ja der neue Begriff :-)

      Grüße Ki

      Comment


      • #4
        Hallo,

        Visual Studio übernimmt diese Aufgabe automatisch, wenn dem eigenen Projekt über den Solution Explorer (alias Projektmappen-Explorer) ein Verweis auf die registrierte Typbibliothek des alten COM-Objekts hinzugefügt wird (Dialog <i>Verweis hinzufügen</i> | Registerseite <b>COM</b>)

        Comment


        • #5
          Ich habe es gestern auch noch gesehen.
          Ich konnte ja nicht ahnen, dass es so einfach ist. :-

          Comment

          Working...
          X