Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

ActiveX και DllImport

Îåêßíçóå áðü ôï ìÝëïò tasosmpp. Τελευταία δημοσίευση από το μέλος tasosmpp στις 31-08-2008, 11:29. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  28-08-2008, 11:10 44331

    ActiveX και DllImport

    Προσπαθώ να κάνω το εξής:
       1) Δημιουργώ ένα ActiveX dll (c# .net)
       2) Δημιουργώ ένα 2ο dll το οποίο χρησιμοποιεί ετοιμο κώδικα. (QT 4)
       3) Κάνω export ένα function απο το 2ο dll για να το χρησιμοποιήσω στο ActiveX.

    Μέχρι τώρα:
         1) Το ActiveX λειτουργει κανονικά όταν δεν κάνω import το 2ο dll.
         2) To 2o dll μπορω να το κάνω import σε ένα C# console app και να το χρησιμοποιήσω κανονικά.

    Πρόβλημα:
     Όταν κάνω import το 2o dll στο ActiveX dll τότε crasharei ο IE.
                    "This may be due to a corruption of the heap, and indicates a bug in iexplore.exe or any of the DLLs it has loaded"

    Elib.dll

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Elib.h
    extern "C" {__declspec(dllexport) char * getResult();}

    //Elib.cpp
    extern "C" {
        char * getResult()
      {

        return "asdas";

      }
      }


    axTest.dll

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.ComponentModel;



    namespace axTest
    {


    [Guid("24B826AF-690E-4033-AA63-7FF5EE3E173B"), InterfaceType(ComInterfaceType.InterfaceIsDual), ComVisible(true)]

    public interface IaxTest
    {
    String getResponse();
    }


    [Guid("A74EE44F-0144-445a-83AE-F27F00160700"), ProgId("csharpAx.myControl"),ClassInterface(ClassInterfaceType.None), ComDefaultInterface(typeof(IaxTest)),ComVisible(true)]
    public class myControl : System.Windows.Forms.UserControl,IaxTest
    {
    [DllImport("c:\\Libs\\elib.dll")]
    static extern string getResult();


    public String getResponse()
    {
    String s= getResult();

    return "asd";
    }
    }





    }


    To axTest.dll δουλεύει κανονικά αν παραλείψω την γραμμή 31.


    Τι μπορεί να φταίει?










  •  28-08-2008, 14:31 44339 σε απάντηση της 44331

    Απ: ActiveX και DllImport

    Που βρίσκεται το 2o .dll;

    Για να δουλέψει αυτό πρέπει το δεύτερο .dll να βρίσκεται:

    1. στο path του υπολογιστή, και
    2. αν δεν είναι στο system32, θα πρέπει να υπάρχουν κατάλληλα δικαιώματα στο folder που θα το βάλεις...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  28-08-2008, 18:18 44342 σε απάντηση της 44339

    Απ: ActiveX και DllImport

    To dll το φορτώνω απο το path c:\Libs. (Έχω γράψει και το absolute path στο import.)

    Το παραπάνω path το έχω κάνει και append στο $PATH.
    Αντέγραψα το dll στο system32 αλλά πάλι το ίδια.
    Δοκίμασα και στο ίδιο folder τις σελίδας. ( Sidebar gadget)

    Δεν δουλεύει σε καμία περίπτωση.


    Τί εννοείς με τα δικαιώματα στο folder???

  •  28-08-2008, 18:56 44343 σε απάντηση της 44342

    Απ: ActiveX και DllImport

    To ActiveX dll δεν πρέπει να έχει γίνει register με το regsvr32;
    Vir prudens non contra ventum mingit
  •  28-08-2008, 22:21 44345 σε απάντηση της 44342

    Απ: ActiveX και DllImport

    Για να τρέξει ένα .dll μέσα στον Internet Explorer δεν είναι αρκετό από μόνη της η υλοποίηση του σαν ActiveX DLL. Πρέπει να έχεις υλοποιημένα και άλλα interfaces, όπως το IObjectSafety.

    Το Import που γράφεις στο κώδικά σου είναι για τον compiler - δεν βοηθάει σε τίποτα κατά το runtime.

    Δεν είμαι σίγουρος αν απαιτείται υλοποίηση και άλλων interfaces, για να παίξει κάτι ActiveX μέσα στο sidebar - θα πρότεινα να κοιτάξεις τον οδηγό ανάπτυξης sidebar gadgets που ύπάρχει στο MSDN Library

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  29-08-2008, 19:18 44370 σε απάντηση της 44342

    Απ: ActiveX και DllImport

    Ποιό είναι ολόκληρο το error message? Που εμφανίζεται? Υποψιάζομαι  ότι υπάρχει memory leak ή buffer overrun σε κάποιο function call και γι αυτό και έχεις αυτό το μήνυμα. Μπορεί να γεμίζεις κάποιο πίνακα με περισσότερα στοιχεία απ' όσα μπορεί να δεχθεί, να επιστρέφεις ένα string μεγαλύτερο από αυτό που έπρεπε, να θέτεις σε κάποια void* παράμετρο πίνακα αντί για int κλπ. Θα πρέπει να δεις ποιό είναι ολόκληρο το μήνυμα και που εμφανίζεται. Αν δεν έχεις βάλει exception handling στον κώδικα σου θα πρέπει να το κάνεις και να αποθηκεύεις κάπου τα μηνύματα λάθους μαζί με όσες περισσότερες πληροφορίες μπορείς. Αυτό θα πρέπει να το κάνεις και στον κώδικα C# και στον κώδικα C++ που έφτιαξες με το Qt.

    Από εκεί και πέρα, το .NET έχει garbage collection ενώ τα ActiveX όχι. Υπάρχουν αυστηροί κανόνες για το ποιός δημιουργεί ένα αντικείμενο στη μνήμη (string, integer, οτιδήποτε) και ποιός το σβήνει. Σε περίπτωση που σβήσεις είτε άμεσα είτε έμμεσα ένα αντικείμενο το οποίο θα ξανασβήσει ο IE, θα έχεις παρόμοιο πρόβλημα. Μπορεί για παράδειγμα ο IE να σου δίνει ένα BSTR το οποίο εσύ χειρίζεσαι ως string. Επειδή όμως ο IE δημιούργησε το αντικείμενο περιμένει ότι αυτός θα πρέπει και να το σβήσει. Καθώς όμως εσύ το χειρίζεσαι ως string και αυτό διαγράφεται  αυτόματα από τον garbage collector, θα πάρεις μήνυμα λάθους όταν προσπαθήσει ο ΙΕ να το ξανασβήσει.

    Εφόσον ήδη προγραμματίζεις σε C++ πάντως ίσως θα ήταν ευκολότερο να φτιάξεις το ActiveX σε Managed C++ αντί για C# και να δουλέψεις με includes αντί για DllImport


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  31-08-2008, 11:29 44388 σε απάντηση της 44370

    Απ: ActiveX και DllImport

    Ευχαριστώ όλους για τον χρόνο και τις απαντήσεις.

    George J. Capnias -> Το  IObjectSafety δεν χρειάζεται πάντα να υλοποιηθεί. Απλά στον IΕ αν δεν υλοποιηθεί εμφανίζεται μύνημα αν θέλω να τρέξει το ActiveX. Στο sidebar applet δεν πετάει κανένα μύνημα καθώς μαλλον ειναι trusted zone.

    KelMan -> To Activex dll το έχω κάνει register με το regasm. Stick out tongue

    Παναγιώτης Καναβός -> Το Qt έχει δικούς του τύπους δεδομένων. Ο κώδικας C++ περνάει απο ειδικό προεπεξεργαστή για να παραχθεί ο τελικός C++ κώδικας που υλοποιούνται οι μηχανισμοί του toolkit. Για να χρησιμοποιήσω τον κώδικά αυτο σε Managed C++ ( με unsafe κτλ.) πρέπει να χρησιμοποιήσω τον τελικό C++ κώδικα που δεν είναι και πολύ κατανοητός gt είναι απο preprocessor (δεν λέω ότι δεν γίνεται αλλά όπως λένε και οι τύποι πίσω απο το Qt "μόνο για μελέτη" Wink

    Τεσπα το prob το βρήκα.  "...ότι υπάρχει memory leak ή buffer overrun σε κάποιο function call και γι αυτό και έχεις αυτό το μήνυμα. Μπορεί να γεμίζεις κάποιο πίνακα με περισσότερα στοιχεία απ' όσα μπορεί να δεχθεί, να επιστρέφεις ένα string μεγαλύτερο από αυτό που έπρεπε, να θέτεις σε κάποια void* παράμετρο πίνακα αντί για int κλπ"

    1
    2
    3
    4
    char *testfunc()
    {
      return "asdasd";
    }

    Όσο και να φαίνεται ότι είναι σωστό δεν είναι. Αν και δουλεύει το αποτέλεσμα είναι σαν να γυρνάς μια local variable . Σε vs2005 και gcc4 δουλεύει σωστά χωρίς καν warning.


    Το σωστό είναι να δευσμεύω μνήμη με την malloc (δηλαδή απο το heap) και να γυρνάω ένα pointer σε αυτήν την μνήμη. Όταν ο ΙΕ πάρει τον pointer τα δεδομένα είναι ακόμα στο heap...

    (Μας φάγανε τα managed .... Stick out tongue)
     


Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems