Announcement

Collapse
No announcement yet.

Aufruf einer DLL-Methode

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

  • Aufruf einer DLL-Methode

    hallo entwicklerforum

    ich möchte eine Methode aus einer DLL aufrufen, welche ich zuvor über "Verweise" hinzugefügt habe.

    Der Auruf der Methode in C++ sieht folgendermaßen aus:

    [highlight=c++]

    IMyObjectPtr p;
    p.CreateInstance(__uuidof(MyObject) );

    int iParams = 2;
    SAFEARRAY *pSaFeld = SafeArrayCreateVector( VT_BSTR, 0, iParams );
    SAFEARRAY *pSaWert = SafeArrayCreateVector( VT_BSTR, 0, iParams );
    long Count = 0; // Zähler für 2 Parameter

    // 1. Wert
    SafeArrayPutElement( pSaFeld, &Count, SysAllocString(L"Wert1"));
    SafeArrayPutElement( pSaWert, &Count, SysAllocString(L"1"));
    Count = 1;
    // 2. Wert
    SafeArrayPutElement( pSaFeld, &Count, SysAllocString(L"Wert2"));
    SafeArrayPutElement( pSaWert, &Count, SysAllocString(L"2"));
    VARIANT var1, var2;

    V_VT(&var1) = VT_ARRAY | VT_BSTR;
    V_VT(&var2) = VT_ARRAY | VT_BSTR;

    var1.parray = pSaFeld;
    var2.parray = pSaWert;

    //um diese Methode geht es
    p->Action( bstrComponentID, 2, 0, 0, 0, var1, var2, 0)

    [/highlight]

    Laut Schnittstelle hat die Methode "Action" folgende Parameter:

    Code:
    int Action(string bstrKompID, int lMaNr, int lAuVJ, int lAaNr, int lUtNr, int iEvent, object In1, object In2, out object pOut);
    Wie würde der Aufruf der Methode "Action" in C# aussehen. Wie initialisiere ich die Paramater, speziell var1 und var2 (Zeiger auf String-Arrays???)

    Freue mich über jeden denkanstoß

    mfg
    Zuletzt editiert von da_halbi; 17.09.2009, 11:08.

  • #2
    Wenn du sagst du hast sie als Verweis hinzugefügt heißt das deine dll ist eine COM dll und IMyObjectPtr damit eine COM Schnittstelle?

    Comment


    • #3
      ja genau, hab ich vergessen zu erwähnen

      Comment


      • #4
        Dann gehe ich davon aus das die Interop Magie das schon richtig hinbekommt wenn du da ein string[] reinschiebst (und auf object castest). Aber ich geh auch mal davon das du das schon längst ausprobiert hast es aber aus irgendeinem Grund nicht klappt?

        Comment


        • #5
          hallo jansen.

          erstmal danke für deine antworten

          richtig, anfangs ging ich auch davon aus, dass zwei simple string-array reichen müssten. das ist jedoch nicht der fall. laut meiner ansicht (ich hoffe dass ich nicht komplett daneben liege) sind var1 und var2 zeiger auf die zwei arrays oder zumindest zu was ähnliches

          folgendes hab ich mal testweise ausprobiert, funktioniert aber nicht (bekomme eine AccessViolation):

          [highlight=c#]
          MyParameter paramFeld, paramWert;

          paramFeld.parameter = new string[2];
          paramWert.parameter = new string[2];

          paramFeld.parameter[0] = "Wert1";
          paramWert.parameter[0] = "1";


          paramFeld.parameter[1] = "Wert2";
          paramWert.parameter[1] = "2";


          p1 = Marshal.AllocCoTaskMem(Marshal.SizeOf(paramFeld));
          p2 = Marshal.AllocCoTaskMem(Marshal.SizeOf(paramWert));

          pOut = IntPtr.Zero;

          output = (object)pOut;

          Marshal.StructureToPtr(paramFeld, p1, false);
          Marshal.StructureToPtr(paramWert, p2, false);

          returnVal = auftragsinfo.Action("test", 0, 0, 0, 0, 0, (object)p1, (object)p2, out output);
          [/highlight]

          p1, p2 und pOut sind IntPtr, MyParameter ist eine struct
          Zuletzt editiert von da_halbi; 17.09.2009, 14:41.

          Comment


          • #6
            hat niemand eine idee an was das scheitern könnte?

            Comment


            • #7
              Sorry bin überfragt.

              Kannst dir mal den Stack beim Aufruf ansehen? So bekommen wir zumindest raus ob der Fehler aus dem Interop Code kommt oder ob der erst später aus der eigentlichen COM Komponente kommt. Im letzteren Fall hast du zumindest die Chance die COM Komponente zu Debuggen und dir anzusehen was da den ankommt.

              Damit der Debugger da sauber hält solltest du denn so einstellen das er schon beim werfen der Exception hält und nicht erst da wo die gefangen wird.
              Dazu CTRL+ALT+E und in dem Exceptiondialog mal alle Exceptiontypen anhaken.
              Man könnte auch nur die AccessViolation checken aber bis man die in der Liste gefunden hat ist Tag vorbei

              Comment


              • #8
                danke für die tipps, werd das gleich mal ausprobieren

                Comment

                Working...
                X