Здравствуйте, Hоmunculus, Вы писали:
H>Здравствуйте, kov_serg, Вы писали:
H>Ну это и есть коллбек.
H>Кстати, есть пример как такое из шарпа в либу подсунуть?
Примерно так:
using System;
using System.Text;
using System.Runtime.InteropServices;
class Program {
public delegate void func_t(IntPtr ctx,[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] data,int size);
[DllImport("lib.dll",CallingConvention=CallingConvention.Cdecl)]
public static extern int func(func_t cb, IntPtr ctx);
static Program my(IntPtr ctx) { return GCHandle.FromIntPtr(ctx).Target as Program; }
static void _cb(IntPtr ctx, byte[] data, int size) { my(ctx).cb( Encoding.UTF8.GetString(data) ); }
void cb(string data) {
Console.WriteLine(data);
}
static void Main(string[] args) {
Program p = new Program();
GCHandle pctx=GCHandle.Alloc(p, GCHandleType.Normal);
int r = func(new func_t(_cb), GCHandle.ToIntPtr(pctx) );
pctx.Free();
}
}
extern "C" __declspec(dllexport) int func( void (*write)(void* ctx,char* data,int size), void* ctx) {
if (write) write(ctx,"hello",5);
return 0;
}