Laden...

Fehler aus Rücksprung einer DLL Callback Funktion

Erstellt von Stu42 vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.105 Views
S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 17 Jahren
Fehler aus Rücksprung einer DLL Callback Funktion

Hallo,

das leidige Thema DLL, ich werds einfach nicht los 🙂 . Aber diesmal habe ich code!

Ich habe in meinder nativen C Dll folgende Funktion:


extern "C" void Call( void Event(int i) )
{
        Event(42);
}
 

Diese möchte ich nun dynamisch in meinem C# Programm aufrufen, also deklariere ich mir ersteinmal die Library Funktionen aus der kernel32.dll


[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr LoadLibraryW(string filename);

[DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr GetProcAddress(IntPtr hMod, string ProcName);

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool FreeLibrary(IntPtr hModule);

und dann natürlich noch, den delegaten für die Funktion Call aus der DLL.


delegate void Event(int i);    // der paramter derCall- Funktion
delegate void Call(Event e); //funktion aus der dll

Um die funktion dann aufzurufen mache ich dann Folgendes:



//.....
//die callback funktion
public void MyCall(int i)
 {
         MessageBox.Show(i.ToString());
  }
//........
//der aufruf
IntPtr hMod = LoadLibraryW("c:\\test.dll");
IntPtr proc1 = GetProcAddress(hMod, "Call");
Call c = (Call) Marshal.GetDelegateForFunctionPointer(proc1, typeof(Call));
Event ev = MyCall;
c(ev);
 FreeLibrary(hMod);


Die Methode MyCall wird nun auch aufgerufen, also die MessageBox kommt, aber beim Rücksprung der Funktion bekomme ich folgende Debug-Fehlermeldung:

//--Message
Debug-Error!

Programm: ...
Module: C:\test.dll
File:

Runtime Check Error #0: The value ESP was not properly saved across a funktion call. This is usally a result of calling a funktion declared with one calling convertion with a function pointer declared with a diffrent calling convertion.
//----------

Hab ich da einen falschen delegaten genommen? denn der Callbackfunktion in der Dll lautet ja "void Event(int i)" und der delegate "delegate void Event(inti i)", also eigentlich das selbe.

Hat jemand eine Ahnung woran das liegen könnte?

Hilfe!
Gruß Stu.

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 17 Jahren

PS.: Ich benutzer nur die LoadLibrary Funktionen, weil ich den DLL Namen erst zur laufzet kenne, und beim DllImport kann ich ja keinen variablen string zur laufzeit angeben.

215 Beiträge seit 2004
vor 17 Jahren

Die Calling Convention hat nichts (oder nicht nur) mit dem Prototypen zu tun.
Das hier sollte Dir weiterhelfen.

greetz
DaSchroeter

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 17 Jahren

ahso ist das, dann kommt der also durcheinander weil er die Variablen falsch vom Stack abruft.

jau funktionieren tut es mit:


extern "C"  void __stdcall Call( void __stdcall Event(int i) )
	{
		Event(1337);
	}


derbe, danke für die antwort!

S
8.746 Beiträge seit 2005
vor 17 Jahren

Warum tust du dir eigentlich den ganzen Load/FreeLibrary-Kram an? Machst du das nur um den Pfad der DLL bestimmen zu können oder muss es unbedingt dynamisch sein?