C++ DLL in C# verwenden - Stack-Fehler bei Parameter

Gast #2097553
Lesenswert?
• ▲
▼
Hallo,

ich habe eine DLL in C++ erstellt (Visual Studio) und sie funktioniert 
auch unter C++. Das Problem zeigt sich erst, wenn ich diese in C# 
einbinden will.

Alle Funktionen ohne Parameter gehen ohne Fehler. Bei Funktionen mit 
Parameter bekomme ich immer ein Stack Problem. Auch wenn ich nur eine 
einfache Byte-Variable übergebe.

Ich glaube es liegt an meiner DLL und nicht am verwendeten Aufruf. Z.B. 
habe ich die Funktion BOOL MessageBeep(UINT) erfolgreich in C# einbinden 
können. Aber meine eigene Funktion BOOL Irgendwas(UINT) macht trotzdem 
den Stack Fehler. Ich bin etwas ratlos und hoffe auf Hilfe!

Gruß Sam
Gast #2097581
Lesenswert?
• ▲
▼
Ich bin nicht sicher, ob ich Dich richtig verstanden habe. Im Moment 
sind die Funktionen mit
1
extern "C" __declspec(dllimport)

definiert. Stattdessen einfach
1
__stdcall

? Hab ich ausprobiert - es hilft leider nicht!
Das hier ist die Fehlermeldung:
1
Ein Aufruf an die PInvoke-Funktion hat das Gleichgewicht des Stapels
2
gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit
3
der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die
4
Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht
5
verwalteten Zielsignatur übereinstimmen.
Gast #2097586
Lesenswert?
• ▲
▼
Wie hast du es in C# definiert?

Ich hatte es immer ohne __declspec(dllimport) dafür aber mit .def Datei 
gemacht. Dort hatte ich dann irgendwo __stdcall hingeschrieben und dann 
ging es. (Bei mir kam aber keine Fehlermeldung sonder das Programm ist 
nur abgestützt)
Gast #2097597
Lesenswert?
• ▲
▼
Hallo Peter,

erstmal vielen Dank für Deine Hilfe. Es funktioniert!

Ich hatte meine DLL-Funktionen bisher in etwa so definiert:
1
extern "C" __declspec(dllimport) BOOL Machwas(UINT u);

wenn ich nun Deinen _stdcall einbaue (an der richtigen Stelle^^), dann 
klappts!
1
extern "C" __declspec(dllimport) BOOL __stdcall Machwas(UINT u);

Jetzt frag ich mich nur, warum? Was macht das __stdcall? Wer mir das 
kurz erklären will, darf das gerne tun! Ansonsten werd ich das mal 
googeln.

Gruß Sam
Gast #2097616
Lesenswert?
• ▲
▼
es legt fest wie die parameter auf den Stack gelegt werden. Bei Pascal 
ist der aufrufer für das aufräumen des Stack verantwortlich. Bei C macht 
es die funktion. Auch die Reihenfolge muss festgelegt werden und dafür 
gibt ebend verschiendene standards - einer davon ist halt stdcall
#2097617
Lesenswert?
• ▲
▼
Es gibt mehrere Möglichkeiten, wie Parameter über den Stack übergeben 
werden, wer die Daten auf den Stack legt und wer sie wieder entfernt. 
Dies definiert man über z.B. __stdcall (MS-VC). Bei MS gibt es da auch 
noch andere Calling Conventions (__cdelc, __clrcall, ...). Der Trick 
ist: die Calling-Convention muss bei Aufrufer und beim Aufgerufenen 
zusammenpassen.

Eine weitere Möglichkeit, deine Software zum Laufen zu bekommen wäre, Du 
gibst in C# beim DllImport die passende Aufruf-Konvention an.

Weiterführende Doku: siehe MSDN

Gruß
Markus

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren