C #: передать массив int в c ++ dll

0

У меня есть C++ dll, который используется для печати карточек (удостоверения личности). Моя реализация выполнена с использованием С#.Net. Я использовал следующий код для вызова DLL C++.

[DllImport(@"J230i.dll",CallingConvention = CallingConvention.Cdecl,SetLastError=true)]
public static extern int N_PrintJobStatus(ref int[] nPrtintjobStatus);

int[] pJob = {0,0,0,0,0,0,0,0} ;

ret = N_PrintJobStatus( ref pJob);

Подпись метода N_PrintJobStatus, приведенная ниже

N_PrintJobStatus(int *pJobStatus )

После вызова метода он дает следующую ошибку

Вызов функции PInvoke '********! *********. FrmCardPrint :: N_PrintJobStatus' имеет несбалансированный стек. Вероятно, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой сигнатуре. Убедитесь, что соглашение о вызове и параметры сигнатуры PInvoke соответствуют целевой неуправляемой подписи.

Как я могу исправить эту проблему?

Спасибо.....

Теги:
pinvoke
dllimport

1 ответ

2
Лучший ответ

Ваш перевод неверен. Int array, int* не отображается в ref int[]. Последний будет сортироваться как int**. Вам нужно использовать int[].

[DllImport(@"J230i.dll", CallingConvention = CallingConvention.Cdecl, 
    SetLastError = true)]
public static extern int N_PrintJobStatus(int[] nPrtintjobStatus);

Выделите массив перед вызовом функции. Предположительно, у вас есть какой-то способ определить, как долго это должно быть. В ее нынешнем виде эта функция выглядит как переполнение буфера в ожидании. Как функция знает, как долго будет массив, и поэтому предпринимать шаги, чтобы избежать написания за ее пределами?

Не ясно, что это единственная проблема. Мы не можем быть уверены, что тип возврата действительно является int. Или, что конвенция вызова - cdecl. Или что функция действительно вызывает SetLastError.

  • 0
    спасибо Дэвид ... это решено ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню