سؤال

أنا أستخدم DLL مكتوبة في C ++ في مشروعي C #. تمكنت من استدعاء الوظائف داخل DLL باستخدام هذا الرمز:

[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr VmHidScan();

الآن أحتاج إلى استدعاء وظيفة تقوم بتثقيئة مؤشر نوع مخصص. المستندات لتخطيط DLL الوظيفة مثل هذا:

hid_get_info(int n,PDEV_INFO *pdi)

أنا لا أعرف كيفية استخدام هذا المؤشر المخصص. هل هذا محدد في DLL؟ إذا كان الأمر كذلك كيف يمكن استخدامه من مشروع C #؟ إذا لم يكن الأمر بحاجة إلى إدراج ملف الرأس في C #؟ شكرا مقدما لمساعدتكم.

هل كانت مفيدة؟

المحلول

بالنظر إلى بادئة "P"، يبدو أن الإعلان الحقيقي هو

hid_get_info(int n, DEV_INFO **pdi)

حيث dev_info هي هيكل. ستحتاج إلى العثور على إعلان هذا الهيكل وإضافته إلى رمز C # الخاص بك مع سمة [Pluctlayout]. يمكنك بعد ذلك الإعلان عن الوظيفة مثل هذا في رمز C #:

[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);

واستخدم marshal.ptrtostructure () للحصول على قيمة الهيكل. نأمل أن لا تضطر إلى تحرير الهيكل، وسوف تكون مشدود.

التفسير الثاني هو أن "PID" بإرجاع مجموعة من المؤشرات إلى هياكل dev_info. من المحتمل بعض الشيء أن تعطى الوسيطة "N"، والتي يمكن أن تعني أن عدد العناصر الموجودة في الصفيف التي تقوم بملءها بواسطة الوظيفة. في هذه الحالة، تمرير INTPTR [] وتعيين "N" إلى طوله.

نصائح أخرى

تحتاج إلى إنشاء struct في C # التي تعكس C ++ PDEV_INFO struct في C ++.

يجب أن تنطبق [StructLayout(LayoutKind.Sequential)] إلى الهيكل ثم انسخ الحقول من بنية C ++ (انظر إلى ملف الرأس) بالترتيب.

يمكنك بعد ذلك كتابة extern الطريقة التي تأخذ struct ك ref معامل.

سوف نفترض بأمان PDEV_INFO* هو DEV_INFO**.

استخدم هذا في C #:

class DEV_INFO
{
    // fields go here
}

static class NativeMethods
{
    [DllImport...]
    public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top