Форум: "Прочее";
Текущий архив: 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