Метод Marshal.AllocHGlobal(Int32) неправильно работает
От: Slider_spb Россия  
Дата: 08.12.16 11:10
Оценка:
Вызываю Marshal.AllocHGlobal(112) возвращается указатель на кусок памяти размером 2137607699712 байт.
Такая ситуация обнаружена только на Windows10 и Win2012 Server R2 (x64), на других ОС работает нормально.
Как победить данную проблему?
Re: Метод Marshal.AllocHGlobal(Int32) неправильно работает
От: VTT http://vtt.to
Дата: 08.12.16 11:37
Оценка:
Здравствуйте, Slider_spb, Вы писали:

S_>Вызываю Marshal.AllocHGlobal(112) возвращается указатель на кусок памяти размером 2137607699712 байт.

S_>Такая ситуация обнаружена только на Windows10 и Win2012 Server R2 (x64), на других ОС работает нормально.
S_>Как победить данную проблему?

А разве этот метод возвращает указатель? По идее он должен соответствовать GlobalAlloc.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[2]: Метод Marshal.AllocHGlobal(Int32) неправильно работает
От: Slider_spb Россия  
Дата: 08.12.16 11:46
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>Здравствуйте, Slider_spb, Вы писали:


S_>>Вызываю Marshal.AllocHGlobal(112) возвращается указатель на кусок памяти размером 2137607699712 байт.

S_>>Такая ситуация обнаружена только на Windows10 и Win2012 Server R2 (x64), на других ОС работает нормально.
S_>>Как победить данную проблему?
VTT>А разве этот метод возвращает указатель? По идее он должен соответствовать GlobalAlloc.
IntPtr возвращает в описании https://msdn.microsoft.com/ru-ru/library/s69bkh17(v=vs.110).aspx и в коде...
Re[3]: Метод Marshal.AllocHGlobal(Int32) неправильно работает
От: VTT http://vtt.to
Дата: 08.12.16 11:52
Оценка:
Здравствуйте, Slider_spb, Вы писали:

S_>Здравствуйте, VTT, Вы писали:


VTT>>Здравствуйте, Slider_spb, Вы писали:


S_>>>Вызываю Marshal.AllocHGlobal(112) возвращается указатель на кусок памяти размером 2137607699712 байт.

S_>>>Такая ситуация обнаружена только на Windows10 и Win2012 Server R2 (x64), на других ОС работает нормально.
S_>>>Как победить данную проблему?
VTT>>А разве этот метод возвращает указатель? По идее он должен соответствовать GlobalAlloc.
S_>IntPtr возвращает в описании https://msdn.microsoft.com/ru-ru/library/s69bkh17(v=vs.110).aspx и в коде...
Да, но смысл в том, что возвращаемый GlobalAlloc указатель на самом деле дескриптор, и для получения реального указателя из него надо вызывать GlobalLock (который может ничего и не далать).
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re: Метод Marshal.AllocHGlobal(Int32) неправильно работает
От: _Butch_  
Дата: 08.12.16 11:56
Оценка: +1
Здравствуйте, Slider_spb, Вы писали:

S_>Вызываю Marshal.AllocHGlobal(112) возвращается указатель на кусок памяти размером 2137607699712 байт.


А это вы как определили?

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("kernel32.dll")]
        static extern IntPtr GlobalSize(IntPtr h);

        static void Main(string[] args)
        {
            IntPtr p = Marshal.AllocHGlobal(112);
            IntPtr s = GlobalSize(p);

            System.Console.WriteLine("Size = " + s);
        }
    }
}


>Size = 112

Re[4]: Метод Marshal.AllocHGlobal(Int32) неправильно работает
От: Pavel Dvorkin Россия  
Дата: 08.12.16 12:10
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>Да, но смысл в том, что возвращаемый GlobalAlloc указатель на самом деле дескриптор, и для получения реального указателя из него надо вызывать GlobalLock (который может ничего и не далать).


В Win API, да, но здесь не надо

When AllocHGlobal calls LocalAlloc, it passes a LMEM_FIXED flag, which causes the allocated memory to be locked in place.

https://msdn.microsoft.com/ru-ru/library/s69bkh17(v=vs.110).aspx
With best regards
Pavel Dvorkin
Re[2]: Метод Marshal.AllocHGlobal(Int32) неправильно работает
От: кт  
Дата: 08.12.16 12:19
Оценка:
Здравствуйте, _Butch_, Вы писали:

_B_>Здравствуйте, Slider_spb, Вы писали:


_B_>А это вы как определили?


_B_>

>>Size = 112


[мечтательно] Эх, мне бы столько памяти....
Увы, это всего лишь начальный адрес 1F1B358FD00
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.