Laden...

Durchreichen von Referenzen nach C++ DLL über eine managed C++ Schicht

Erstellt von Almeida vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.077 Views
A
Almeida Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren
Durchreichen von Referenzen nach C++ DLL über eine managed C++ Schicht

Hallo zusammen,

ich bin gerade dabei mich in das Thema C++ DLLs in C# einzuarbeiten. Daher beinhaltet die folgende Frage auch einiges an C++.

Und zwar habe ich eine alte C++ DLL, deren Funktionen ich nicht ändern kann/darf. Um diese DLL habe ich eine managed C++ DLL gebastelt, die die selben Funktionen zur Verfügung stellt.

nun gibt es in der DLL leider Funktionen, die Referenzen auf Variablen erwarten um diese ändern zu können.

Nun habe ich in der ursprünglichen DLL eine Funktion

short getParameters( bool& isA, bool& isB, bool isC );

in der managed DLL sieht die Funktion, durch tracking Refrence, so aus:


short getParameters( bool% isA, bool% isB, bool% isC )
{
// call native DLL
return nativeDLL::getParameters( isA, isB, isC );
}

in C# dann den folgenden Aufruf:


short getParametersFromDLL( ref bool isA, ref bool isB, ref bool isC )
{
// call managed DLL
return managedDLL.getParameters( isA, isB, isC );
}

Leider funktioniert das ganze nicht wie erwartet. Ich erhalte in meinem managed Projekt den Error > Fehlermeldung:

C2664 cannot convert parameter from bool to bool &.

Hier stoße ich momentan aber an meine Grenzen. Ich dachte dies wäre kompatibel. Kann mir hier vielleicht einer von euch Profis auf den richtigen Weg helfen?

W
872 Beiträge seit 2005
vor 9 Jahren

Probier mal für die Managed DLL


short getParameters( bool^& isA, boo^& isB, bool^& isC )
{
// call native DLL
return nativeDLL::getParameters( isA, isB, isC );
}

S
248 Beiträge seit 2008
vor 9 Jahren

Hallo Almeida,

die Typen scheinen wohl nicht kompatibel zu sein.
Du kannst dies aber so lösen:


short getParameters(bool% isA, bool% isB, bool% isC)
{
	bool a = isA;
	bool b = isB;
	bool c = isC;
	short result = nativeDll::getParameters(a, b, c);
	isA = a;
	isB = b;
	isC = c;
	return result;
}

Edit:

Wenn du es in einer Zeile machen möchtest, kannst du die Kompatibilität auch erzwingen:

short getParameters(bool% isA, bool% isB, bool% isC)
{
	return ((short(_cdecl*)(bool%, bool%, bool%))&nativeDll::getParameters)(isA, isB, isC);
}

Dabei aber die korrekte Calling Convention der nativen Funktion verwenden.

Grüße
spooky

A
Almeida Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Guten Morgen zusammen,

sorry für die späte Antwort aber gestern wollte mein Kopf nicht mehr 😉

@weismat:
das funktioniert leider nicht. Hier gibt es dann den Fehler> Fehlermeldung:

C2664: cannot convert parameter 1 from 'System::Boolean ^' to 'bool &'b

@Spook:
Deine Lösung funktioniert bei mir leider auch nicht. Wenn ich es so mache, wie von dir angegeben bekomme ich ein> Fehlermeldung:

C2664: cannot convert parameter 1 from 'bool' to 'bool &'

Wenn ich den Aufruf zu

short result = nativeDll::getParameters( &a, &b, &c );

ändere wird darauß ein> Fehlermeldung:

C2664: cannot convert parameter 1 from 'cli::interior_ptr<Type>' to 'bool &'

Für weitere Ideen bin ich gern zu haben.. 😃

S
248 Beiträge seit 2008
vor 9 Jahren

Bei mir waren beide Funktionen im gleichen (C++/CLI) Projekt.
Ich konnte deinen Fehler nachstellen, und auch beide Lösungen haben funktioniert.

Kannst du mal deine Wrapper-Methode umbennen, so dass nicht beide den gleichen Namen haben. Vielleicht ist dies ein Teil des Problems.

Grüße

A
Almeida Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Umbenennen der Methode hat leider auch nicht geholfen.

In meiner Solution befindet sich ein CLI-Projekt (der Wrapper) und ein C#-Projekt. Der native DLL liegt mir als DLL, Lib und Header Dateien vor. Diese sind in das CLI-Projekt eingebunden.

Ich verzweifle noch an der Aufgabe.. aber danke für deine Tipps!

A
Almeida Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Kleines Update noch: Wenn ich den managed Wrapper mit normalen Referenzen schreibe lässt er sich auch bauen.

short getParameters( bool& isA, bool& isB, bool& isC )
{
// call native DLL
return nativeDLL::getParameters( isA, isB, isC );
}

Nur kann ich dann mein C# Programm nicht mehr bauen da> Fehlermeldung:

Argument 1: cannot convert from 'bool' to 'bool*'