Benutzer mit den meisten Antworten
Problem mit dll Variablen

Frage
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
- Als Antwort markiert Ionut DumaModerator Donnerstag, 1. November 2012 15:55
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? -
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?
-
Für C++/CLI, C# Probleme gibt es ein eigenes Forum:
http://social.msdn.microsoft.com/Forums/de-DE/visualcclide/threadsDas "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... -
(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.
-
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.
-
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
- Als Antwort markiert Ionut DumaModerator Donnerstag, 1. November 2012 15:55
-
-
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++)