Announcement

Collapse
No announcement yet.

C# greift auf Visual C++ .dll zu und macht kryptische Zeichen

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

  • C# greift auf Visual C++ .dll zu und macht kryptische Zeichen

    Hallo Community,
    ich habe in Visual C++ eine .dll in Multi-Byte kompiliert, die den Zugriff auf das WinCC TagLogging ermöglicht.

    In C# greifen wir auf diese .dll zu und bekommen bei der Umwandlung zu einem WORD oder LBCTSTR kryptische Zeichen (siehe Screenshot, Name dataRaw.stTime)

    Infos:
    - .dll ist in Visual C++ erstellt und als Multi-Byte kompiliert
    - Die C# Anwendung ist eine ganz normale Windows Form

    Struktur von TLG_ARCHIVDATARAW
    Code:
     typedef struct {
    
            SYSTEMTIME    stTime;
    
            double        doValue;
    
            DWORD         dwFlags;
    
            } 
    
            TLG_ARCHIVDATARAW;
    Struktur von SYSTEMTIME
    Code:
    typedef struct _SYSTEMTIME {
       WORD wYear;
       WORD wMonth;
       WORD wDayOfWeek;
       WORD wDay;
       WORD wHour;
       WORD wMinute;
       WORD wSecond;
       WORD wMilliseconds;
    } SYSTEMTIME;
    Attached Files

  • #2
    Wie hast du den Interop gelöst? PInvoke, COM oder managed C++ (C++/CLI)? Vielleicht den entsprechenden Code dazu zeigen. Der hilft vermutlich mehr als der Code im Screenshot. Sollte es PInvoke sein hilft vielleicht die (.Net-seitige) Defintion von z.B. dem Systemtime struct auf PInvoke.Net.

    Comment


    • #3
      Vorweg ich habe C# gelernt und habe von Visual C++ eigentlich keine Ahnung habe aber mit würgen es hinbekommen, dass es so halb funktioniert :/

      Das Invoke brauche dafür

      .h Datei
      Code:
      public: bool TlgConnect([In]void* hwndfrm,[In]String^err);
      .cpp Datei
      Code:
      bool WinCCODK_TLGInsert_CPP::CTLGInsertWrapper::TlgConnect(void *hwndfrm, System::String ^err)
      {
      	bool finished = false;
      	CMN_ERROR error;
      	ZeroMemory(&error,sizeof(error));
      	HWND pHandle = (HWND)hwndfrm;
      	if(TLGConnect(pHandle,&error))
      	{
      		finished = true;
      		return finished;
      	}
      	else
      	{
      	finished = false;
      	return finished;
      	}
      Hier ist noch der Aufruf von C# aus
      Code:
       unsafe
                  {
                      IntPtr HWND = this.Handle;
      
                      if (obj.TlgConnect(HWND.ToPointer(), "test"))
                      {
                          MessageBox.Show("verbunden");
                      }
                      else
                      {
                          MessageBox.Show("fehler");
                      }
      }
      Zuletzt editiert von Crynon; 10.12.2010, 11:48. Reason: C# hinzugefügt

      Comment


      • #4
        Das war jetzt nicht ganze die Antwort auf meine Frage aber da du in der Methoden Signatur einen .Net Typ benutzt wird dein Code in C++/CLI geschrieben sein.

        Aber dein Problem ist mit deinen Code Bruchstücken immer noch nicht nachzuvollziehen. Das einzige was ich da jetzt rausraten kann ist das du versuchst einen struct ( ich vermute dein dataRaw.stTime ist ein SYSTEMTIME) in einen String(LBCTSTR ) oder Integer(Word) zu casten was sich nach Unsinn anhört.

        Comment


        • #5
          Das ist der Code der den Fehler verursacht. (siehe Screenshot von oben)

          Füge ich diesen Code in ein Button in eine MFC - Anwendung habe ich diese Fehler nicht nur wenn ich von C# auf die .dll zugreifen will.

          Die Methode GetLocalTime fügt die Zeit ja in das dataRaw.stTime ein und da passieren schon die Fehler.
          Selbst wenn man versucht ein WORD zu deklarieren und mit einem Wert zu instanzieren kommen die kryptischen Fehler.

          Das ganze ist aber auch direkt jetzt bei Siemens.
          Trotzdem danke für die Bemühungen

          Code:
          SYSTEMTIME st;
          	GetSystemTime(&st);
          	TLG_ARCHIVDATARAW dataRaw;
          	
          	ZeroMemory(&dataRaw,sizeof(dataRaw));
          	GetLocalTime(&dataRaw.stTime);
          	dataRaw.doValue = dataRaw.stTime.wSecond;
          	dataRaw.dwFlags = 0; // 0x0200;
          	bool finished = false;
          	LPCTSTR lparchiv = (LPCSTR)StringConvA(archivname);
          	LPCTSTR lpvarname = (LPCSTR)StringConvA(varname);
          	CMN_ERROR error;
          	if(!TLGInsertArchivData(lparchiv,lpvarname,&dataRaw,1,0,&error))
          	{
          		 finished = false;
          	}
          	else
          	{
          		finished = true;
          	}
          		
          return finished;

          Comment

          Working...
          X