Конференция "Основная" » C++ Builder и PAS файлы
 
  • Rouse_ © (04.12.16 09:43) [0]
    Ребят, у кого был опыт подключения 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;

 
Конференция "Основная" » C++ Builder и PAS файлы
Есть новые Нет новых   [118241   +25][b:0][p:0.002]