Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++ > Разработка LIB

Ответ
 
Опции темы
Старый 30.09.2016, 19:51   #1
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Передача сложных данных

У препода заскок случился. Ему нужно в WPF вызывать DLL, в которой происходит отрисовка на OpenGL.
Костыль такой:

WPF -> Windows Form Host -> DLL(C++) -> OpenGL

На костыль пофиг. Как передавать сложные данные в DLL из C# ?

Данные типа структур:
Line {
     double x1;
     double y1;
     double x2;
     double y1;
     int thikness;
     int[3] rgb;
}

Text {
    string text;
    double x;
    double y;
    int[3] rgb;
}
??
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 01.10.2016, 14:06   #2
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Передача сложных данных

Ну через PInvoke. Там можно же структуры передавать.
Или тебя интересует конкретно как int[3] в структуре передать?
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
RegIon (01.10.2016)
Старый 01.10.2016, 20:06   #3
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Передача сложных данных

Сообщение от h1dd3n Посмотреть сообщение
Ну через PInvoke. Там можно же структуры передавать.
Или тебя интересует конкретно как int[3] в структуре передать?
А, мне необходимо массив структур таких передать.
В принципе по Pinvoke много инфы. Разберусь.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 01.10.2016, 21:43   #4
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Передача сложных данных

Ты не понял мой вопрос про int[3]. Массивы в структурах/классах можно хранить 2 способами - как указатель на какой-то массив (скорее всего в куче), это самый обычный для C# способ:
struct A {
public int[] Coordinates;
}

А можно прямо в структуре:
unsafe struct A {
public fixed int Coordinates[3];
}

То есть в варианте 2 layout у структуры - 3 интежера, а в 1 варианте всего 1 указатель куда-то на массив int[]. Это важно для pinvoke т.к. при передаче структур там тупо память кусками копируется, так что надо чтобы совпадало с нативным вариантом.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
RegIon (02.10.2016)
Старый 02.10.2016, 07:48   #5
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Передача сложных данных

А, это довольно таки важно.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 02.10.2016, 16:56   #6
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Передача сложных данных

h1dd3n, как пробросить массив такого (C#):
[StructLayout(layoutKind:LayoutKind.Sequential)]
        public 
struct GLLine
        
{
            public 
float x1;
            public 
float y1;
            public 
float x2;
            public 
float y2;
            public 
float thinkness;
            [
MarshalAs(UnmanagedType.ByValArraySizeConst 3)]
            public 
int[] color;

            public 
GLLine(Line line)
            {
                
x1 = (float)line.X1;
                
x2 = (float)line.X2;
                
y1 = (float)line.Y1;
                
y2 = (float)line.Y2;

                
color = new int[3] { 256,256,256};
                if(
line.Stroke is SolidColorBrush)
                {
                    
Color c = ((SolidColorBrush)(line.Stroke)).Color;
                    
color[0] = c.R;
                    
color[1] = c.G;
                    
color[2] = c.B;
                }
                
thinkness = (float)line.StrokeThickness;
            }
        }; 
в эту фунцию?
void GLAddLineArray(GLLine *line) {
    
lineBuffer.insert(lineBuffer.end(), lineline + (sizeof(line) / sizeof(line[0])));

Если просто писать:
[DllImport(DLL_PATHCallingConvention CallingConvention.Cdecl)]
        public static 
extern void GLAddLineArray(GLLine[] line); 
То ничего не работает, хотя если по одиночке структуру кидать - все нормально.
[DllImport(DLL_PATHCallingConvention CallingConvention.Cdecl)]
        public static 
extern void GLAddLine(GLLine line); 
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 02.10.2016, 21:50   #7
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Передача сложных данных

Что должно делать это:
(sizeof(line) / sizeof(line[0])
?
__________________
(Offline)
 
Ответить с цитированием
Старый 02.10.2016, 22:12   #8
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Передача сложных данных

Сообщение от h1dd3n Посмотреть сообщение
Что должно делать это:
(sizeof(line) / sizeof(line[0])
?
Что и делает - размер массива в единицах. Длина всего массива в байтах / размер структуры в байтах.
Как в примерчике.
http://www.cplusplus.com/reference/v...vector/insert/
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 02.10.2016, 22:24   #9
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Передача сложных данных

Сообщение от RegIon Посмотреть сообщение
Что и делает - размер массива в единицах. Длина всего массива в байтах / размер структуры в байтах.
Как в примерчике.
http://www.cplusplus.com/reference/v...vector/insert/
А вот и нет. sizeof дает тебе размер выделенной памяти, но line это аргумент типа GLLine* то есть указатель, и sizeof не дает тебе размер всего "массива" он дает тебе размер указателя.

http://stackoverflow.com/questions/4...th-of-an-array

1 ответ внимательно читаем.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
St_AnGer (03.10.2016)
Старый 02.10.2016, 22:30   #10
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Передача сложных данных

Сообщение от h1dd3n Посмотреть сообщение
А вот и нет. sizeof дает тебе размер выделенной памяти, но line это аргумент типа GLLine* то есть указатель, и sizeof не дает тебе размер всего "массива" он дает тебе размер указателя.

http://stackoverflow.com/questions/4...th-of-an-array

1 ответ внимательно читаем.
По этой причине и терпеть не могу C/C++, придется еще и размер передавать, хотя я вообще не понимаю как маршаллер тогда работать должен (по идее структуры передаются по значению, а тут указатель) , но теперь работает.
Еще пришлось в параметр атрибут [In] добавить
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 03.10.2016, 19:51   #11
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Передача сложных данных

Сообщение от RegIon Посмотреть сообщение
По этой причине и терпеть не могу C/C++, придется еще и размер передавать, хотя я вообще не понимаю как маршаллер тогда работать должен (по идее структуры передаются по значению, а тут указатель) , но теперь работает.
Еще пришлось в параметр атрибут [In] добавить
А что не так с маршаллером?
Зачем атрибут [In]?
__________________
(Offline)
 
Ответить с цитированием
Старый 03.10.2016, 23:18   #12
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Передача сложных данных

Сообщение от h1dd3n Посмотреть сообщение
А что не так с маршаллером?
Зачем атрибут [In]?
1 - Порой не понимаю принципы работы.
2 - На всякий случай, много примеров нашел еще, где массивы с этими атрибутами передаются или возвращаются.

Аргументы, передаваемые по значению (например, аргументы input/In), передают при вызове функции копию переменной аргумента. Таким образом, эта копия переменной ведет себя как отдельная локальная переменная - она существует только в теле функции, и может быть внутри функции изменена, и при этом все изменения никак не повлияют на исходную переменную, которая была передана в функцию. С другой стороны аргументы, передаваемые по ссылке, передаются как оригинал, т. е. все изменения переданной переменной, если эти изменения сделает функция, сохранятся после завершения работы функции. Таким образом, вызывающий код увидит, что случилось с переменной внутри функции.
http://microsin.net/programming/pc/m...ple-types.html
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 04.10.2016, 19:54   #13
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Передача сложных данных

Вообще лучше всего работать с указателями, то есть 1% кода (того кода который непосредственно имеет отношение к интеропу) пишешь с unsafe модификатором, не трахаешь себе мозг, все работает так как и ожидается. Остальные 99% пишешь на безопасном C#.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Жека (05.10.2016)
Старый 04.10.2016, 21:55   #14
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Передача сложных данных

Сообщение от h1dd3n Посмотреть сообщение
Вообще лучше всего работать с указателями, то есть 1% кода (того кода который непосредственно имеет отношение к интеропу) пишешь с unsafe модификатором, не трахаешь себе мозг, все работает так как и ожидается. Остальные 99% пишешь на безопасном C#.
Он не компилирует. А флаги компиляции менять лень.
Кстати, все работает, почти.

Извращался изрядно.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 05.10.2016, 09:48   #15
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Передача сложных данных

Это нормально, что из DLL не работают?:
  • Исключения
  • I/O - ofstream/ifstream вообще молчат. Как логировать например??
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 09:21.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com