Calling unmanaged code from managed MFC worker thread

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Klaus

    #1

    Calling unmanaged code from managed MFC worker thread

    Hi,

    I have an existing VC 6 MFC application which communicates asynchronly with
    a VC 2005 managed code dll.
    I use an unmanaged base class with virtual functions to access methods in
    the MFC application.
    Furthermore, I use a pointer to an unmanaged function to jump back into the
    managed dll.

    The managed part is basically a remoting enhancement which asynchronly
    initiates a call from the remoting thread to the MFC application. The
    information is collected within the main thread of the MFC application. The
    managed code dll is invoked via a function pointer. From the managed code
    additional calls to the unmanaged MFC application will be done via a pointer
    to an object in the MFC. When this code is executed within the main thread
    of the MFC application everything works fine.

    However, if I switch to a MFC worker thread, calls via the base class
    pointer results in System.AccessVi olationExceptio n!

    Scenario, which works:
    1. Remoting thread imvoked
    2. Managed DLL -MFC App asynchron, no result
    3. Switch thread to App main thread
    4. MFC App -Managed DLL
    5. Managed DLL -MFC App (synchron)

    Scenario, which does not work:
    1. Remoting thread imvoked
    2. Managed DLL -MFC App (asynchron, no result)
    3. Switch thread to MFC worker thread!!!
    4. MFC App -Managed DLL
    5. Managed DLL -MFC App (synchron): System.AccessVi olationExceptio n !!

    How can I access pointer to unmanaged classes from managed code within a
    worker thread?

    Best regards,
    Klaus


  • Pixel.to.life

    #2
    Re: Calling unmanaged code from managed MFC worker thread

    On Aug 1, 12:34 pm, "Klaus" <Kl...@nowhere. invalidwrote:
    Hi,
    >
    I have an existing VC 6 MFC application which communicates asynchronly with
    a VC 2005 managed code dll.
    I use an unmanaged base class with virtual functions to access methods in
    the MFC application.
    Furthermore, I use a pointer to an unmanaged function to jump back into the
    managed dll.
    >
    The managed part is basically a remoting enhancement which asynchronly
    initiates a call from the remoting thread to the MFC application. The
    information is collected within the main thread of the MFC application. The
    managed code dll is invoked via a function pointer. From the managed code
    additional calls to the unmanaged MFC application will be done via a pointer
    to an object in the MFC. When this code is executed within the main thread
    of the MFC application everything works fine.
    >
    However, if I switch to a MFC worker thread, calls via the base class
    pointer results in System.AccessVi olationExceptio n!
    >
    Scenario, which works:
    1. Remoting thread imvoked
    2. Managed DLL -MFC App asynchron, no result
    3. Switch thread to App main thread
    4. MFC App -Managed DLL
    5. Managed DLL -MFC App (synchron)
    >
    Scenario, which does not work:
    1. Remoting thread imvoked
    2. Managed DLL -MFC App (asynchron, no result)
    3. Switch thread to MFC worker thread!!!
    4. MFC App -Managed DLL
    5. Managed DLL -MFC App (synchron): System.AccessVi olationExceptio n !!
    >
    How can I access pointer to unmanaged classes from managed code within a
    worker thread?
    >
    Best regards,
    Klaus

    Hi, Klaus,

    I assume you are already using delegates, and marshaling of delegate
    method pointers to access unmanaged functions from managed code,
    correct?

    http://msdn2.microsoft.com/en-us/library/bfeyhsdy.aspx




    Comment

    • Klaus

      #3
      Re: Calling unmanaged code from managed MFC worker thread

      Thanks for your help!

      Here is the code:
      myHeader.h, shared in both projects, MFC 6.0 App and VC 2005 DLL:
      class CMyBase
      {
      public:
      CMyBase() {};
      virtual ~CMyBase() {};
      virtual bool MyExample() = 0;
      };

      In MFC App this class will be derived:
      class CMyBaseDerived : public CMyBase
      {
      public:
      CMyBaseDerived( );
      virtual ~CMyBaseDerived ();
      virtual bool MyExample();
      };

      In VC2005, I have a pointer to the instance of CMyBaseDerived:
      CMyBase *PMyBase;
      This pointer will be initialized by calling a function in the DLL from the
      App:
      void MyInit(CMyBase *p)
      {
      PMyBase = p;
      }

      When I use this pointer in the DLL from the MFC worker thread an
      AccessViolation Exception will be thrown:
      PMyBase->MyExample();

      Using this pointer within the main thread no problem occurs.

      Best regards,
      Klaus


      "Pixel.to.l ife" <pixel.to.life@ gmail.comwrote in message
      news:1186000054 .219137.299310@ i38g2000prf.goo glegroups.com.. .
      On Aug 1, 12:34 pm, "Klaus" <Kl...@nowhere. invalidwrote:
      >Hi,
      >>
      >I have an existing VC 6 MFC application which communicates asynchronly
      >with
      >a VC 2005 managed code dll.
      >I use an unmanaged base class with virtual functions to access methods in
      >the MFC application.
      >Furthermore, I use a pointer to an unmanaged function to jump back into
      >the
      >managed dll.
      >>
      >The managed part is basically a remoting enhancement which asynchronly
      >initiates a call from the remoting thread to the MFC application. The
      >information is collected within the main thread of the MFC application.
      >The
      >managed code dll is invoked via a function pointer. From the managed code
      >additional calls to the unmanaged MFC application will be done via a
      >pointer
      >to an object in the MFC. When this code is executed within the main
      >thread
      >of the MFC application everything works fine.
      >>
      >However, if I switch to a MFC worker thread, calls via the base class
      >pointer results in System.AccessVi olationExceptio n!
      >>
      >Scenario, which works:
      >1. Remoting thread imvoked
      >2. Managed DLL -MFC App asynchron, no result
      >3. Switch thread to App main thread
      >4. MFC App -Managed DLL
      >5. Managed DLL -MFC App (synchron)
      >>
      >Scenario, which does not work:
      >1. Remoting thread imvoked
      >2. Managed DLL -MFC App (asynchron, no result)
      >3. Switch thread to MFC worker thread!!!
      >4. MFC App -Managed DLL
      >5. Managed DLL -MFC App (synchron): System.AccessVi olationExceptio n !!
      >>
      >How can I access pointer to unmanaged classes from managed code within a
      >worker thread?
      >>
      >Best regards,
      >Klaus
      >
      >
      Hi, Klaus,
      >
      I assume you are already using delegates, and marshaling of delegate
      method pointers to access unmanaged functions from managed code,
      correct?
      >
      http://msdn2.microsoft.com/en-us/library/bfeyhsdy.aspx
      >
      >
      >
      >

      Comment

      • Pixel.to.life

        #4
        Re: Calling unmanaged code from managed MFC worker thread

        On Aug 2, 2:14 am, "Klaus" <Kl...@nowhere. invalidwrote:
        Thanks for your help!
        >
        Here is the code:
        myHeader.h, shared in both projects, MFC 6.0 App and VC 2005 DLL:
        class CMyBase
        {
        public:
        CMyBase() {};
        virtual ~CMyBase() {};
        virtual bool MyExample() = 0;
        >
        };
        >
        In MFC App this class will be derived:
        class CMyBaseDerived : public CMyBase
        {
        public:
        CMyBaseDerived( );
        virtual ~CMyBaseDerived ();
        virtual bool MyExample();
        >
        };
        >
        In VC2005, I have a pointer to the instance of CMyBaseDerived:
        CMyBase *PMyBase;
        This pointer will be initialized by calling a function in the DLL from the
        App:
        void MyInit(CMyBase *p)
        {
        PMyBase = p;
        >
        }
        >
        When I use this pointer in the DLL from the MFC worker thread an
        AccessViolation Exception will be thrown:
        PMyBase->MyExample();
        >
        Using this pointer within the main thread no problem occurs.
        >
        Best regards,
        Klaus
        >
        "Pixel.to.l ife" <pixel.to.l...@ gmail.comwrote in message
        >
        news:1186000054 .219137.299310@ i38g2000prf.goo glegroups.com.. .
        >
        >
        >
        On Aug 1, 12:34 pm, "Klaus" <Kl...@nowhere. invalidwrote:
        Hi,
        >
        I have an existing VC 6 MFC application which communicates asynchronly
        with
        a VC 2005 managed code dll.
        I use an unmanaged base class with virtual functions to access methods in
        the MFC application.
        Furthermore, I use a pointer to an unmanaged function to jump back into
        the
        managed dll.
        >
        The managed part is basically a remoting enhancement which asynchronly
        initiates a call from the remoting thread to the MFC application. The
        information is collected within the main thread of the MFC application.
        The
        managed code dll is invoked via a function pointer. From the managed code
        additional calls to the unmanaged MFC application will be done via a
        pointer
        to an object in the MFC. When this code is executed within the main
        thread
        of the MFC application everything works fine.
        >
        However, if I switch to a MFC worker thread, calls via the base class
        pointer results in System.AccessVi olationExceptio n!
        >
        Scenario, which works:
        1. Remoting thread imvoked
        2. Managed DLL -MFC App asynchron, no result
        3. Switch thread to App main thread
        4. MFC App -Managed DLL
        5. Managed DLL -MFC App (synchron)
        >
        Scenario, which does not work:
        1. Remoting thread imvoked
        2. Managed DLL -MFC App (asynchron, no result)
        3. Switch thread to MFC worker thread!!!
        4. MFC App -Managed DLL
        5. Managed DLL -MFC App (synchron): System.AccessVi olationExceptio n !!
        >
        How can I access pointer to unmanaged classes from managed code within a
        worker thread?
        >
        Best regards,
        Klaus
        >
        Hi, Klaus,
        >
        I assume you are already using delegates, and marshaling of delegate
        method pointers to access unmanaged functions from managed code,
        correct?
        >>
        - Show quoted text -

        Klaus,

        First of all, it doesnt not seem like your MFC app is a managed
        aplpication. Do you compile it with /clr command line option?
        If you are using only MFC, why do you need to build a managed
        application?

        Secondly, do you have the method MyExample() overridden in
        CMyBaseDerived?

        Thirdly, assuming you have MyExample() overridden in CMyBaseDerived,
        dont you have to cast PMyBase to a pointer to the derived object?
        Virtual method references are resolved at run time, so unless the
        machine knows the object is of derived type, it would look for the
        method's definition ion the base class (

        ).. and if you dont have an implementation of MyExample() in the base
        class, you will get an access violation.. no matter in managed/
        unmanaged code.

        Pardon me if I missed something.

        Comment

        Working...