Форум: "WinAPI";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизПомогите перевести кусок С-шного кода. Найти похожие ветки
← →
Shiza © (2004-03-11 09:58) [0]Пожалуйста, если кто-нибудь знает как перевести на дельфи, ниже приведённый код, подскажите. А точнее интересует как перевести то, что стоит после слова union.
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {DWORD Characteristics;
DWORD OriginalFirstThunk;};
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name;
DWORD FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
← →
Shiza © (2004-03-11 09:58) [0]Пожалуйста, если кто-нибудь знает как перевести на дельфи, ниже приведённый код, подскажите. А точнее интересует как перевести то, что стоит после слова union.
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {DWORD Characteristics;
DWORD OriginalFirstThunk;};
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name;
DWORD FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
← →
Asdor © (2004-03-11 10:03) [1]Имхо Union здесь - аналог
Сase boolean of
true : Chadacteristic:DWORD;
false: OriginalFirstChunk:DWORD;
end;
← →
Asdor © (2004-03-11 10:03) [1]Имхо Union здесь - аналог
Сase boolean of
true : Chadacteristic:DWORD;
false: OriginalFirstChunk:DWORD;
end;
← →
Игорь Шевченко © (2004-03-11 10:05) [2]А ты без union переводи :)
Я уже много лет пользуюсь таким описанием, на грабли не наступалPIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
IMAGE_IMPORT_DESCRIPTOR = packed record
Characteristics : Cardinal; // 0 for terminating null import descriptor
// RVA to original unbound IAT (PIMAGE_THUNK_DATA)
TimeDateStamp : Cardinal; // 0 if not bound,
// -1 if bound, and real date\time stamp
// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)
ForwarderChain : Cardinal; // -1 if no forwarders
Name : Cardinal;
FirstThunk : Cardinal; // RVA to IAT (if bound this IAT has actual addresses)
end;
← →
Игорь Шевченко © (2004-03-11 10:05) [2]А ты без union переводи :)
Я уже много лет пользуюсь таким описанием, на грабли не наступалPIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
IMAGE_IMPORT_DESCRIPTOR = packed record
Characteristics : Cardinal; // 0 for terminating null import descriptor
// RVA to original unbound IAT (PIMAGE_THUNK_DATA)
TimeDateStamp : Cardinal; // 0 if not bound,
// -1 if bound, and real date\time stamp
// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)
ForwarderChain : Cardinal; // -1 if no forwarders
Name : Cardinal;
FirstThunk : Cardinal; // RVA to IAT (if bound this IAT has actual addresses)
end;
← →
Shiza © (2004-03-11 13:00) [3]>Игорь Шевченко © (11.03.04 10:05) [2]
>А ты без union переводи :)
>Я уже много лет пользуюсь таким описанием, на грабли не наступал
А я наступил, поэтому и спрашиваю.
Asdor - спасибо за ответ, попробую перевести так.
← →
Shiza © (2004-03-11 13:00) [3]>Игорь Шевченко © (11.03.04 10:05) [2]
>А ты без union переводи :)
>Я уже много лет пользуюсь таким описанием, на грабли не наступал
А я наступил, поэтому и спрашиваю.
Asdor - спасибо за ответ, попробую перевести так.
← →
Игорь Шевченко © (2004-03-11 14:31) [4]Shiza © (11.03.04 13:00)
> А я наступил, поэтому и спрашиваю.
Ну и что тебе даст перевод с Union ?
← →
Игорь Шевченко © (2004-03-11 14:31) [4]Shiza © (11.03.04 13:00)
> А я наступил, поэтому и спрашиваю.
Ну и что тебе даст перевод с Union ?
← →
KSergey © (2004-03-11 14:46) [5]> [4] Игорь Шевченко © (11.03.04 14:31)
Думаю, у него была явная ошибка неадекватного перевода. Если бы он опубликовал свой вариант - был бы предметный разговор.
PS
Зачем одинакового размера данные в union запихивать?? Для красоты?
← →
KSergey © (2004-03-11 14:46) [5]> [4] Игорь Шевченко © (11.03.04 14:31)
Думаю, у него была явная ошибка неадекватного перевода. Если бы он опубликовал свой вариант - был бы предметный разговор.
PS
Зачем одинакового размера данные в union запихивать?? Для красоты?
← →
Игорь Шевченко © (2004-03-11 15:03) [6]KSergey © (11.03.04 14:46)
> Зачем одинакового размера данные в union запихивать?? Для
> красоты?
Для удобочитаемости кода программы :) Тоже немаловажно
← →
Игорь Шевченко © (2004-03-11 15:03) [6]KSergey © (11.03.04 14:46)
> Зачем одинакового размера данные в union запихивать?? Для
> красоты?
Для удобочитаемости кода программы :) Тоже немаловажно
← →
Shiza © (2004-03-11 15:05) [7]Я перевёл так:
type
PIMAGEIMPORTDESCRIPTOR = ^TIMAGEIMPORTDESCRIPTOR;
_IMAGE_IMPORT_DESCRIPTOR = packed record
//Characteristics: DWORD;
OriginalFirstThunk: DWORD;
TimeDateStamp : DWORD;
ForwarderChain : DWORD;
Name : DWORD;
FirstThunk : DWORD;
end;
TIMAGEIMPORTDESCRIPTOR = _IMAGE_IMPORT_DESCRIPTOR;
{$EXTERNALSYM IMAGE_IMPORT_DESCRIPTOR}
IMAGE_IMPORT_DESCRIPTOR = _IMAGE_IMPORT_DESCRIPTOR;
А как правильно?
>Зачем одинакового размера данные в union запихивать?? Для >красоты?
Если запихивают значит надо... Кстати вариант Asdor не подошёл.
← →
Shiza © (2004-03-11 15:05) [7]Я перевёл так:
type
PIMAGEIMPORTDESCRIPTOR = ^TIMAGEIMPORTDESCRIPTOR;
_IMAGE_IMPORT_DESCRIPTOR = packed record
//Characteristics: DWORD;
OriginalFirstThunk: DWORD;
TimeDateStamp : DWORD;
ForwarderChain : DWORD;
Name : DWORD;
FirstThunk : DWORD;
end;
TIMAGEIMPORTDESCRIPTOR = _IMAGE_IMPORT_DESCRIPTOR;
{$EXTERNALSYM IMAGE_IMPORT_DESCRIPTOR}
IMAGE_IMPORT_DESCRIPTOR = _IMAGE_IMPORT_DESCRIPTOR;
А как правильно?
>Зачем одинакового размера данные в union запихивать?? Для >красоты?
Если запихивают значит надо... Кстати вариант Asdor не подошёл.
← →
Игорь Шевченко © (2004-03-11 15:18) [8]
> Если запихивают значит надо...
Да ты не темни, тут все свои. Что за грабли-то ?
← →
Игорь Шевченко © (2004-03-11 15:18) [8]
> Если запихивают значит надо...
Да ты не темни, тут все свои. Что за грабли-то ?
← →
Shiza © (2004-03-11 15:33) [9]Да чё темнить, вот строка кода:
Copymemory(FreePtr,ImportTable,sizeof(IMAGE_IMPORT_DESCRIPTOR)*DLLCounter);
тут и ошибку выдаёт.
В чём проблема, может я не на то грешу.
← →
Shiza © (2004-03-11 15:33) [9]Да чё темнить, вот строка кода:
Copymemory(FreePtr,ImportTable,sizeof(IMAGE_IMPORT_DESCRIPTOR)*DLLCounter);
тут и ошибку выдаёт.
В чём проблема, может я не на то грешу.
← →
Игорь Шевченко © (2004-03-11 16:37) [10]
> В чём проблема, может я не на то грешу.
Не на то.
← →
Игорь Шевченко © (2004-03-11 16:37) [10]
> В чём проблема, может я не на то грешу.
Не на то.
← →
evvcom (2004-03-11 16:39) [11]
> Кстати вариант Asdor не подошёл.
Вариантные записи Дельфи позволяет размещать только в конце записи, поэтому и не подошел. С некоторыми ухищрениями можно сделать, так что в этом Asdor прав.
> Copymemory(FreePtr,ImportTable,sizeof(IMAGE_IMPORT_DESCRIPTOR)*DLLCounter);
И где здесь Characteristics или OriginalFirstThunk, из за которых "грабли"?
← →
evvcom (2004-03-11 16:39) [11]
> Кстати вариант Asdor не подошёл.
Вариантные записи Дельфи позволяет размещать только в конце записи, поэтому и не подошел. С некоторыми ухищрениями можно сделать, так что в этом Asdor прав.
> Copymemory(FreePtr,ImportTable,sizeof(IMAGE_IMPORT_DESCRIPTOR)*DLLCounter);
И где здесь Characteristics или OriginalFirstThunk, из за которых "грабли"?
← →
Shiza © (2004-03-11 16:45) [12]>И где здесь Characteristics или OriginalFirstThunk, из за >которых "грабли"?
А вот они - sizeof(IMAGE_IMPORT_DESCRIPTOR), из-за этого у меня получаются неправильные вычисления.
← →
Shiza © (2004-03-11 16:45) [12]>И где здесь Characteristics или OriginalFirstThunk, из за >которых "грабли"?
А вот они - sizeof(IMAGE_IMPORT_DESCRIPTOR), из-за этого у меня получаются неправильные вычисления.
← →
pasha_golub © (2004-03-11 17:00) [13]Shiza © (11.03.04 16:45) [12]
НЕ тут ошибки не будет. sixeof правильно отработает
← →
pasha_golub © (2004-03-11 17:00) [13]Shiza © (11.03.04 16:45) [12]
НЕ тут ошибки не будет. sixeof правильно отработает
← →
Игорь Шевченко © (2004-03-11 17:01) [14]Shiza © (11.03.04 16:45)
А отладчик человеку на что в руки даден, чтобы посмотреть по месту, чему равно число копируемых байт ?
← →
Игорь Шевченко © (2004-03-11 17:01) [14]Shiza © (11.03.04 16:45)
А отладчик человеку на что в руки даден, чтобы посмотреть по месту, чему равно число копируемых байт ?
← →
evvcom (2004-03-11 17:05) [15]
> А вот они - sizeof(IMAGE_IMPORT_DESCRIPTOR), ...
Судя по [7]:
> _IMAGE_IMPORT_DESCRIPTOR = packed record
> //Characteristics: DWORD;
> OriginalFirstThunk: DWORD;
все нормально. Вот если комментарий убрать, то да - размер другой. А как предложил Игорь Шевченко - размер не меняется. Так в чем же "грабли"?
← →
evvcom (2004-03-11 17:05) [15]
> А вот они - sizeof(IMAGE_IMPORT_DESCRIPTOR), ...
Судя по [7]:
> _IMAGE_IMPORT_DESCRIPTOR = packed record
> //Characteristics: DWORD;
> OriginalFirstThunk: DWORD;
все нормально. Вот если комментарий убрать, то да - размер другой. А как предложил Игорь Шевченко - размер не меняется. Так в чем же "грабли"?
← →
pasha_golub © (2004-03-11 17:09) [16]Надо поболее кода. однозначно.
← →
pasha_golub © (2004-03-11 17:09) [16]Надо поболее кода. однозначно.
← →
Shiza © (2004-03-11 17:26) [17]>А как предложил Игорь Шевченко - размер не меняется.
Да? А как он предложил:
PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
IMAGE_IMPORT_DESCRIPTOR = packed record
Characteristics : Cardinal;
TimeDateStamp : Cardinal;
ForwarderChain : Cardinal;
Name : Cardinal;
FirstThunk : Cardinal;
end;
То же что и у меня, только первый параметр у меня не Characteristics, а OriginalFirstThunk. Так чем отличается от моего?
← →
Shiza © (2004-03-11 17:26) [17]>А как предложил Игорь Шевченко - размер не меняется.
Да? А как он предложил:
PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
IMAGE_IMPORT_DESCRIPTOR = packed record
Characteristics : Cardinal;
TimeDateStamp : Cardinal;
ForwarderChain : Cardinal;
Name : Cardinal;
FirstThunk : Cardinal;
end;
То же что и у меня, только первый параметр у меня не Characteristics, а OriginalFirstThunk. Так чем отличается от моего?
← →
evvcom (2004-03-11 23:42) [18]
> Так чем отличается от моего?
Да ни чем, ёлы-палы! Просто [2] было раньше, чем [7], а в [3] было про какое-то наступление на "грабли":
> А я наступил, поэтому и спрашиваю.
Всё, я умываю руки. Надоело.
← →
evvcom (2004-03-11 23:42) [18]
> Так чем отличается от моего?
Да ни чем, ёлы-палы! Просто [2] было раньше, чем [7], а в [3] было про какое-то наступление на "грабли":
> А я наступил, поэтому и спрашиваю.
Всё, я умываю руки. Надоело.
← →
Shiza © (2004-03-12 11:15) [19]Да помогите хоть кто-нибудь. Кстати, Borland то не перевёл эту структуру, интересно почему? Нужели придётся по-другому карачиться?
← →
Shiza © (2004-03-12 11:15) [19]Да помогите хоть кто-нибудь. Кстати, Borland то не перевёл эту структуру, интересно почему? Нужели придётся по-другому карачиться?
← →
Игорь Шевченко © (2004-03-12 11:28) [20]
> Да помогите хоть кто-нибудь
Отладчик тебе поможет. Сам бы давно уже посмотрел все, где ты вылетаешь, и нам бы рассказал.
← →
Игорь Шевченко © (2004-03-12 11:28) [20]
> Да помогите хоть кто-нибудь
Отладчик тебе поможет. Сам бы давно уже посмотрел все, где ты вылетаешь, и нам бы рассказал.
← →
интересующийся (2004-03-12 11:35) [21]may be:
сhar_desc = packed record
case Boolean of
true: (Characteristics : Cardinal);
false: (Characteristics1 : Cardinal);
end;
IMAGE_IMPORT_DESCRIPTOR = packed record
Characteristics : char_desc; // 0 for terminating null import descriptor
// RVA to original unbound IAT (PIMAGE_THUNK_DATA)
TimeDateStamp : Cardinal; // 0 if not bound,
// -1 if bound, and real date\time stamp
// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)
ForwarderChain : Cardinal; // -1 if no forwarders
Name : Cardinal;
FirstThunk : Cardinal; // RVA to IAT (if bound this IAT has actual addresses)
end;
PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
← →
интересующийся (2004-03-12 11:35) [21]may be:
сhar_desc = packed record
case Boolean of
true: (Characteristics : Cardinal);
false: (Characteristics1 : Cardinal);
end;
IMAGE_IMPORT_DESCRIPTOR = packed record
Characteristics : char_desc; // 0 for terminating null import descriptor
// RVA to original unbound IAT (PIMAGE_THUNK_DATA)
TimeDateStamp : Cardinal; // 0 if not bound,
// -1 if bound, and real date\time stamp
// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)
ForwarderChain : Cardinal; // -1 if no forwarders
Name : Cardinal;
FirstThunk : Cardinal; // RVA to IAT (if bound this IAT has actual addresses)
end;
PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
← →
Ray Adams (2004-03-13 16:10) [22]Ненадо забыать что под Си есть алймент и потому иногда при переводе на Паскаль приходится лепить лишние байты. У меня было тоже самое , вот пример.
typedef struct
{
PHYSICAL_ADDRESS theBusAddress; // Bus-relative address
ULONG theLength; // Length of section to map
} PHYSICAL_MEMORY_INFO, *PPHYSICAL_MEMORY_INFO;
в нем PHYSICAL_ADDRESS это LONGLONG с использованием union тоесть на Дельфи int64, sizeof выдавал 12, а под Си выдавал 16!!! Я столько мочался но так и не понял. Пообщавщись с Сишником понял, что Си делает алаймент и получается 16, тоесть 4 байта в конец приписываются
PHYSICAL_MEMORY_INFO=record
theBusAddress:PHYSICAL_ADDRESS;
theLength:dword;
dust:dword;
end;
вот так когда перевел, все заработало.
← →
Ray Adams (2004-03-13 16:10) [22]Ненадо забыать что под Си есть алймент и потому иногда при переводе на Паскаль приходится лепить лишние байты. У меня было тоже самое , вот пример.
typedef struct
{
PHYSICAL_ADDRESS theBusAddress; // Bus-relative address
ULONG theLength; // Length of section to map
} PHYSICAL_MEMORY_INFO, *PPHYSICAL_MEMORY_INFO;
в нем PHYSICAL_ADDRESS это LONGLONG с использованием union тоесть на Дельфи int64, sizeof выдавал 12, а под Си выдавал 16!!! Я столько мочался но так и не понял. Пообщавщись с Сишником понял, что Си делает алаймент и получается 16, тоесть 4 байта в конец приписываются
PHYSICAL_MEMORY_INFO=record
theBusAddress:PHYSICAL_ADDRESS;
theLength:dword;
dust:dword;
end;
вот так когда перевел, все заработало.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.033 c