none
Problem mit dll Variablen RRS feed

  • Frage

  • Ich muss eine Bibliothek zuweisen Dlubal::RSTAB6.

    Der Verweis funktioniert aber die Definition von Variablen nicht. Z.B. bei IStructure

    Mittwoch, 31. Oktober 2012 08:31

Antworten

  • In Sprachen wie Java oder was sonst noch so genutzt wird, schreibt man z.B.

    MyClass obj = (MyClass)eineFunktion(12);

    das liegt daran, dass diese Sprachen das Konzept des "Zeiger" nicht kennen.

    In C++ und C++/CLI wird das Objekt aber von einem Zeiger unterschieden. Daher muss man angeben was man meint.

    In C++ wäre das

    MyClass* obj = (MyClass*)eineFunktion(12);

    und in C++/CLI

    MyClass^ obj = (MyClass^)eineFunktion(12);

    * = Zeiger, ^ = verwalteter Zeiger

    In deinem Fall hiesse es also

    IrsStructure^ IStructure = (IrsStructure^)Marshal::GetActiveObject("RSTAB6::Structure");

    und zwar, weil du a) kein Objekt auf dem Stack bauen kannst (daher ist IStructure vom Typ IrsStructure^ und nicht IrsStructure) und b) weil Marshal::GetActiveObject ein "Object^" und kein "Object" zurückgibt und sich ein Objekt nicht in seinen Zeiger casten läst.

    Wenn du wirklich C++ oder auch C++/CLI nutzen willst, musst du dich unbedingt mit den Zeigern vertraut machen. Ohne geht das gar nicht. Ein Zeiger ist übrigens die Adresse der Speicherstelle, an welcher das Objekt gespeichert ist... ah und -> den Unterschied zwischen Stack und Heap solltest du dir auch gleich noch anschauen. Ist alles sehr wichtig!

    Rudolf

    Mittwoch, 31. Oktober 2012 18:52

Alle Antworten

  • Ich arbeite mit Zwei Bildschirme und das Formular war auf der Luft.
    Jetzt habe ich die Bildschirme richtig eingestellt und ich kan alles anschauen.
    Danke.

     


    Ich muss eine Bibliothek zuweisen Dlubal::RSTAB6.

    Der Verweis funktioniert aber die Definition von Variablen nicht. Z.B. bei IStructure

    using namespace Dlubal::RSTAB6; // Das funktioniert
    rstab::rstab(void)
    {
    IrsStructure IStructure = Marshal::GetActiveObject("RSTAB6.Structure") = IrsStructure; // Das funktioniert nicht
    }

    Die Fehlermeldungen:
    1 rstab.cpp(8): error C3149: "Dlubal::RSTAB6::IrsStructure": Dieser Typ kann ohne "^" der obersten Ebene hier nicht verwendet werden.
    1 rstab.cpp(8): error C2275: 'Dlubal::RSTAB6::IrsStructure': Ungültige Verwendung dieses Typs als Ausdruck
    Wie sollte eingentlich IStructure definieren?

     

     

    Mittwoch, 31. Oktober 2012 08:32
  • Ich versteh dich zwar irgendwie nicht, aber dennoch:

    IrsStructure IStructure = Marshal::GetActiveObject("RSTAB6.Structure") = IrsStructure;

    Was soll das " = IrsStructure" am Ende?

    Zudem, DLL oder Assembly? das ^ im Fehler lässt mich irgendwie auf C++/CLI schliessen?

    Mittwoch, 31. Oktober 2012 10:19
  • Die selbe Bibliothek unter C# funktioniert so:

    using rscom = Dlubal.RSTAB6;
    . . . .
    rscom.IrsStructure IStructure = Marshal.GetActiveObject("RSTAB6.Structure") as rscom.IrsStructure;

    Aber die Schreibweise für C++ kenne ich nicht.

    Mittwoch, 31. Oktober 2012 12:18
  • Für C++/CLI, C# Probleme gibt es ein eigenes Forum:
    http://social.msdn.microsoft.com/Forums/de-DE/visualcclide/threads

    Das "as" ist ja eigentlich nur ein anderes Casting, sowas komisches gibts im C++ nicht, also einfach "normal" mit () Casten: "IrsStructure IStructure = (IrsStructure )Marshal::GetActiveObject("RSTAB6.Structure")", falls überhaupt notwendig (davon abgesehen, dass ich pointer nun mal einfach ignoriert habe). Wie du auf das zweite "=" hinten gekommen bist ist mir ein Rätsel :)
    Allerdings scheinst du ja eh CLI zu nutzen, und nicht C++. Da ist alles nochmals ein bisschen anders...

    Mittwoch, 31. Oktober 2012 12:58
  • (Ich arbeite unter Microsoft Visual C++ 2010 Express)

    Jetzt habe ich das probiert:

    #include "StdAfx.h"
    #include "rstab.h"
    using namespace System::Runtime::InteropServices;
    using namespace Dlubal::RSTAB6;

    rstab::rstab(void)
    {
     IrsStructure IStructure = (IrsStructure)Marshal::GetActiveObject("RSTAB6::Structure");
    }

    Aber ich bekommen immer noch die Fehlermeldung:

    1>rstab.cpp(8): error C3149: "Dlubal::RSTAB6::IrsStructure": Dieser Typ kann ohne "^" der obersten Ebene hier nicht verwendet werden.

    1>rstab.cpp(8): error C3149: "Dlubal::RSTAB6::IrsStructure": Dieser Typ kann ohne "^" der obersten Ebene hier nicht verwendet werden.

    Mittwoch, 31. Oktober 2012 13:09
  • Wie gesagt wirst du dich da wohl mit C++/CLI auseinandersetzen müssen.

    Das "^" ist ein Pointer in CLI. Also IrsStructure^ IStructure = ...

    Aber bei CLI kenn ich mich 1. auch nicht wirklich aus, und 2. grenzt mit deinen Angaben alles an Rätselraten.

    Mittwoch, 31. Oktober 2012 13:47
  • In Sprachen wie Java oder was sonst noch so genutzt wird, schreibt man z.B.

    MyClass obj = (MyClass)eineFunktion(12);

    das liegt daran, dass diese Sprachen das Konzept des "Zeiger" nicht kennen.

    In C++ und C++/CLI wird das Objekt aber von einem Zeiger unterschieden. Daher muss man angeben was man meint.

    In C++ wäre das

    MyClass* obj = (MyClass*)eineFunktion(12);

    und in C++/CLI

    MyClass^ obj = (MyClass^)eineFunktion(12);

    * = Zeiger, ^ = verwalteter Zeiger

    In deinem Fall hiesse es also

    IrsStructure^ IStructure = (IrsStructure^)Marshal::GetActiveObject("RSTAB6::Structure");

    und zwar, weil du a) kein Objekt auf dem Stack bauen kannst (daher ist IStructure vom Typ IrsStructure^ und nicht IrsStructure) und b) weil Marshal::GetActiveObject ein "Object^" und kein "Object" zurückgibt und sich ein Objekt nicht in seinen Zeiger casten läst.

    Wenn du wirklich C++ oder auch C++/CLI nutzen willst, musst du dich unbedingt mit den Zeigern vertraut machen. Ohne geht das gar nicht. Ein Zeiger ist übrigens die Adresse der Speicherstelle, an welcher das Objekt gespeichert ist... ah und -> den Unterschied zwischen Stack und Heap solltest du dir auch gleich noch anschauen. Ist alles sehr wichtig!

    Rudolf

    Mittwoch, 31. Oktober 2012 18:52
  • Es hast so funktioniert

    IrsStructure ^IStructure = (IrsStructure^)Marshal::GetActiveObject("RSTAB6.Structure");

    Ich habe nicht gewusst, dass Visual C++ 2010 Express mit C++/CLI arbeitet.

    Die letzte Erklärung ist mir sehr hilfreich.

    Danke.

    Donnerstag, 1. November 2012 06:56
  • Das tut es nur, wenn Du es ihm sagst.

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Donnerstag, 1. November 2012 07:13
    Moderator
  • Verwende bitte C#! Es macht keinen Sinn, dass Du das ganze in C++/CLI machst....
    http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/


    Jochen Kalmbach (MVP VC++)
    Donnerstag, 1. November 2012 09:57