الصحيح ج # بينفوك التوقيع لهذا ويبب ج Function وظيفة

StackOverflow https://stackoverflow.com//questions/9693620

  •  13-12-2019
  •  | 
  •  

سؤال

ايم محاولة لكتابة ج # المجمع ل جوجل ويب التشفير.

الطريقة التي أحاول الاتصال بها هي:

// 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 غير موقعة.

قد يكون هناك المزيد من المشاكل مع التعليمات البرمجية الخاصة بك لأننا لا نستطيع أن نرى كيف كنت استدعاء وظيفة ونحن أيضا لا نعرف ما هو البروتوكول لاستدعاء ذلك.تحتاج إلى معرفة أكثر من توقيع الدالة من أجل معرفة كيفية استدعاء وظيفة.ومع ذلك ، وأظن أن مشكلة اتفاقية الدعوة سوف تحصل على الماضي العقبة الحالية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top