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

Вниз

Помогите перевести кусок С-шного кода.   Найти похожие ветки 

 
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;


 
Игорь Шевченко ©   (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 - спасибо за ответ, попробую перевести так.


 
Игорь Шевченко ©   (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 запихивать?? Для красоты?


 
Игорь Шевченко ©   (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 не подошёл.


 
Игорь Шевченко ©   (2004-03-11 15:18) [8]


> Если запихивают значит надо...


Да ты не темни, тут все свои. Что за грабли-то ?


 
Shiza ©   (2004-03-11 15:33) [9]

Да чё темнить, вот строка кода:
Copymemory(FreePtr,ImportTable,sizeof(IMAGE_IMPORT_DESCRIPTOR)*DLLCounter);
тут и ошибку выдаёт.
В чём проблема, может я не на то грешу.


 
Игорь Шевченко ©   (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, из за которых "грабли"?


 
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 правильно отработает


 
Игорь Шевченко ©   (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;

все нормально. Вот если комментарий убрать, то да - размер другой. А как предложил Игорь Шевченко - размер не меняется. Так в чем же "грабли"?


 
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. Так чем отличается от моего?


 
evvcom   (2004-03-11 23:42) [18]


> Так чем отличается от моего?


Да ни чем, ёлы-палы! Просто [2] было раньше, чем [7], а в [3] было про какое-то наступление на "грабли":

> А я наступил, поэтому и спрашиваю.

Всё, я умываю руки. Надоело.


 
Shiza ©   (2004-03-12 11:15) [19]

Да помогите хоть кто-нибудь. Кстати, Borland то не перевёл эту структуру, интересно почему? Нужели придётся по-другому карачиться?


 
Игорь Шевченко ©   (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;


 
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 вся ветка

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

Наверх




Память: 0.53 MB
Время: 0.069 c
3-1081854163
Назаров Евгений
2004-04-13 15:02
2004.04.11
SQL


4-1072815289
stasSSW
2003-12-30 23:14
2004.04.11
Как завершить работу приложения


14-1082106240
nikitos
2004-04-16 13:04
2004.04.11
Кому не лень...


1-1080143689
Maverick
2004-03-24 18:54
2004.04.11
Симплекс-метод


7-1079093913
Arm79
2004-03-12 15:18
2004.04.11
Перехват системных комбинаций клавиш для скринсайвера