Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель как тип возвращаемого значения функции 
V
    Опции темы
CYBERDREAM
Дата 15.11.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Приветсвую всех.
Столкнулся со следующей проблемой. Переписываю код с плюсов на шарп, и у одной функции возвращаемый параметр является указателем на структуру, как быть в случае шарпа?

Код

         {
              ....
              READER *myReaderHandle = MAPI_Connect( readerHost, NULL, &connectResult ); //собственно сама виновница
              ...
         }
         struct READER; 

вот что получил на шарпе:
Код

    public class PInvokeClient
    {
        [DllImport("libMach1.dll")]
        public static extern READER MAPI_Connect(string host,int k,ref MAPI_CONNECT_ERROR sl);//вот собственно как здесь задать указатель на структуру?

        public static int Main(string[] args)
        {
            MAPI_CONNECT_ERROR connectResult=new MAPI_CONNECT_ERROR();
            //Connect
            string _readerHost = "192.168.127.22";

            READER _reader=new READER();// = MAPI_Connect(_readerHost,0,ref connectResult);
            IntPtr rea=Marshal.AllocHGlobal(Marshal.SizeOf(_reader)); 
            Marshal.StructureToPtr(_reader,rea,false);                               //Ссылка на стркутру
            rea = MAPI_Connect(_readerHost,0,ref connectResult);           // здесь обишка несовпадение возвращаемых типов.
            ....
        }
        public struct READER{};

как правильно объявить функцию?


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
0000
Дата 15.11.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



так..сначала написал неподумавши - не скомпилит =)

надо приписать атрибут [MarshalAs(UnmanagedType.LPStruct)]
щас...

вот описание если что:
http://msdn2.microsoft.com/en-us/library/s...anagedtype.aspx

Добавлено через 9 минут и 3 секунды
попробуй так:

Код

[DllImport("libMach1.dll")] 
[return: MarshalAs(UnmanagedType.LPStruct)]
public static extern READER MAPI_Connect(string host,int k,ref MAPI_CONNECT_ERROR sl);


Это сообщение отредактировал(а) 0000 - 15.11.2007, 19:15
PM MAIL ICQ   Вверх
CYBERDREAM
Дата 15.11.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Ошибочка в итоге абсолютно та же, хотя по идее должно именно так работать,  smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
1stain
Дата 15.11.2007, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 8
Всего: 40



CYBERDREAM, у тебя в примере написано  public struct READER{};
в коде так же?



--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
CYBERDREAM
Дата 16.11.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



да, а в чем загвоздка то? в том, что стркутура пустая? на плюсах она так и представляется как и описано выше? или нужно иначе?


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
1stain
Дата 16.11.2007, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 8
Всего: 40



в структуре надо прописать ее поля. Например, COLORREF для того, чтобы принять его из unmanaged объявляется так
Код

[StructLayout(LayoutKind.Sequential)]
struct COLORREF {
   public byte R;
   public byte G;
   public byte B;
}

// Alternate
[StructLayout(LayoutKind.Sequential)]
public struct COLORREF
{
   public uint ColorDWORD;

   public COLORREF(System.Drawing.Color color)
   {
      ColorDWORD = (uint) color.R + (((uint) color.G) << 8) + (((uint) color.B) << 16);
   }

   public System.Drawing.Color GetColor()
   {
      return System.Drawing.Color.FromArgb((int) (0x000000FFU & ColorDWORD),
     (int) (0x0000FF00U & ColorDWORD) >> 8, (int) (0x00FF0000U & ColorDWORD) >> 16);
   }

   public void SetColor(System.Drawing.Color color)
   {
      ColorDWORD = (uint) color.R + (((uint) color.G) << 8) + (((uint) color.B) << 16);
   }
}


в принципе, методы можно не объявлять (первый вариант). Достаточно объявить в структуре все поля в таком же порядке и соответствующих типов, как в неуправляемом варианте (если структура содержит массивы там немного больше геморроя с их объявлением). И не забыть атрибут [StructLayout(LayoutKind.Sequential)]

можешь посмотреть здесь много примеров взаимодействия с unmanaged кодом : PInvoke.net
кстате COLORREF именно оттуда

Это сообщение отредактировал(а) 1stain - 16.11.2007, 09:26


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
CYBERDREAM
Дата 16.11.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Ок, если должны быть поля (я и сам такого мнения), то почему на плюсах их нету
Код

struct READER;


или я что-то не улавливаю

Это сообщение отредактировал(а) CYBERDREAM - 16.11.2007, 09:58


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
1stain
Дата 16.11.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 8
Всего: 40



честно сказать, я вообще в плюсах (т.е. в mapi.h) не нашел определения структуры READER. Насколько я понял, это какая-то сторонняя библиотека? Если есть исходники, то ты смотрел заголовочные файлы?


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
CYBERDREAM
Дата 16.11.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



вот что в mapi_control.h находится:

Код

#ifndef _MAPI_CONTROL_H_
#define _MAPI_CONTROL_H_

/* Declaration of the reader handle. */
struct READER;         

enum MAPI_ERROR
{
    /** The packet has an invalid start byte. */
    MAPI_ERROR_MSG_STARTBYTE,
    /** The packet has a malformed header. */
    MAPI_ERROR_MSG_HEADER,
    .....
};

............
DLLEXPORT unsigned int MAPI_GetLibraryVersion (void);
........
#endif


по документации собственно вот:
This file “mapi_control.h” defines a generic handle type for established connections between the application and the reader as follows.
Код

/* Declaration of the reader handle. */
struct READER;


Это сообщение отредактировал(а) CYBERDREAM - 16.11.2007, 10:49


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
CYBERDREAM
  Дата 16.11.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Работающий вариант:
Код

    public class PInvokeClient
    {
        [DllImport("libMach1.dll")] 
        public static extern IntPtr MAPI_Connect(string host,int k,ref MAPI_CONNECT_ERROR sl);

        public static int Main(string[] args)
        {
            IntPtr ptr=MAPI_Connect(_readerHost,0,ref connectResult);
            if(ptr==IntPtr.Zero)
            {
                Console.WriteLine("Failed to connect  {0}",_readerHost);
                ....
            }
            else
            {
                READER r=(READER)Marshal.PtrToStructure(ptr, typeof(READER));
                Marshal.DestroyStructure(ptr,typeof(READER));
            }
        }
    }

Спасибо большое 0000 и 1stain за помощь!!!


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0840 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.