Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

C++ Builder и PAS файлы


Rouse_ ©   (04.12.16 09:43

Ребят, у кого был опыт подключения PAS файлов к сишному проекту?
Сейчас занимаюсь с парнем на тему отладчика, и лениво столько кода портировать на си, решил подрубить свой старый модулек
http://rouse.drkb.ru/winapi.php#dbg
А он зараза выдает ошибки плана:
[ilink32 Error] Fatal: Unable to open file 'SYSTEM.SYSUTILS.OBJ'

А как без SYSUTILS-то? У меняж там исключения кидаются.
Где что подкрутить чтоб скомпилировалось?


Inovet ©   (04.12.16 10:15[1]

Вроде особых нюансов не помню. Просто добавляешь в Си++ Билдер проект паскалевский файл, среда при сборке вызовет компилятор Делфи, он сгенерирует obj и заголовок *.h. Заголовок надо будет #include куда надо. Иногда бывают небольшие проблемы с заголовком, но это можно устранить в паскалевском иходнике.

Ну а линкеру вообще без разницы как бы чьи obj собирать. Может у тебя в настройках проекта путь какой не прописан с системным библиотекам?


Rouse_ ©   (04.12.16 10:21[2]

Ну я вчера с нуля триальную версию си билдера поставил т.е. ничего не настраивал, создаю новый проект и подключаю свой FWDebugerCore.pas - все больше ничего не трогаю - ну и билд.
Никаких заголовочных H файлов он не создал.


Rouse_ ©   (04.12.16 10:22[3]

Подключал так-же как и в дельфи, т.е. Project->Add to Project


Rouse_ ©   (04.12.16 10:25[4]

Можешь у себя проверить? там только (как в моем случае) если у тебя билдер последний, то параметр Dummy нужно изменить с DWORD на NativeUInt.
Скомпилируется или нет?


Inovet ©   (04.12.16 10:26[5]

> [1] Inovet ©   (04.12.16 10:15)
> *.h

*.hpp
Вернее

> [2] Rouse_ ©   (04.12.16 10:21)
> FWDebugerCore.pas

Щас попробую твой


Inovet ©   (04.12.16 10:33[6]

Удалено модератором


Inovet ©   (04.12.16 10:34[7]

Чёт я лишнего закопипипастил.


Rouse_ ©   (04.12.16 10:35[8]

Так, ну у тебя хоть до этого дошло...
Дай плз в виде строки свои настройки из Tools->Library для 32 бит
Похоже там у меня что-то не верно


Rouse_ ©   (04.12.16 10:36[9]

Library path короче


Inovet ©   (04.12.16 10:40[10]

Давай я тебе весь проект скину XE4
https://cloud.mail.ru/public/48ej/ESApPPXUv


Inovet ©   (04.12.16 10:42[11]

Потри сообщение, чтобы не отсечивало
[6] Inovet ©   (04.12.16 10:33)


Rouse_ ©   (04.12.16 10:45[12]

Угу грохнул. Щас проверю


Inovet ©   (04.12.16 10:49[13]

Ещё, как вариант. Можно откомпилировать заранее в DCU с генерацией *.hpp, и уже просто заголовок добавлять, ну и чтобы *.dcu был доступен в путях поиска.


Rouse_ ©   (04.12.16 11:08[14]

Так, погоди - скомпилялось :)
Сам не понял что сделал :)


Rouse_ ©   (04.12.16 11:10[15]

Да, вроде зафурычило, осталось понять как с ним в сишном коде работать - конструктор обработчики, но это я уже щас в справку погружусь.
Спасибо, выручил :)


Inovet ©   (04.12.16 11:16[16]

> [15] Rouse_ ©   (04.12.16 11:10)

Это хорошо.

А почему ошибки были? Какие-то особенности между версиями Delphi? Я уж вникать не стал.


Rouse_ ©   (04.12.16 11:18[17]

Я не понял - взял твой проект, он ругнулся на декларацию GetMappedFileNameA - но она мне не особо сейчас нужна - закоментил кусок кода и все заработало


Rouse_ ©   (04.12.16 11:20[18]

Лучше скажи мне - бо я дольше искать буду.
Как в билдере новый класс создать и обработчики ему назначить?
Я дольше читать буду :)
Оть так не фурычит

TFWDebugerCore: Debuger;
       //Debuger = TFWDebugerCore.Create;
Debuger = new TFWDebugerCore;

как правильно?


Inovet ©   (04.12.16 11:27[19]

> [18] Rouse_ ©   (04.12.16 11:20)
> как правильно?

TFWDebugerCore *dc = new TFWDebugerCore(параметры коструктора, или одного из них, если их несколько);
try {
 ...
 dc->AttachToProcess(параметры)
 ...
}
__finally {
 delete dc // здесь будет вызван деструктор.
}


Inovet ©   (04.12.16 11:28[20]

> [19] Inovet ©   (04.12.16 11:27)

Ну там точки с запятой я не поставил.
TFWDebugerCore *dc = new TFWDebugerCore(параметры коструктора, или одного из них, если их несколько);

try {
...
dc->AttachToProcess(параметры);
...
}
__finally {
delete dc; // здесь будет вызван деструктор.
}


Rouse_ ©   (04.12.16 11:34[21]

Ага, уже сам расставил - фурычит, спасибо :)


Inovet ©   (04.12.16 11:40[22]

Ну т.е. как это можно было бы сделать с чиcто Си++ классами, делать нельзя, поскольку Делфи классы на стеке нельзя размещать.


{ // какой-то блок кода
 TFWDebugerCore dc(параметры коструктора, или одного из них, если их несколько);
 ...
 dc.AttachToProcess(параметры);
 ...
} // здесь будет вызван деструктор.


Rouse_ ©   (04.12.16 11:48[23]

Последнее - извнии что достаю:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
TFWDebugerCore *debuger = new TFWDebugerCore(0xFFFFFFFF);
try {
//   debuger->OnBreakPoint = OnBreakPoint; // <<< как правильно задекларировать?
  debuger->DebugNewProcess("C:\\Program Files (x86)\\Subway Surfers\\Subway_Surfers.exe", True);
  debuger->RunMainLoop();
}
__finally {
  delete debuger;
};
}


У меня обработчик обьявлен вот так:

typedef void __fastcall (__closure *TBreakPointEvent)(System::TObject* Sender, int ThreadIndex, const _EXCEPTION_RECORD &ExceptionRecord, int BreakPointIndex, bool &ReleaseBreakpoint);

если это задекларировать в H файле то с директивой (__closure *TBreakPointEvent) рукается, обьявил вот так:

class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormCreate(TObject *Sender);
private:
public:  // User declarations
 __fastcall TForm1(TComponent* Owner);
 __fastcall OnBreakPoint(System::TObject* Sender, int ThreadIndex, const _EXCEPTION_RECORD &ExceptionRecord, int BreakPointIndex, bool &ReleaseBreakpoint);
};


Ну и в CPP оть такая декларация:
__fastcall OnBreakPoint(System::TObject* Sender, int ThreadIndex, const _EXCEPTION_RECORD &ExceptionRecord, int BreakPointIndex, bool &ReleaseBreakpoint)
{
// ...
}


Пишет:
[bcc32 Error] Unit1.cpp(23): E2034 Cannot convert 'int (_fastcall * (_closure )(TObject *,int,const _EXCEPTION_RECORD &,int,bool &))(TObject *,int,const _EXCEPTION_RECORD &,int,bool &)' to 'TBreakPointEvent'

Куда еще руки поправить?


Inovet ©   (04.12.16 12:06[24]

> [23] Rouse_ ©   (04.12.16 11:48)
> Последнее - извнии что достаю:

Та ладно уж, доставай.:)

Это мозговыносная часть Си++. Тут должно быть что-то вот такое

OnBreakPoint = &OnBreakPoint;

Это вот OnBreakPoint имя функции-обработчика.


Rouse_ ©   (04.12.16 12:08[25]

Так, тыж у меня в скайпе есть, щас тогда с домашнего к тебе стукнусь


Inovet ©   (04.12.16 12:11[26]

> [24] Inovet ©   (04.12.16 12:06)
> OnBreakPoint = &OnBreakPoint;

В смысле - вот так объявлена переменная для хранения указателя на функцию обработчика

TBreakPointEvent OnBreakPoint;

а так присваиваем ей обработчик

OnBreakPoint = &OnBreakPoint;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо