Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2015, 15:57   #1
daniil_galahow
Пользователь
 
Регистрация: 04.03.2013
Сообщений: 13
Вопрос получение данных от подключенной DLL (C++ --> C#)

Здравствуйте снова, коллеги!

Имею проблему. Есть приложение на C#, есть библиотека на C++. Библиотека на С++ получает от C# данные (в форме байтовых массивов), пережевывает их, и, по идее, возвращает результат (в форме такого же байтового массива). Однако на практике получить результат в C# не получается - получаю вместо данных какую-то ересь.

Выглядит это вот так:
C++ .h-файл
Код:
extern "C" DLL_METHOD_DECLARATION void OurFunc(char* _ptr2Data, char* _ptr2Result);
C#
Код:
public class OurClass
{
[DllImport(@"C:\%путь_к_файлу%\Algoritm.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern void OurFunc(IntPtr _ptr2InputData, ref IntPtr _ptr2Result);

  void OurMethod()
  {
    //здесь всякий прикладной код, формирующий данные data.
    byte[] dataArray = data.ConvertToByteArray();
    long resultArrayLength = n; //задаем размер массива для результатов, размер нам известен
    byte[] resultArray = new byte[resultArrayLength];

    int sizeOfDataArray = Marshal.SizeOf(dataArray[0]) * dataArray.Length;
    int sizeOfResultArray = Marshal.SizeOf(resultArray[0]) * resultArray.Length;

    IntPtr ptr2DataArray = Marshal.AllocHGlobal(sizeOfDataArray);
    Marshal.Copy(dataArray, 0, ptr2DataArray, dataArray.Length);
    IntPtr ptr2ResultArray = Marshal.AllocHGlobal(sizeOfResultArray);

    OurFunc(ptr2DataArray, ref ptr2ResultArray);
    Marshal.Copy(ptr2ResultArray, resultArray, 0, resultArray.Length);

    //дальше идет код обработки результата и очистка памяти, взятой IntPtr-ами
  }
}
Вроде писал как в MSDN сказано, и из C# в С++ данные передаются в адекватном виде. А вот обратно не получается. В resultArray вместо данных лежат повторяющиеся по всей длине массива 4 значения: 13, 240, 173, 186.

Как решить проблему?
daniil_galahow вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача структуры из программы на c# в dll на c++ и получение структуры из dll iukash Общие вопросы .NET 0 07.05.2013 16:03
Получение результата из dll Alexandr555 Работа с сетью в Delphi 7 16.04.2011 20:56
Получение данных из сторонней dll Memfis1992 Общие вопросы Delphi 4 21.10.2010 09:19
получение списка экспортируемых из dll wmzvov Помощь студентам 3 24.09.2010 19:28
Получение функций из DLL NITRON Общие вопросы Delphi 8 12.09.2007 17:32