![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите перевести с С
@!!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)