سؤال

وأنا حاليا على تطوير تطبيق لنظام التشغيل Windows CE على معالج OMAP TI، وهو معالج ARM. أحاول أن مجرد استدعاء دالة في C ++ ملف DLL من C # وأنا دائما الحصول على قيمة 0 إلى الوراء، بغض النظر عن نوع البيانات يمكنني استخدام. هل هذا على الأرجح نوعا من استدعاء عدم تطابق الاتفاقية؟ أنا تجميع DLL وEXE الرئيسي من نفس ستوديو حل Visual.

وC # رمز مقتطف:

public partial class Form1 : Form
{
    private void button1_Click(object sender, EventArgs e)
    {
        byte test = LibWrap.test_return();
        MessageBox.Show(test.ToString());
    }
}

public class LibWrap
{
    [DllImport("Test_CE.dll")]
    public static extern byte test_return();
}

وC ++ DLL كود مقتطف:

extern "C" __declspec (dllexport) unsigned char test_return() {
    return 95;
}
هل كانت مفيدة؟

المحلول

وعملت عندما غيرت:

extern "C" __declspec (dllexport) unsigned char test_return() {
    return 95;
}

إلى

extern "C" __declspec (dllexport) unsigned char __cdecl test_return() {
    return 95;
}

في رمز DLL. لماذا لا نفترض أن هذا عندما جمعت لندوز خارج عن ارادتي.

نصائح أخرى

وحاول تصدير test_return () كما يلي:

unsigned char __declspec(dllexport) WINAPI test_return() {
   return 95;
}
<اقتباس فقرة>   

ويتم تعريفها في مكان ما WINAPI كما   __stdcall حيث كان ينبغي أن يكون __cdecl

ولا. يتم تعريف WINAPI كما __stdcall.

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