Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.035 c
4-1079444425
BillyJeans
2004-03-16 16:40
2004.05.09
Окно без title bar...


3-1081528134
iov13
2004-04-09 20:28
2004.05.09
MSSQL & ADO


1-1082447210
SerSar
2004-04-20 11:46
2004.05.09
Разрыв страницы в Excel


14-1082526692
VID
2004-04-21 09:51
2004.05.09
Как перевести FAT32 в NTFS


1-1082824363
Я Ламер
2004-04-24 20:32
2004.05.09
Классы и TObject





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский