Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передать массив байтов из DLL С++ в С# / 7 сообщений из 7, страница 1 из 1
30.08.2017, 15:17
    #39512885
bdm77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать массив байтов из DLL С++ в С#
Добрый день!

У меня есть бибилиотека на С++ которая работает с камерой.
Мне нужно передать bitmap из библиотеки в программу на С# .


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
C++

//File .H

#ifdef __cplusplus
extern "C" {
#endif

typedef struct 
{
	struct size_frame{			
		unsigned int x;
		unsigned int y;
	};
} settings_class_room;


typedef struct {		
	settings_class_room::size_frame size_farme;
	char* data;
}frame_data;


/**
	Return current frame 
*/	
	__declspec(dllexport) result_enum getCurrentFrame(frame_data* frameData);

#ifdef __cplusplus
}
#endif

//=========================//
// File .CPP

result_enum  getCurrentFrame(frame_data* res)
	{

		res->data = (char*) malloc(100);
		memcpy(res->data, "test", 4);

		(res)->size_farme.x = 10;
		(res)->size_farme.y = 10;

		return RESULT_OK;
	}




Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
//C#
public class ClassZoomPluginInterface
{
     public struct settings_class_room
     {
            public struct size_frame
            {
                public UInt32 x;
                public UInt32 y;
            };
     };



       public struct frame_data
       {
            settings_class_room.size_frame size_farme;

            [MarshalAs(UnmanagedType.ByValArray)]            
            public byte[] data;
       };


       //
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate result_enum GetCurrentFrameDelegate(ref frame_data frameData);

        public GetCurrentFrameDelegate GET_CURRENT_FRAME { get; private set; }



            //=====================================//=================================//
            m_pluginProcAddress = GetProcAddress(plugin, "getCurrentFrame");
            if (m_pluginProcAddress != IntPtr.Zero)
            {
                GET_CURRENT_FRAME = (GetCurrentFrameDelegate)Marshal.GetDelegateForFunctionPointer(m_pluginProcAddress, 
                  typeof(GetCurrentFrameDelegate));
            }
            else
            {
                Console.WriteLine("The method <getCurrentFrame> in  is not loaded");
            }


           //==========================//
            protected result_enum GetFrame(ref frame_data res)
           {            
            try
            {  
                frame_data frameData = new frame_data();                                     
                m_classZoomDelegates.GET_CURRENT_FRAME(ref frameData);
            }
            catch (Exception ex)
            {

                throw ex;
            }

            res = frameData;

            return result_enum.RESULT_OK;
            
        }
}



После вызова фунции GetFrame(ref frame_data res)

получаю результат:
res.data[0] = 0-255 ; каждый раз разное
res.size_farme.x = 10;
res.size_farme.y = 10;



Помогите пожалуйста разобраться.
Два дня пытаюсь решить..

Заранее спасибо.
...
Рейтинг: 0 / 0
31.08.2017, 05:18
    #39513106
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать массив байтов из DLL С++ в С#
bdm77
Код: c#
1.
res->data = (char*) malloc(100);

Ты выделяешь память в неуправляемом коде и возвращаешь указатель в управляемый код. В таком случае управляемый код не сможет освободить выделенную память. Нужно или изменить подход, или добавить в неуправляемый код метод, освобождающий память вызовом free().

Когда определишься со способом выделения память под массив будет о чём поговорить.
...
Рейтинг: 0 / 0
31.08.2017, 08:35
    #39513157
bdm77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать массив байтов из DLL С++ в С#
Алексей Кbdm77
Код: c#
1.
res->data = (char*) malloc(100);

Ты выделяешь память в неуправляемом коде и возвращаешь указатель в управляемый код. В таком случае управляемый код не сможет освободить выделенную память. Нужно или изменить подход, или добавить в неуправляемый код метод, освобождающий память вызовом free().

Когда определишься со способом выделения память под массив будет о чём поговорить.


Есть метод :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
/**
	delete pointer frame
*/
__declspec(dllexport) void releaseMemory(frame_data* frame);

void releaseMemory(frame_data* frame)
{
      free (frame);
}



спасибо.
...
Рейтинг: 0 / 0
31.08.2017, 09:34
    #39513195
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать массив байтов из DLL С++ в С#
bdm77Есть метод :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
/**
	delete pointer frame
*/
__declspec(dllexport) void releaseMemory(frame_data* frame);

void releaseMemory(frame_data* frame)
{
      free (frame);
}

Так должно быть:
Код: c#
1.
2.
3.
4.
5.
void releaseMemory(frame_data* frame)
{
      free (frame->data);
      // free (frame); <-- думаю, это лишее, структура создаётся в стеке.
}

Далее описываем массив как IntPtr и пользуемся Marshal.Copy , на первый взгляд без копирования массива здесь не обойтись.

Попутно рекомендую изучить StructLayoutAttribute и DllImportAttribute , ну и вообще почитать статьи про Platform Invoke в .Net.
...
Рейтинг: 0 / 0
31.08.2017, 11:56
    #39513320
bdm77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать массив байтов из DLL С++ в С#
[quot Алексей К][quot bdm77]Есть метод :
Код: plaintext
1.
2.
3.
4.
5.
6.
[src c#]
void releaseMemory(frame_data* frame)
{
      free (frame->data);
      // free (frame); <-- думаю, это лишее, структура создаётся в стеке.
}



разумеется так!!

почитаю..
спасибо.
...
Рейтинг: 0 / 0
03.09.2017, 08:26
    #39514640
bdm77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать массив байтов из DLL С++ в С#
Алексей К,

Спасибо. Разобрался..
...
Рейтинг: 0 / 0
03.09.2017, 14:49
    #39514707
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать массив байтов из DLL С++ в С#
bdm77Алексей К,

Спасибо. Разобрался..Ок :-)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передать массив байтов из DLL С++ в С# / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]