Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: импорт функции, возвращающей список  (Прочитано 50090 раз)
0 Пользователей и 10 Гостей смотрят эту тему.
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
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #34 : 15-12-2006 07:25 » new

Я бы пробовал сделать так :
[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
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #43 : 15-12-2006 19:03 » 

Цитата: remedius
все символы через один 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #46 : 15-12-2006 19:11 » 

Так какой смысл в исходной структуре объявлять wchar, когда приложение его не собирается читать?

Или приложение должно читать wchar? Тогда нужно уточнить кодировку.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
remedius
Гость
« Ответ #47 : 15-12-2006 19:12 » 

dimka, не совсем поняла о чем ты..воощем, клиенту посылается структура, поля которой wchar *.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #48 : 15-12-2006 19:15 » 

Цитата: remedius
Ведь char[] не знает о завершающих симоволах!
Я бы так сказал: тот механизм, который передаёт данные, совершенно справедливо не берётся полагать, что в wchar_t[] на самом деле хранится C-шная строка, а не что-то ещё (например, массив двухбайтовых целых со знаком).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
remedius
Гость
« Ответ #49 : 15-12-2006 19:16 » 

ага. ты как всегда лучше говоришь:)
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #50 : 15-12-2006 19:16 » 

Цитата: remedius
поля которой wchar *.
Ничего подобного. Поля там wchar_t[N].
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
remedius
Гость
« Ответ #51 : 15-12-2006 19:23 » 

ну да. А что эт оменяет то? передаю я же UnmanagedType.ByValArray!
Записан
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines