remedius
Гость
|
|
« Ответ #30 : 14-12-2006 07:56 » |
|
что-то типа этого пробовала, там помниться проблема возникла вот в чем: перед такого рода полями надо писать [MarshalAs(UnmanagedType...., SizeConst=LF_FACESIZE)](вот вместо ... я так ничего и не подобрала.
Вообще, в принципе, строки всегда можно одной строкой заменить:) (так я и поступила. А если одна строка типа string в структуре, и перед ее объявлением указано [MarshalAs(UnmanagedType.ByValTStr, SizeConst=LF_FACESIZE)], то все работает... ИМХО, проблема возникает с выравниванием.
Я пока забила ковыряться, слишком мало времени осталось у меня для завершения сего...
Такт что, Всем большое спасибо за помощь:)
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #31 : 14-12-2006 07:59 » |
|
P.S. а вообще, когда передаешь в библиотеку, или получаешь переменные типа массивы (или подобные) Обязательно в аргументах, перед их объявлением надо не забывать [Out/In, MarshalAs(UnmanagedType.LPArray)] - к примеру
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #32 : 14-12-2006 07:59 » |
|
или [Out/In, MarshalAs(UnmanagedType...)] в зависимости от типа аргумента
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #33 : 14-12-2006 21:58 » |
|
Интересно, а если структура типа : struct ObjectInfo { int color; wchar_t name[32]; wchar_t description[150]; };
Так ли должна выглядеть структура на с#: [StructLayout(LayoutKind.Explicit)] public class ObjectInfo { [FieldOffset(0)]public int color; [FieldOffset(4)]public string name; [FieldOffset(68)]public string description; };
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #34 : 15-12-2006 07:25 » |
|
Я бы пробовал сделать так : [StructLayout(LayoutKind.Explicit)] public struct ObjectInfo { [FieldOffset(0)]public int color; [FieldOffset(4)]public char[32] name; [FieldOffset(68)]public char[150] description; };
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
remedius
Гость
|
|
« Ответ #35 : 15-12-2006 13:56 » |
|
Мммм.. как мне известно так: [FieldOffset(4)]public char[32] name; C# не позволяет писать
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #36 : 15-12-2006 13:59 » |
|
Мммм.. как мне известно так: [FieldOffset(4)]public char[32] name; C# не позволяет писать
Ага, сорри Зато вот так позволяет [FieldOffset(4)]public char[] name;
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
remedius
Гость
|
|
« Ответ #37 : 15-12-2006 14:00 » |
|
+ мне как-то не удавалось писать struct, т.к. private static extern unsafe void GetNPointsForEachPart([Out, MarshalAs(UnmanagedType.LPStruct)] ObjectInfo oi,
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #38 : 15-12-2006 14:01 » |
|
программа вылетает, ругается что-то на маршлинг. В примере в мсдн class ключевое слово.
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #39 : 15-12-2006 14:03 » |
|
а если со словом class и с char[], то прога вываоливается с "Object reference not set to an instance of an object."
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #40 : 15-12-2006 14:04 » |
|
с class и с string ничего не валиться, но и значения для string не возвращаются.
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #41 : 15-12-2006 15:44 » |
|
а если со словом class и с char[], то прога вываоливается с "Object reference not set to an instance of an object."
А нет, извеняюсь, вылетает с ошибкой{"Mismatch has occurred between the runtime type of the array and the sub type recorded in the metadata." }
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #42 : 15-12-2006 16:03 » |
|
вот так получилось: public class ObjectInfo { public int color; [MarshalAs(UnmanagedType.ByValArray, SizeConst=64)] public char[] name; [MarshalAs(UnmanagedType.ByValArray, SizeConst=300)] public char[] description; };
Но потом нужно самим вручную формировать строку. Во первых потому, что все символы через один 0, потом после двух 00(конец строки) лежит всякий мусор.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #43 : 15-12-2006 19:03 » |
|
все символы через один 0 А символы, небось, латинского алфавита... В общем где-то появляется Unicode. Рекомендую поиграться с атрибутом "CharSet".
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
remedius
Гость
|
|
« Ответ #44 : 15-12-2006 19:07 » |
|
dimka, это вполне объяснимо: struct ObjectInfo { int color; wchar_t name[32]; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!! wchar_t description[150];//!!!!!!!!!!!!!!!!!!!!!!!!!!!!! };
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #45 : 15-12-2006 19:10 » |
|
вообще я думаю так и должно быть. Ведь посылается фактически массив. Вот в этот массив в функции dll тупо и копируются все символы. Ведь char[] не знает о завершающих симоволах!
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #46 : 15-12-2006 19:11 » |
|
Так какой смысл в исходной структуре объявлять wchar, когда приложение его не собирается читать?
Или приложение должно читать wchar? Тогда нужно уточнить кодировку.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
remedius
Гость
|
|
« Ответ #47 : 15-12-2006 19:12 » |
|
dimka, не совсем поняла о чем ты..воощем, клиенту посылается структура, поля которой wchar *.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #48 : 15-12-2006 19:15 » |
|
Ведь char[] не знает о завершающих симоволах! Я бы так сказал: тот механизм, который передаёт данные, совершенно справедливо не берётся полагать, что в wchar_t[] на самом деле хранится C-шная строка, а не что-то ещё (например, массив двухбайтовых целых со знаком).
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
remedius
Гость
|
|
« Ответ #49 : 15-12-2006 19:16 » |
|
ага. ты как всегда лучше говоришь:)
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #50 : 15-12-2006 19:16 » |
|
поля которой wchar *. Ничего подобного. Поля там wchar_t[N].
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
remedius
Гость
|
|
« Ответ #51 : 15-12-2006 19:23 » |
|
ну да. А что эт оменяет то? передаю я же UnmanagedType.ByValArray!
|
|
|
Записан
|
|
|
|
|