PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#: Wie bool* and cpp code weitergeben?


Elemental
2006-04-07, 10:32:27
Hallo,
ich sitz gerade wieder vor nem kleinen Problem.

Ich habe eine Methode in c++, z.B.

bool myClass::DoSomething(bool* pbParameter)
{
//...
}


Wie rufe ich diese Methode aus meinem C# code auf, bzw. wie muss ich die Methode ändern?

Mein erster Versuch war so:

bool bParam=false;

myClassInstance.DoSomething(ref bParam);



Aber da krieg ich nur "cannot convert from ref bool to bool*".
Wie macht man sowas richtig?


Gruss
Bernd

Demirug
2006-04-07, 10:39:24
Benutzt du C++/CLR, managed C++ oder COM?

Elemental
2006-04-07, 10:45:45
Also auf jedenfall nicht COM.
Das ist hier einfach ein C++ Projekt in der Solution voller C# Projekte. Woran seh ich, ob es managed C++ is?

Sorry, das ich so doof frage, aber hab mit C++ unter .NET null Erfahrung...


konkret geht es um folgende Methode:

bool Line::LoadRecipeAndCallIntegrityCheckBeforePrepareData2(
ProcessingOptions processingOptions,
IntegrityCheckMode integrityCheckMode,
IntegrityCheckModeForRepartitioning integrityCheckModeForRepartitioning,
// parameters for left conveyor
String* strRecipeLeft,
IntegrityCheckResult& integrityCheckResultLeft,
// parameters for right conveyor
String* strRecipeRight,
IntegrityCheckResult& integrityCheckResultRight,
// general out parameters
MessageEventArgs& messages)


die bisher so aufgerufen wurde:

bool bRetIcOK = m_NativeLineWrapper.LoadRecipeAndCallIntegrityCheckBeforePrepareData2(
processingOptions,
integrityCheckMode,
integrityCheckModeForRepartitioning,
//left conveyor
recipeIdLeft.FullPath,
ref integrityCheckResultLeft,
//right conveyor
recipeIdRight.FullPath,
ref integrityCheckResultRight,
//general out params
args
);



Da muss ich jetzt eben noch ein paar bools mit zurück geben...

Gruss
Bernd

Demirug
2006-04-07, 11:16:07
Am Syntax im Header kann man das sehen. Es gibt da bestimmte Schlüsselwörter.

Aber in Abhängigkeit des Compilers kann man das dann vielleicht auch schon eingrenzen.

Der 2003er kann nämlich nur managed C++ und kein C++/CLR.

Elemental
2006-04-07, 11:17:47
OK, es war eine Solution vom 2003er, die vor kurzem fürs 2005er konvertiert wurde. Also sollte es schon managed C++ ein :)

Kann mir nun jemand bei meinem eigentlichen Problem helfen? Ich häng da grad echt fest...

Demirug
2006-04-07, 13:00:07
Bei C++/CLR könnte ich es dir sofort sagen aber managed C++ ist schon eine Weile her.

IIRC muss es so aussehen:


void Foo([PARAMFLAG::Out] bool *b)
{
*b = true;
}


Alternative kannst du auch eine Reference benutzen aber dann muss du die Variablen vor dem aufruf auch zuweißen.


void Foo(bool& b)
{
b = true;
}

Elemental
2006-04-07, 13:16:19
Also ich hab das jetzt mit Referenzen probiert, aber da kommt immernoch "cannot convert ref bool to bool*" :(

Das mit [PARAMFLAG::Out] geht garnicht:
error C2337: 'Out' : attribute not found


:(

MeLLe
2006-04-07, 13:26:18
bool Line::LoadRecipeAndCallIntegrityCheckBeforePrepareData2(
ProcessingOptions processingOptions,
IntegrityCheckMode integrityCheckMode,
IntegrityCheckModeForRepartitioning integrityCheckModeForRepartitioning,
// parameters for left conveyor
String* strRecipeLeft,
IntegrityCheckResult& integrityCheckResultLeft,
// parameters for right conveyor
String* strRecipeRight,
IntegrityCheckResult& integrityCheckResultRight,
// general out parameters
MessageEventArgs& messages)
OT: Kannst du vielleicht nen kleinen Tip geben, worum es in deinem Projekt geht? Die markierten Schlüsselbegriffe spielen auch in meinem beruflichen Umfeld eine Rolle ... ;)

Elemental
2006-04-07, 13:31:30
OT: Kannst du vielleicht nen kleinen Tip geben, worum es in deinem Projekt geht? Die markierten Schlüsselbegriffe spielen auch in meinem beruflichen Umfeld eine Rolle ... ;)

www.siplace.com ;)

Demirug
2006-04-07, 14:08:07
Oh mann ich hatte gar nicht mehr in erinnerung wie dämlich der managed C++ Compiler ist. Das C++ bool wird nicht automatisch in das .Net bool übersetzt deswegen muss man den .Net Type Boolean nehmen.

void Foo([Out] Boolean *val)

Nicht vergessen den passenden Namespace für das [Out] einzubinden

using namespace System::Runtime::InteropServices;

Elemental
2006-04-07, 15:21:33
Hmm, funktioniert das nur mit einem Parameter?

Ich hab gerade folgendes gebaut:

bool Line::LoadRecipeAndCallIntegrityCheckBeforePrepareData2(
ProcessingOptions processingOptions,
IntegrityCheckMode integrityCheckMode,
IntegrityCheckModeForRepartitioning integrityCheckModeForRepartitioning,
// parameters for left conveyor
String* strRecipeLeft,
IntegrityCheckResult& integrityCheckResultLeft,
[out] Boolean* pbPlacementPositionsRepartitionedLeft,
// parameters for right conveyor
String* strRecipeRight,
IntegrityCheckResult& integrityCheckResultRight,
[out] Boolean* pbPlacementPositionsRepartitionedRight,
// general out parameters
[out] Boolean* pbSetupChanged,
MessageEventArgs& messages)


Bringt mir beim kompilieren hunderte errors *g*


error C3095: 'System::Runtime::InteropServices::OutAttribute': attribute cannot be repeated
error C3763: 'Siemens::SiplacePro::LineControl::Api::ProcessingOptions': 'retval' and 'out' can only appear on a data-pointer type
error C3763: 'Siemens::SiplacePro::LineControl::Api::IntegrityCheckMode': 'retval' and 'out' can only appear on a data-pointer type

usw.

Komischerweise kommt diese error C3763 bei lauter Parametern, wo überhaupt kein out oder retval davor steht...


Gruss
Bernd

Demirug
2006-04-07, 15:51:51
Out mit großem 'O' und nicht mit einem kleinen 'o'.

Elemental
2006-04-07, 16:24:14
Oh, ups, na klar :rolleyes:

Vielen Dank! Funktioniert!

Merci beaucoup! :)

MeLLe
2006-04-07, 20:40:52
www.siplace.com ;)
Coole Sache. Dann sagt dir sicher Prox4/WMS/MFC auch was =)

Elemental
2006-04-09, 15:20:48
Coole Sache. Dann sagt dir sicher Prox4/WMS/MFC auch was =)

Nicht wirklich. Muss man die kennen? Bin erst seit 4 Jahren in dem Job ;D

MeLLe
2006-04-09, 16:50:54
Nicht wirklich. Muss man die kennen? Bin erst seit 4 Jahren in dem Job ;D
Wosi net, dachts mir nur.
Prox4 ist die früher Siemens'sche, jetzt unter dem Dach der Dematic betreute, Logistiklösung zur Materialflusssteuerung und Lagerverwaltung für palettierte Ware.
Unser Hochregal und die gesamte Produktion sowie Versand und Wareneingang werden bei uns damit ver- und entsorgt sowie gesteuert. Und wir haben das System zur Beetreuung "an der Backe" ;)