Вызов пользовательского типа из DLL, написанной на C ++ из c # - PullRequest
2 голосов
/ 04 февраля 2010

Я использую 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 #?Заранее спасибо за помощь.

Ответы [ 3 ]

4 голосов
/ 04 февраля 2010

Учитывая префикс "P", похоже, что реальное объявление

hid_get_info(int n, DEV_INFO **pdi)

где DEV_INFO - это структура. Вам нужно найти объявление этой структуры и добавить его в свой код C # с атрибутом [StructLayout]. Затем вы должны объявить функцию в коде C # следующим образом:

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

и используйте Marshal.PtrToStructure () для получения значения структуры. Надеюсь, вам не нужно освобождать конструкцию, вас облажают.

Вторая интерпретация заключается в том, что «pid» возвращает массив указателей на структуры DEV_INFO. Вероятно, с учетом аргумента «n», который вполне может означать количество элементов в массиве, который вы передаете для заполнения функцией. В этом случае передайте IntPtr [] и задайте для n значение Length.

0 голосов
/ 04 февраля 2010

Я с уверенностью предположу, что 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);
}
0 голосов
/ 04 февраля 2010

Вам необходимо создать struct в C #, который отражает C ++ PDEV_INFO struct в C ++.

Вы должны применить [StructLayout(LayoutKind.Sequential)] к структуре, а затем скопировать поля из структуры C ++ (посмотрите файл заголовка) по порядку.

Затем можно написать метод extern, который принимает struct в качестве параметра ref.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...