Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#, C++] Callbacks

Pagina: 1
Acties:

Verwijderd

Topicstarter
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++
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.

Verwijderd

Zoals de fout al zegt is het waarschijnlijk een probleem met calling conventions. Als je 1 keer een "3" ziet zou het dus de callback functie moeten zijn die met een verkeerde calling conventie wordt aangeroepen.
Ik weet niet of je met de MarshalAs attribute ergens de calling conventie aan kunt geven, maar je kan in ieder geval verschillende uittesten in de C++ code.

Dus als parameter voor fpk_contentGet:
"int (__stdcall *functocall)(int))" of "int (__cdecl *functocall)(int))"