Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите перевести с С


@!!ex ©   (2008-09-27 17:38:00) 

typedef void (__cdecl * PFUNCPLUGINCMD)();
typedef struct {
char _itemName[itemNameMaxLen];
PFUNCPLUGINCMD _pFunc;
int _cmdID;
bool _init2Check;
} FuncItem;


Сделал вот так вот(видимо неправильно):
 FUNCPLUGINCMD =procedure(); cdecl;
 PFUNCPLUGINCMD =^FUNCPLUGINCMD;

 TFuncItem = record
  _itemName:string[itemNameMaxLen];
  _pFunc:PFUNCPLUGINCMD;
  _cmdID:integer;
  _init2Check:BOOL;
 end;

 PFuncItem = ^TFuncItem;


@!!ex   (2008-09-27 18:35:00) [1]

и структура FuncItem на 4 байта больше...
в СДК на 4 байта меньше. чем реально требуется.


@!!ex   (2008-09-27 18:34:00) [2]

я пробовал... и нашел в чем проблема...
На ОФИЦИАЛЬНОМ сайте, лежит ОФИЦИАЛЬНОЕ сдк... нерабочее...
В примере СДК не хватает одной функции, и структура FuncItem на 4 байта больше...Дополнил структуру на эти 4 байта и все заработало.
Причем никак проверок на версию не делается. :(
Вот и падало все, потому что структура по размеру меньше...

P.S.
Спасибо за помощь! Особенно за совет по поводу BOOL.. Он 4 байта занимает, а bool только 1.


Игорь Шевченко   (2008-09-27 18:20:00) [3]

слово packed перед record не решит проблемы ?


@!!ex   (2008-09-27 17:56:00) [4]

ага.
сделал:
_itemName: array[0..itemNameMaxLen-1] of char;
или
_itemName: array[1..itemNameMaxLen] of char;
поведение одно и тоже.

если пишу(0 и 1 меняются на 1 и 2 во втором случае объявления массива):
 funcItem[0]._itemName[0]:= 'o';
 funcItem[0]._itemName[1]:= #0;

 funcItem[1]._itemName[0]:= #0;
 funcItem[1]._itemName[1]:= #0;

 funcItem[2]._itemName[1]:= #0;


То все нормальной. первая функция добавляется в меню Notepad++ как значащая функция c именем 'o', две других - как разделители менюшные.
Если же пишу:
 funcItem[0]._itemName[0]:= 'o';
 funcItem[0]._itemName[1]:= #0;

 funcItem[1]._itemName[0]:= 'o';
 funcItem[1]._itemName[1]:= #0;

 funcItem[2]._itemName[1]:= #0;

То Notepad++ падает...


Игорь Шевченко   (2008-09-27 17:46:00) [5]


>  PFUNCPLUGINCMD =^FUNCPLUGINCMD;


Это лишнее

объявление procedure(); cdecl и есть указатель


>   _itemName:string[itemNameMaxLen];


_itemName: array[1..itemNameMaxLen] или
_itemName: array[0..itemNameMaxLen1-]


>  _init2Check:BOOL;


скорее boolean - либо посмотри, чему в сишном компиляторе равен sizeof(bool)


Наверх

Титульная страница Поиск, карта сайта Написать письмо