الصحيح ج # بينفوك التوقيع لهذا ويبب ج Function وظيفة
سؤال
ايم محاولة لكتابة ج # المجمع ل جوجل ويب التشفير.
الطريقة التي أحاول الاتصال بها هي:
// Returns the size of the compressed data (pointed to by *output), or 0 if
// an error occurred. The compressed data must be released by the caller
// using the call 'free(*output)'.
WEBP_EXTERN(size_t) WebPEncodeRGB(const uint8_t* rgb,
int width, int height, int stride,
float quality_factor, uint8_t** output);
الاقتراض من ماك كاي فك المجمع لقد جئت مع ما يلي:
[DllImport("libwebp", CharSet = CharSet.Auto)]
public static extern IntPtr WebPEncodeRGB(IntPtr data, int width, int height, int stride, float quality, ref IntPtr output);
لسوء الحظ كلما حاولت تشغيل هذا أحصل على الخطأ التالي:
دعوة إلى وظيفة بينفوك ' ويبشاربليب!ليبوبشارب.أصلي.ويبينكودر:: ويبينكوديرجب ' غير متوازن المكدس.هذا هو الأرجح لأن توقيع بينفوك المدارة لا يتطابق مع توقيع الهدف غير المدارة.تحقق من تطابق اصطلاح الاستدعاء والمعلمات لتوقيع بينفوك مع التوقيع المستهدف غير المدار.
لقد حاولت العديد من الاختلافات على التوقيع دون جدوى.
أي شخص لديه أدنى فكرة?
في صحتك, مايك
المحلول
السبب الأكثر احتمالا للخطأ هو أن يستخدم رمز ج uses cdecl
استدعاء الاتفاقية ولكن يستخدم بينفوك الخاص بك stdcall
اتفاقية الدعوة.تغيير بينفوك على النحو التالي:
[DllImport("libwebp", CallingConvention=CallingConvention.Cdecl)]
public static extern UIntPtr WebPEncodeRGB(IntPtr data, int width, int height,
int stride, float quality, ref IntPtr output);
ليس هناك حاجة لتحديد CharSet
لوظيفة لا تحتوي على معلمات نصية.وأود أيضا أن استخدام UIntPtr
كما نوع العودة منذ ذلك الحين size_t
غير موقعة.
قد يكون هناك المزيد من المشاكل مع التعليمات البرمجية الخاصة بك لأننا لا نستطيع أن نرى كيف كنت استدعاء وظيفة ونحن أيضا لا نعرف ما هو البروتوكول لاستدعاء ذلك.تحتاج إلى معرفة أكثر من توقيع الدالة من أجل معرفة كيفية استدعاء وظيفة.ومع ذلك ، وأظن أن مشكلة اتفاقية الدعوة سوف تحصل على الماضي العقبة الحالية.