Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.23;
Скачать: CL | DM;

Вниз

Про компилятор   Найти похожие ветки 

 
_Mike_   (2007-08-11 00:30) [40]


> oxffff ©   (11.08.07 00:27) [39]

Я это [27] третьи сутки наблюдаю...

Как положено - 0012F304

нет. там не ret 8


 
oxffff ©   (2007-08-11 00:36) [41]


> Как положено - 0012F304
>
> нет. там не ret 8


Так не положено. См [34]

Адрес возврата  0012F300


 
oxffff ©   (2007-08-11 00:39) [42]

Все проблемы в DLL


 
_Mike_   (2007-08-11 00:43) [43]


> Адрес возврата  0012F300

Он там и будет ПОСЛЕ входа в процедуру а не

> до вызова call [_BT_GetLocalDeviceInfo]



> Все проблемы в DLL

Нету там проблемы.... В этом все горе....


 
_Mike_   (2007-08-11 00:48) [44]


> Все проблемы в DLL

Проблемма в том, как дельфя выравняла структуру. Она должна была ее выровнять до 132 (длина) а выровняла до 124.


 
oxffff ©   (2007-08-11 00:49) [45]


> _Mike_   (11.08.07 00:43) [43]
>
> > Адрес возврата  0012F300
>
> Он там и будет ПОСЛЕ входа в процедуру а не
>
> > до вызова call [_BT_GetLocalDeviceInfo]


Приведи код вызова и значение ESP перед вызовом(т.е на  call, но не после него) . и Далее esp на ret но не после ret

Инструкции вызова и 5 последних инструкций возврата


 
oxffff ©   (2007-08-11 01:01) [46]


> Она должна была ее выровнять до 132 (длина) а выровняла
> до 124.


Скажите сколько физически занимает структура в С++?


 
oxffff ©   (2007-08-11 01:02) [47]

Я опять повторяю вопрос из [28].
Желаю другой ответ, а не [29]


 
oxffff ©   (2007-08-11 01:09) [48]

>Проблемма в том, как дельфя выравняла структуру. Она должна была ее >выровнять до 132 (длина) а выровняла до 124.

Если структура занимает физически в С++ 132. А в Delphi 124. То это две разные структуры. Соотвествие полей нет.


 
oxffff ©   (2007-08-11 01:13) [49]

У вас есть как минимум хороший шанс перетереть адрес переданной структуры и адрес возврата из BT_GetLocalDeviceInfo.

Кстати это проблемы не Delphi. Это проблемы С++. ;)

Проблемы вы создали сами.

Ничего бывает.

Все спокойной ночи.


 
Германн ©   (2007-08-11 01:14) [50]


> Проблемма в том, как дельфя выравняла структуру. Она должна
> была ее выровнять до 132 (длина) а выровняла до 124.
>

Что значит "должна была"?
124 получится в случае packed record или {$A-}, {$A1}.
132 получится с случае {$A4}.
А какие опции компилятора в твоём проекте?


 
_Mike_   (2007-08-11 01:37) [51]


> Если структура занимает физически в С++ 132

124 она в C (еще раз - нету там C++)


 
_Mike_   (2007-08-11 01:38) [52]


> 124 получится в случае packed record или {$A-}, {$A1}.

117

> 132 получится с случае {$A4}.
> А какие опции компилятора в твоём проекте?

124
по умолчанию (A8)


 
Германн ©   (2007-08-11 01:56) [53]


> _Mike_   (11.08.07 01:38) [52]
>
>

Наверно у меня другая арифметика :)


 
Германн ©   (2007-08-11 02:30) [54]


> _Mike_   (11.08.07 01:38) [52]
>
>

Да, кстати. При
> по умолчанию (A8)
структура она же запись
> BLUETOOTH_DEVICE_INFO_EX = record
>    dwSize:          DWORD; 8
>    address:         array [0..DEVICE_ADDRESS_LENGTH - 1]
> of Byte; +8=16
>    classOfDevice:   array [0..DEVICE_CLASS_LENGTH - 1] of
> Byte; +8=24
>    szName:          array [0..MAX_DEVICE_NAME_LENGTH - 1]
> of Char; +64=88
>    bPaired:         BOOL; +8=96
>    ucLmpVersion:    UCHAR; +8=104
>    wManuName:       Word; +8=112
>    wLmpSubversion:  Word; +8=120
>    reserved:        array [0..15] of Byte; +16=136
>    wClockOffset:    Word; +8=144
>    bConnected:      BOOL; +8=152
>    dwDataRecvBytes: DWORD; +8=160
>    dwDataSentBytes: DWORD; +8=168
>    cSignalStrength: Char; +8=176
>  end;
>

должна была бы занять в памяти 172 байта.


 
Германн ©   (2007-08-11 03:11) [55]


> Германн ©   (11.08.07 02:30) [54]
>
>

Очепятка.
176 байт ессно!


 
_Mike_   (2007-08-11 09:54) [56]


> Германн ©   (11.08.07 03:11) [55]

Я не буду чего-то доказывать - я вижу что считает дельфи.
при A4 и A8 - 124
при packed = 117 (что очень просто пощитать сложением). Может вы в восьмеричной считаете - бог Вас знаете.
Но IMHO прежде чем что-то утверждать е поленитесь запустить дельфи, вставить туда объявление структуры и написать SizeOf - Вы будете удивлены.

P.S. A8, A4 - не размер, выделяемый каждому элементу, а граница, по которой будет выравниваться структура (long/long long).

P.P.S. Простейщая программка, написанная за 3 минуты - покажет Вам смещение полей структуры тносительно ее начала.


 
oxffff ©   (2007-08-11 11:39) [57]


> _Mike_   (11.08.07 09:54) [56]


Я тебе еще раз вопрос задаю. Сколько занимает физически (в памяти) структура  на С и на Delphi (Сколько показывает Sizeof там и там)?


 
isasa ©   (2007-08-11 11:48) [58]

:)
124
Причем с А4 и А8 (в D7).
Как вариант "выровнять" ручками до 132.


 
Anatoly Podgoretsky ©   (2007-08-11 14:27) [59]

> isasa  (11.08.2007 11:48:58)  [58]

Какое то бардачное обсуждение со стороны автора, правда соответствует конференции.


 
isasa ©   (2007-08-11 14:50) [60]

Anatoly Podgoretsky ©   (11.08.07 14:27) [59]
Там действительно по опции $A8 в полях Word не происходит выравнивания на 8 байт. В структуре отведено 4. Видно в окошке CPU - распределение памяти(нижнее, GoToAddress).
С этой фигней я сталкивался еще когда надо было перетянуть старые ст-ры из под TP5 в Delphi. Пришлось искать Tp и писать конвертер в нем. :)
Но это не было большой трагедией.


 
isasa ©   (2007-08-11 14:51) [61]

Да, вышесказанное относится к D7.


 
Anatoly Podgoretsky ©   (2007-08-11 15:44) [62]

> isasa  (11.08.2007 14:50:00)  [60]

Но хотя бы включить проверку границ не помешает.


 
_Mike_   (2007-08-12 00:17) [63]


> Я тебе еще раз вопрос задаю. Сколько занимает физически
> (в памяти) структура  на С и на Delphi (Сколько показывает
> Sizeof там и там)?

Я уже раз 10 написал размеры структур и в сях и в дельфе.


> Какое то бардачное обсуждение со стороны автора, правда
> соответствует конференции.

И что там бардачного???


> Да, вышесказанное относится к D7.

И D6 и прочим.


> Но хотя бы включить проверку границ не помешает.

Смысл?


 
Piter ©   (2007-08-12 00:44) [64]

_Mike_   (12.08.07 0:17) [63]
Я уже раз 10 написал размеры структур и в сях и в дельфе


все таки ты бы мог еще раз написать четко, сколько показывает Sizeof и там, и там. Просто два числа, без ошибок. Не думаю, что это сложно.


 
oxffff ©   (2007-08-12 10:41) [65]


> _Mike_   (12.08.07 00:17) [63]
>
> > Я тебе еще раз вопрос задаю. Сколько занимает физически
>
> > (в памяти) структура  на С и на Delphi (Сколько показывает
>
> > Sizeof там и там)?
>
> Я уже раз 10 написал размеры структур и в сях и в дельфе.
>


Я уже который раз повторяю, что если у тебя структура в delphi занимает 124 байта (c учетом выравнивания), то что sizeof возвращает.
А в external процедуре занимает 132 байта (c учетом выравнивания), то
перезатирание адреса возврата и одного из переданных параметров (а именно адреса структуры) гарантировано, если между ними "нет других переменных".

Тебе уже сказали выравнивай структуры в ручную.

Читай [28] и свой ответ [29].

Cтек

Адрес1:  {
            BLUETOOTH_DEVICE_INFO_EX  124 байта
            }
            адрес возврата в Getname
            Адрес1 (var Параметр pDevInfo);
            dwMask;
            адрес возврата в BT_GetLocalDeviceInfo

Если ты перетираешь адрес возврата в Getname это одно.
А если Адрес1 перетираешь (фактически локальный параметр из external процедуры ), то функция может вообще перетирать во произвольному адресу все что хочешь.
Все это делает твоя external процедура.

Надеюсь ты опять не понял.
Буду рад в очередной раз написать тебе тоже самое.


 
oxffff ©   (2007-08-12 10:47) [66]


> Надеюсь ты опять не понял.
> Буду рад в очередной раз написать тебе тоже самое.


Если не понял, не беда.
Я постараюсь тебе подробнее написать с примером.


 
Stijn   (2007-08-23 17:09) [67]

Hi, I"m trying to use btfunc.dll with Delphi also, but I get 2 (BTSTATUS_SYSTEM_ERROR) from BT_GetLocalDeviceInfo for some strange reason. I tried "packed record" also, but doesn"t help. Strange. BT_InitializeLibrary, BT_IsBlueSoleilStarted and BT_GetVersion work though.

Did you find any solution?



Страницы: 1 2 вся ветка

Текущий архив: 2007.09.23;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.026 c
2-1187854315
raidersk8
2007-08-23 11:31
2007.09.23
печать stringgrid


2-1188239457
hprx
2007-08-27 22:30
2007.09.23
Menu


15-1187850060
БарЛог
2007-08-23 10:21
2007.09.23
Linux, Fedora6, Grub, смена загрузки ОС по умолчанию


8-1164715092
Nizam
2006-11-28 14:58
2007.09.23
Перемотка аудиофайла


2-1188277836
MultIfleX
2007-08-28 09:10
2007.09.23
Ini