Ik heb al vele google queries uitgeprobeert hierover maar ik kom er nog niet helemaal aan uit. Ik ben hier bezig met het schrijven van een aplicatie dat zich op callbacks richt vanuit een unmanaged C++ naar C#. Ik ben hier in beide gevallen schrijven van het C++ en C#.
Mijn applicatie heeft een eenvoudige basis. Eerst in C# roep ik naar een geimporteerde functie die me een callback laat zetten. Nu is de bedoeling dat mijn C++ code gaat die callback functie een x aantal keer aanroepen.
Dit gebruik momenteel in C++
En dit in mijn C#
Nu krijg ik de fout: "The value of ESP was not properly saved accoss a function call. This is usally a result of calling a function declared with one calling convention with a pointer declared with a other calling convention.
Ik krijg in C# wel netjes in mijn output window "3", die ik heb aangegeven in c++. En daarna crash'ed hij op zijnde 2de call meen ik. Als iemand hier een goed voorbeeld van heeft of een indicatie zou kunnen geven hoe ik dit moet aanpakken graag.
Mijn applicatie heeft een eenvoudige basis. Eerst in C# roep ik naar een geimporteerde functie die me een callback laat zetten. Nu is de bedoeling dat mijn C++ code gaat die callback functie een x aantal keer aanroepen.
Dit gebruik momenteel in C++
code:
1
2
3
4
5
6
7
8
| __declspec(dllexport) int fpk_contentGet( FPKPGKFILE * handle, int (*functocall)(int))
{
int g = 0;
for(int i=0;i<3;i++){
g += (*functocall)(3);
}
return (g);
} |
En dit in mijn C#
code:
1
2
| [DllImport("FPKReader.dll", EntryPoint = "fpk_contentGet", ExactSpelling = false, CallingConvention=CallingConvention.Cdecl)]
public static extern unsafe string fpk_contentGet(FPKPKGFILE* handle, [MarshalAs(UnmanagedType.FunctionPtr)] MulticastDelegate myDelegate); |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| delegate int Callback(int a);
public int WriteCallback(int a)
{
Console.WriteLine(a);
return a;
}
private unsafe void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
fixed (FPKReader.FPKPKGFILE* tmpFile = &File)
{
ListViewItem myItem = (ListViewItem)e.Item;
Callback myWriteCallback = new Callback(WriteCallback);
FPKReader.fpk_contentGet(tmpFile, myWriteCallback);
}
} |
Nu krijg ik de fout: "The value of ESP was not properly saved accoss a function call. This is usally a result of calling a function declared with one calling convention with a pointer declared with a other calling convention.
Ik krijg in C# wel netjes in mijn output window "3", die ik heb aangegeven in c++. En daarna crash'ed hij op zijnde 2de call meen ik. Als iemand hier een goed voorbeeld van heeft of een indicatie zou kunnen geven hoe ik dit moet aanpakken graag.