Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
_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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.061 c
9-1143015328
Nic
2006-03-22 11:15
2007.09.23
Шейдеры: с чего начать?


15-1187157030
Alien1769
2007-08-15 09:50
2007.09.23
КМП-2007


15-1187801365
ferr
2007-08-22 20:49
2007.09.23
Бука.


15-1187874286
SerJaNT
2007-08-23 17:04
2007.09.23
Программа для показа прогноза погоды


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский