Laden...

In DLL eine Funktion aufrufen erwartet allerdings CString

Erstellt von boonkerz vor 19 Jahren Letzter Beitrag vor 19 Jahren 3.906 Views
B
boonkerz Themenstarter:in
122 Beiträge seit 2004
vor 19 Jahren
In DLL eine Funktion aufrufen erwartet allerdings CString

Hallo

Ich möchte in einer DLL eine Funktion aufrufen. Nun möchte die allerdings einen wert in Form von CString haben aus dem C++ bereich.

Wie kann ich das bewerkstelligen?

MFG

4 Beiträge seit 2004
vor 19 Jahren

Das Problem hatte ich auch mal. Hab lange rumgesucht und in Foren gefragt aber keiner konnte mir helfen... Hab mir dann einen anderen Weg gesucht das Problem zu lösen.

Gruss
Sinaloe

B
boonkerz Themenstarter:in
122 Beiträge seit 2004
vor 19 Jahren

Hallo

Und wie? übern wrapper?

SO sieht das ganze in C++ aus

CString sPath;
GetExePath(sPath);
sPath += CString("Boot\") + "new" + CString("\") ;

error = BootARMnew(&sPath);

MFG

M
16 Beiträge seit 2004
vor 19 Jahren

Schau mal in den Namespace System.Runtime.InteropServices.
Dort sind Funktionen und Methoden bereitgestellt die sich um unmanaged code drehen, wie er für eine dll älteren Semesters z.B. erforderlich ist. 😉

Ich greif mit meinen Projekten zur Zeit native auf Pervasive Datenbanken zu und habe da quasi dasselbe Problem meine BTrieve Befehle so zu "marshallen" daß alles funktioniert. Aber mit dem Namespace ist so einiges möglich...

B
boonkerz Themenstarter:in
122 Beiträge seit 2004
vor 19 Jahren

Hallo

Ich weiß jetzt nicht genau was ich aus der Marshal Klasse nehmen soll.

Könntest du noch einen kleinen Hinweiß geben?

MFG

F
124 Beiträge seit 2004
vor 19 Jahren

ohne jetzt mich tiefer damit beschäftigen zu wollen, fallen mir 2 wege ins auge.
zuerst ist festzustellen, dass CString zur MFC gehört.

du kannst jetzt entweder dir per interop einen CString besorgen und den an die andere funktion übergeben oder was einfacher wird, du baust dir in c++ ne neue dll, die die mfc benutzt und die erste funktion zu kapselt, dass sie mit einem normalen string der stdlib funktioniert, anschließend greifst du auf deine wrapperfunktion per interop zu. je nachdem was deine funktion macht, könntest du ja auch char[] oder char* oder so erwarten, dann machst du es dem Herrn Marshal (g) noch einfacher (glaube ich zumindest)

ich habe seiner zeit mal die lautstärkeregelung für die master-lautstärke in c++ lesen/setzen wollen und wollte eine ganze klasse portieren, was sich aber als recht schwer herausstellte. da ich eh interop benutzen musste, entschied ich mich, eine c++ dll zu schreiben, die 2 funktionen hat, die entweder ein DWORD erwarten oder eins zurückliefern. Interop war dann kein problem mehr und außerdem konnte ich die schon in c++ vorhandene klasse für den mixer wiederverwenden.

wichtig ist, dass funktionen mit extern "C" gekennzeichnet sind, da sonst der Herr M. (g) den einstiegspunkt nicht finden kann!

falls noch fragen sind, keine scheu! ich helfe dir so lange ich kann

B
boonkerz Themenstarter:in
122 Beiträge seit 2004
vor 19 Jahren

Hallo

Gerade das mit einem wrapper wollte ich nicht machen.

Wie sieht den das mit dem cstring besorgen aus?

MFG

F
124 Beiträge seit 2004
vor 19 Jahren

kann ich dir nicht sagen, aber in dem fall benutzt du ja eine native klasse! hab bis jetzt nur beispiele gesehen, die eine native funktion importieren und nutzen! ich weiß gar nicht, ob das überhaupt geht.

wenn ich alle neuen beiträge hier durch hab, werde ich mal ein bisschen suchen, weil das interessiert mich jetzt auch.

aber mit der wrapper-dll ist es sicherlich trotzdem am einfachsten und am schnellsten.

F
124 Beiträge seit 2004
vor 19 Jahren

bau dir ne wrapper-dll, so wie ich gelesen habe, müssen es irgendwie com-klassen sein, dass du die interop'pen kannst! und dafür müsstest du ja dann auch ne extra dll schreiben irgendwie.

mach alles, was du an nativen aufrufen hast in eine dll möglichst einfach in funktionen gekapselt und ruf die über interop auf. ist für alle beteiligten (g) das einfachste!

F
529 Beiträge seit 2003
vor 19 Jahren

Irgentwer hier im Forum wollte mal den Titel von irgentwelchen Fenstern herausfinden. Dort war dann wo der (CString) hin soll einen Stringbuilder und es hat alles einwandfrei gefunzt. Oder war es doch ein LPSTR oder ein LPCSTR?

Edit vielleicht funzt es ja auch mit einem CString?

Besuchen sie das VisualC++ - Forum

L
667 Beiträge seit 2004
vor 19 Jahren

Biste Dir sicher, dass Du nicht einfach einen normalen String übergeben kannst ? Ich meine mal so was ähnliches gemacht zu haben und da hat er wenn ich mich recht entsinne den normalen .NET string akzeptiert.

"It is not wise to be wise" - Sun Tzu

B
boonkerz Themenstarter:in
122 Beiträge seit 2004
vor 19 Jahren

Hallo

Kommr ein Access Violation.

MFG

F
124 Beiträge seit 2004
vor 19 Jahren

das problem ist ja, dass CString genauso wie eigentlich std::string auch halt klassen sind. und LPSTR, PSTR oder char[] und char* halt nicht.

woher soll .net nun wissen, ob diese klasse nun einen string repräsentiert oder halt doch ein sonstwas-manager ?

an einer extra nativen dll wird kein weg vorbei führen!

die dll wäre ein aufwand von vielleicht 30 minuten, stattdessen wartest du nun schon 2 tage auf eine antwort hier im forum.