Указатели в dll long или int?

 

Допустим у меня в dll есть функция (неважно какая главная чтобы она возвращала указатель):

_DLLAPI int __stdcall CreateTestSemaphore()
{
   HANDLE  hSemaphore = CreateSemaphore(NULL, 0, 3, NULL);        
   return (int)hSemaphore ;
}

 Тут все в порядке: для 64 битной винды int 8 байт для 32 он 4 байта. Верно?

В mql5 int - 4 байта, а long - 8 байт. Логично предположить, что функция в mql должна выглядить как-то так 

#import "some.dll"
   long  CreateTestSemaphore();
#import

Но на практике на моей 32битной винде получаются числа вроде 564919178746661772. Если вместо long использовать int, то, как понимаете, все работает, но 32х-битный указатель неприменим для 64х-битной системы. 

Как решить проблему? Может я что-то упустил? По идее int в long должен конвертиться без проблем, там же нет потерь данных...

 
GarF1eld писал(а)  :

Тут все в порядке: для 64 битной винды int 8 байт для 32 он 4 байта. Верно?

Не верно.

В Win32 и Win64 sizeof(int) = sizeof(long) = 4 байтам ради глобальной совместимости(фактически пожертвовали лонгом), а в MQL5 используется более жесткое разграничение sizeof(int) = 4 и sizeof(long) = 8 байт.

Когда пишите связки MQL5 + DLL, всегда аккуратно используйте (лучше не используйте, ибо функционально он дублирующийся/лишний) тип long.

Из документации "Справочник MQL5 / Основы языка / Типы данных / Целые типы / Типы char, short, int и long"

  • char - Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127.
  • uchar - Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar предназначен только для положительных значений. Минимальное значение равно нулю, максимальное значение равно 255. Первая буква u в названии типа uchar является сокращением слова unsigned(беззнаковый).
  • short - Целый тип short имеет размер 2 байта(16 бит) и, соответственно, позволяет выразить множество значений равное 2 в степени 16:  2^16=65 536. Так как тип short является знаковым  и содержит как положительные, так и отрицательные значения, то диапазон значений находится между -32 768 и 32 767.
  • ushort - Беззнаковым типом short является тип ushort, который также имеет размер 2 байта. Минимальное значение равно 0, максимальное значение 65 535.
  • int - Целый тип int имеет размер 4 байта (32 бита). Минимальное значение -2 147 483 648, максимальное значение  2 147 483 647.
  • uint - Беззнаковый целый тип uint занимает в памяти 4 байта и позволяет выражать целочисленные значения от 0 до 4 294 967 295.
  • long - Целый тип long имеет размер 8 байт (64 бита). Минимальное значение -9 223 372 036 854 775 808, максимальное значение 9 223 372 036 854 775 807.
  • ulong - Целый тип ulong также занимает 8 байт и позволяет хранить значения от 0 до 18 446 744 073 709 551 615.

 
Спасибо, теперь на стороне dll использую тип long long, а в mql long. Полет нормальный
Причина обращения: