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

У меня есть бибилиотека на С++ которая работает с камерой.
Мне нужно передать 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
Передать массив байтов из DLL С++ в С#
    #39513106
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bdm77
Код: c#
1.
res->data = (char*) malloc(100);

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

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



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

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

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

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


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