| 
			| 
					
						| 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! |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |