I çağıran bağlamını tanımlayan olası herhangi bir şekilde yoksun bir geri çağırma mekanizması olan bir (C) üçüncü parti kütüphane ile çalışmaya çalışıyorum CDECL. Ana projem C# ve sarıcı C kütüphanesi API'lerini çağırmak için bir C++/CLI projesi. C# GetFunctionPointerForDelegate yerine stdcall
Mareşal :: GetFUnctionPointerForDelegate kullanmak çalışılıyor, bu sorunu gidermek için.void Init(Handler Callback)
{
// Create a wrapper lambda in case Callback is a non-static method.
instance.CreateBuffers((x, y) => Callback(x, y));
}
Sonra C++/CLI kodu:
void CreateBuffers(Handler^ Callback)
{
pinCallback = GCHandle::Alloc(Callback);
void (*callback)(int, int) = (void (__stdcall *)(int, int))Marshal::GetFunctionPointerForDelegate(Callback).ToPointer(),
// Use 'callback' in third party library...
}
http://msdn.microsoft.com/en-us/library/367eeye0.aspx göre, Marshal gelen fonksiyon işaretçisi :: GetFunctionPointerForDelegate bir tüm bu sorun olduğunu İşte benim C# kodu stdcall işlevi, ancak C geri aramam cdecl. Burada cdecl uyumlu bir işlevi nasıl edinebilirim? UnmanagedFunctionPointer ile
@JonathonReinhart, tüm bunların amacını ortadan kaldıracak, çünkü saplamadaki arama bağlamını tanımlayamayacağım. Ne arayacağımı bilmek için global bir __stdcall işlev gösterici yapmalıyım ve sonra başladığım yere döneceğim. – dsharlet
Kitaplık, çeşitli geri aramalar için bir dizi işlev işaretçisi içeren bir struct argümanı kabul eden bir işlevi vardır. – dsharlet
Sadece kütüphane kullanımı örneğinde bir kez ayarlamanız gerekiyor, ancak uygulamada aynı anda aktif olan çoklu kütüphane örnekleri var. – dsharlet