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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinAPI and Pointers(указатели), WinAPI and Pointers(указатели) 
:(
    Опции темы
Flenger
Дата 9.11.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 24.6.2006

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



Доброе время суток!!!

меня мучает одна штука

хочу роботу с WinAPI сделать с указателями.

вот есть метод 

Код

GetLogicalDriveStrings Function

Fills a buffer with strings that specify valid drives in the system.


DWORD WINAPI GetLogicalDriveStrings(
  __in          DWORD nBufferLength,
  __out         LPTSTR lpBuffer
);


на C# правильно определять нужно так
Код

[DllImport("kernel32.dll")]
        static extern uint GetLogicalDriveStrings(uint nBufferLength, [Out] char lpBuffer);


для проверки прошу

теперь переписываю с указателями

Код

[DllImport("kernel32.dll")]
        static unsafe extern uint* GetLogicalDriveStrings(uint nBufferLength, [Out] char* lpBuffer);

        static unsafe void Main(string[] args)
        {
            // unsafe code
            char* buffer2 = stackalloc char[512];
            uint* code2 = GetLogicalDriveStrings(512, buffer2);

            if (code2 == null)
            {
                Console.WriteLine("Call failed");
                return;
            }

            uint kk = *code2; // тут вываливаюсь System.NullReferenceException


в итоге вываливаюсь на System.NullReferenceException 

и пробегал по масиву buffer2 - он пустой.

в чем проблема ??? возможно в С# вообще нельзя в DllImport роботать с указателями ? 
PM MAIL   Вверх
Flenger
Дата 10.11.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 24.6.2006

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



проверил через 

int error = Marshal.GetLastWin32Error();

Код

char* buffer = stackalloc char[512];
uint* code = GetLogicalDriveStrings(size, buffer);

int error = Marshal.GetLastWin32Error();


то возвращает 0. типа ошибки при вызове нету...

Это сообщение отредактировал(а) Flenger - 10.11.2009, 00:38
PM MAIL   Вверх
Partizan
Дата 10.11.2009, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



IntPtr надо юзать, а не char*


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Flenger
Дата 10.11.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 24.6.2006

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



Partizan почему надо юзать IntPtr ?
PM MAIL   Вверх
Partizan
Дата 11.11.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



ну я обычно юзаю IntPtr, а затем через хелпер-метод класса Marshal получаю строку...

хотя pinvoke.net выдаёт такой вариант:

Код

static extern uint GetLogicalDriveStrings(uint nBufferLength, [Out] char[] lpBuffer);
.

    uint code = GetLogicalDriveStrings(size, buffer);



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LoginOFF
Дата 15.11.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 15.11.2009

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



Доброго времени суток!

У меня есть DLL, а в ней процедура, которая возвращает указатель на массив байт....

как мне использовать этот указатель в С#, чтобы получить доступ к этому массиву????

подскажите как правильно загрузить длл-ку... через dllimport

можно использовать unsafe  и fixed ...


Это сообщение отредактировал(а) LoginOFF - 15.11.2009, 12:54
PM MAIL   Вверх
KuMa1104
Дата 15.11.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 3



LoginOFF жтобы тебе использовать в мине net  unsafe  код надо воспользоваться классами Marshal

Код

public: void My_Player_Class::AddBufferToPlay(array<Byte>^ managedArray)
        {
            //int return_buf_len = m_pDecoder->Decod_buf_lenght* m_pDecoder->Koafficent_Zgatia;
            int return_buf_len = managedArray->Length;
            if(m_pDecoder->Global_File_data_Lenght < return_buf_len)
            {
                return_buf_len = m_pDecoder->Global_File_data_Lenght;
                //System::Windows::Forms::MessageBox::Show("Внимание длина фаила меньше 1 секунды");
                
            }
            
            int size = Marshal::SizeOf(managedArray[0]) * managedArray->Length;
            IntPtr pnt = Marshal::AllocHGlobal(size);

            try
            {
                memset(pnt.ToPointer(),0,size);
                //закидываем WAVEFORMATEX

                // Copy the array to unmanaged memory.
                Marshal::Copy(managedArray, 0, pnt , managedArray->Length);
                m_pMy_Player->AddBuffer(pnt.ToPointer(),return_buf_len);
                
            }
            finally
            {
                // Free the unmanaged memory.
                Marshal::FreeHGlobal(pnt);
            }

        }



--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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