Daten aus unmanged Code an System.Windows.Forms.Textbox senden



  • Aus meiner Sicht ist die Vorgehensweise die falsche...
    Du solltes in Deiner Unmanaged-Klasse eine "Callback" oder eine "virtual Method" aufnehmen, die aufgerufen wird, wenn der Text gesetzt werden soll. Dann kannst Du in Managed C++ auf diese Callback reagieren und den Text in der Textbox ganz normal mit textBox->set_Text(...) setzen....



  • Hallo Jochen

    Vielen Dank für die kritische Würdigung und den Lösungsweg. Ich werde mal nach einem tutorial bzgl. Callback routinen recherchieren und hoffe fündig zu werden.

    Vielen Dank nochmals und beste Grüsse!!!
    Geri



  • Falls Du Klassen verwendest kannst Du ja einfach eine virtual Methode machen und diese dann aufrufen. Und in managed C++ diese Klasse ableiten:

    class MyUnmanagedClass
    {
    protected:
      virtual void OnChangeText(LPCTSTR szText)
      {
        // hier muss spaeter der Text gesetzt werden
      }
    
      void IrgendeineMethode()
      {
        // Loese das "Ereignis" nach irgendwelchen Kriteieran aus...
        OnChangeText(_T("Irgend ein Text"));
      }
    };
    
    class MyDerivedClass : public MyUnmanagedClass
    {
    public:
      MyDerivedClass(TextBox *textBox)
      {
        m_textBox = textBox;
      }
    protected:
      virtual void OnChangeText(LPCTSTR szText)
      {
        // setze jetzt den Text in der textBox
        m_textBox->set_Text(new String(szText));
      }
      gcroot<TextBox*> m_textBox;
    };
    


  • Hallo Jochen

    Super, vielen Dank für den Lösungsansatz!!

    Dieser Weg dünkt mich fast schöner, als die Verwendung des Callback Mechanismus.

    Werde mich dann gleich melden, wie es klappt.

    Da ich hier im Forum scheinbar auf einen Profi gestossen bin möchte ich die Gunst der Stunde gleich nutzen und dich fragen ob du bitte vielleicht auch für dieses Problem eine Lösung hast. Seit Tage plagt es mich und ich komme mit meinem Programm nicht weiter

    Ich habe ein Problem mit meinem Programm, welches ich mit VS2003 compiliere.

    ich habe folgende zwei Klassen:

    class CSocketComm
    {
    
       ...
       void CSocketComm::Run()
       virtual void OnDataReceived(const LPBYTE lpBuffer, DWORD dwCount);
    }
    
    class CSocketManager : public CSocketComm  
    {
    public:
        CSocketManager();
        virtual ~CSocketManager();
        virtual void OnDataReceived(const LPBYTE lpBuffer, DWORD dwCount);
    }
    
    CSocketManager mySocket;
    

    Die Methode Run wird erfolgreich ausgeführt und wenn Daten empfangen werden darin OnDataReceived aufgerufen. Die empfangenen Zeichen stehen auch tatsächlich in einem Puffer (geprüft mit dem Debugger).

    Das Programm stürzt aber mit der Fehlermeldung:
    "There is no source code available for the current location" 😕 😕

    OnDataReceived habe ich im Socket-Manager aber implementiert. Falls ich das Objektorientierte Konzept richtig verstanden habe, dann müsse OnDataReceived von mySocket doch aufgerufen werden??

    Nun ist mir noch aufgefallen, dass wenn ich eine Variable der Klasse CSocketManager anlege (z.B. SockTest) und SockTest->OnDataReceived(myBuf,myLen) aufrufe, dann erhalte ich auch den Fehler: "There is no source code available for the current location" 😕 😕
    .

    http://www.burger-web.com/Downloads/CPlusPlus/SocketTest2.zip

    Freundliche Grüsse und vielen Dank nochmals

    Geri

    PS: Ach ja: Ich teste das Programm indem ich mit Hyperterminal eine Verbihndung zum Programm aufbaue. (IP: 127.0.0.1, PORT 2000).
    Ablauf:
    1. VC-Programm starten
    2. Den Button Start Socket drücken
    3. Eine Verbindung mit dem Hyperterminal aufbau und einen Taste drücke (Buchsabe reintippe)



  • Hallo

    Irgenwie schmeckt dem Compiler das
    die Anweisung

    gcroot<TextBox*> m_textBox;
    

    Nicht. Habe ich da etwas falsch verstanden?

    Beste Grüsse
    Geri



  • Was soll denn da nicht gehen? Bei mir geht alles...
    Die Meldung "There is no source code available for the current location" deutet nur darauf hin, dass für diese Zeile keine Debug-Infos zur Verfügung stehen... mach einfach mal ein Rebuild-All...



  • Geri schrieb:

    Irgenwie schmeckt dem Compiler das
    die Anweisung

    gcroot<TextBox*> m_textBox;
    

    Nicht. Habe ich da etwas falsch verstanden?

    Du musst natürlich noch ein

    #include <vcclr.h>
    

    machen und wenn Du keine "using namespace" gemacht hast, musst Du folgendes Verwenden:

    gcroot<System::Windows::Forms::TextBox*> m_textBox;
    


  • Hallo Jochen

    Das habe ich bereits mehrmals gemacht. Das komische ist auch, wenn ich einen Breakpoint in onDataReceived platziere, dann springt der Debugger manchmal hinein und manchmal nicht.

    Beste Grüsse
    Geri



  • Ich kann mir nicht vorstellen, das es am debugger liegt... ich vermute eher mal, dass der Aufruf nicht gemacht wird, wenn er nicht da rein springt...



  • Hallo Jochen

    Ich habe nun bemerkt. Der Aufruf wird gemacht. Ich habe nämlich das das Exe-File im Debug-Verzeichnis aufgerufen und das Programm funktioniert einwandrei:):):) Dank Deiner Hilfe!!!
    Nur der Debugger springt nicht rein. 😕

    Beste Grüsse
    Geri



  • Hallo Jochen

    Ich möchte dir hiermit nochmals herzlichen Dank für die ausführliche und kompetente Hilfe sagen!!! 👍 👍 👍 Ich habe hier wieder viele interessante Dinge gelernt!!!

    Das Debug-Problem habe ich zwar noch nicht gelöst, meine Anwendung macht nun aber genau das was ich will und vielleicht komme ich irgendwann auch noch drauf.

    Ich hoffe, ich kann die Hilfe hier oder in einm anderen Forum einem anderen Benutzer retour geben.

    Beste Grüsse
    Geri



  • Kein Problem... deswegen ist ja so ein Forum da...

    Bzgl. des Debuggen: Du könntest in den Projekteinstellungen unter "Debugger|Typ" mal "Both" anstelle von "Auto" verwenden. Vielleicht geht es dann..



  • Hallo Jochen

    Auch wenn es das Wesen eines Forums ist, ein grosses Lob kann man schon austeilen, hat mir wirklich sehr weiter geholfen. Toll fand ich vor allem die detaillierte und nachvollziehbare Darstellung des Lösungsweges. Das nicht immer der Fall.

    Den Debugger habe ich nun mal auf mixed gestellt.

    Ich arbeite mit VS 7.1.3088, Net-Framework-Version 1.1.4322 SP1

    Nachdem bei dir das Debuggen erfolgreich durchgeführt werden konnte, nehme ich langsam an, es liegt an der Entwicklungsumgebung oder den Projekteinstellungen.

    Freundliche Grüsse
    Geri



  • Hallo zusammen

    Ich habe jetzt probiert das Problem zu lösen, indem ich ein neues Projekt angelegt habe. 😕 😕 Es hat allerdings nichts genutzt

    Beste Grüsse
    Geri



  • Du musst einfach in der CPP-Datei ein

    #include "stdafx.h"
    

    ganz oben machen (vor allen anderen includes).
    Falls Du keine Precompiled-Header aktivierst hast, musst Du es halt machen... (oder Du fragst den LIB-Hersteller, warum er dies so macht...)



  • Hallo Jochen

    Jetzt bis du mir gerade zuvor gekommen. 🙂 Habe den Beitrag gerade geändert:)
    Entschuldige bitte die Umstände. Das Problem lag an einer Datei, die ich wieder aus versehen mit eingebunden hatte, die aber nicht notwendig war.

    Wie beschrieben, am Debug-Problem hat sich trotz dem neuen Projekt nichts geändert.

    Beste Grüsse
    Geri



  • Hallo zusammen

    Kann es vielleicht daran liegen, dass der Breakpoint innerhalb einer erzeugten gesetzt ist (es handelt sich um die Thread der SocketComm-Klasse)?

    Wenn ich eine Routine der SocketComm-Klasse direkt aufrufe, dann kann ich in den Code hinein steppen. 😕 😕

    Beste Grüsse
    Geri



  • Geri schrieb:

    Kann es vielleicht daran liegen, dass der Breakpoint innerhalb einer erzeugten gesetzt ist

    Einer erzeugten "was"???



  • Sorry, innerhalb einer erzeugten Thread. Diese Thread ist für das Empfangen und Senden von Daten über Winsock verantwortlich. u.a. ruft sie auch dei Methode OnDataReceived auf.

    Wenn ich eine Routine der SocketComm-Klasse direkt z.B. über ein Button-Event aufrufe, dann kann ich schön hinein steppen.

    Beste Grüsse
    Geri



  • Dem Debugger dürfte es nichts ausmachen, in welchem Thread eine Methode aufgerufen wird... wie gesagt, bei mir geht es ja auch... seltsam...


Anmelden zum Antworten