На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Использование сишного кода. , В приложении дельфи.
    Доброго времени суток.

    Вот, возникла некоторая проблемка. Есть у меня код на C++, который вычисляет некоторый ключик.
    Код этот писал не я сам, а нашел в одной статейке, просто взял и скопировал. Пытался переписать на паскале, но не получилось, ибо с C++ я знаком очень поверхностно, зато получилось скомпилировать в Си Билдере (5м).
    Основное же приложение у меня на Delphi (6й), и мне нужно использовать функцию
    void get_blowfish_key(const byte* s, byte* d)
    из файла uMain.cpp в аттаче в моем дельфи-приложении.

    Можно ли это сделать НЕ прибегая к использованию DLL? Если да то как?
    Если нет, то как сделать это с помощью DLL?

    Заранее благодарен за ответ.
    Прикреплённый файлПрикреплённый файлbignum.rar (4.28 Кбайт, скачиваний: 145)
      Если речь идет о Билдере то с Delphi есть восместимость по Obj-файлам.
      Т.е. на Билдере надо получить obj-файл с нужной процой (например, ProcC.obj).
      При этом желательно выставить для процедуры модификаторы вызова stdcall или cdecl явно.
      Далее в Delphi ее можно задействовать так:
      ExpandedWrap disabled
        {$L ProcC.obj}
        // далее должен быть верный прототип процы,
        // здесь вариант для : void stdcall get_blowfish_key(const byte* s, byte* d);
        procedure get_blowfish_key( s, d: PChar); stdcall; external;

      Вроде так должно работать.

      Если надо вариант DLL:
      1) скомпилить в Билдере библиотеку, например, ProcC.dll
      2.а) или статически подключить библиотеку в модуле Delphi:
      ExpandedWrap disabled
           procedure get_blowfish_key( s, d: PChar); stdcall; external 'ProcC.dll';

      2.б) или можно подключать динамически, чтобы программа могла запускаться при отсутствии dll (см. LoadLibrary). Но здесь больше
      гемора. Если понадобится скажи.
        Вот, про obj-файл поподробнее можно? Как получить obj-файл с именно той процедурой которая мне нужна?
          Цитата Shadow @
          Как получить obj-файл с именно той процедурой которая мне нужна?

          ??? :o

          Создай любой проект в Билдере. Включи в него cpp- или c-файл с твоей процой. Выполни компиляцию. Должен быть создан obj-файл.
          Если не создался - посмотри в настройках билдера (или проекта) параметр генерации obj.
            Вот именно, создается, подключаю его и получаю следующее:
            "Unsatisfied forward or external declaration 'get_blowfish_key'"
            "Unsatisfied forward or external declaration '_memset'"
            "Unsatisfied forward or external declaration '_strlen'"
            ...
            "Unsatisfied forward or external declaration '_memcpy'"

            Вот. И процедура не вызывается.

            Пробовал даже вот так:
            ExpandedWrap disabled
              int __cdecl get_some_var ( int a )
              {
               return a;
              }

            ExpandedWrap disabled
              {$L uMain.obj}
              function get_some_var ( a: integer): integer; cdecl; external;


            Где моя ошибка??
              Похоже надо сделать что-то наподобии:
              ExpandedWrap disabled
                // файл MyProc.cpp
                //
                extern "C" {
                  int __cdecl get_some_var( int );
                }
                 
                int __cdecl get_some_var( int ) {
                   return a;
                }

              и код на Delphi:
              ExpandedWrap disabled
                unit X;
                interface
                ...
                implementation
                ...
                 
                {$L MyProc.obj}
                function get_some_var ( a: integer): integer; cdecl; external;
                 
                ...
                procedure Test;
                begin
                   ShowMessage( IntToStr( get_some_var(100) ) );
                end;
                 
                end;
                И Всё равно не работает почему-то.
                [Error] MixDll.pas(8): Unsatisfied forward or external declaration: 'get_some_var'
                Хотя сделал всё именно так, как в предыдущем посте. В чём прикол??
                  Тогда вместо __cdecl можно попробовать использовать __pascal.

                  ... Или просто использовать библиотеку , сделанную в Билдере (в котороую надо будет поместить нудный код).
                    Не знаю, и __pascal не работает. Если можно, то хотя бы код в DLL запихнуть, потому что переписать на Delphi всё это я вряд-ли смогу (не хватит знания cpp).
                    Как вообще экспортировать функцию из DLL в билдере?
                      А найти исходник на паскале не получается?
                      Cpp -> Pas
                        2 trainer : да, да, да. Наверное, придется переписывать на паскале. Ну что ж, придется помучиться (потому что в си я почти нуль)
                          Цитата Shadow @
                          да, да, да. Наверное, придется переписывать на паскале.
                          :blink: Я же там дал ссылку на исходник на паскале, реализующий этот самый blowfish
                            А мне блоуфиш и не надо. Мне надо 80-байтный ключик преобразовать в 56-байтный. Реализацию алгоритма blowfish на паскале я нашел и сам (яндексом и гуглом пользоваться умею).
                              ---
                              Значит, прогресс есть. Переписывать код очень не хочется, я поискал тут по форуму и нашел примерчик (ссылку на топик правда не сохранил) для использования сишного кода в дельфях.
                              Теперь у меня другие проблемы:
                              в программе используются функции strlen, memset, memmove и memcpy, так вот, Дельфи по поводу этих функций выдает следующее:
                              ExpandedWrap disabled
                                [Error] Test.dpr(462): Unsatisfied forward or external declaration: 'memset'
                                [Error] Test.dpr(462): Unsatisfied forward or external declaration: 'strlen'
                                [Error] Test.dpr(462): Unsatisfied forward or external declaration: 'memmove'
                                [Error] Test.dpr(462): Unsatisfied forward or external declaration: 'memcpy'

                              Как с этим бороться?

                              Вот исходники всего того, о чем я говорю.
                              Сначала следует скомпилировать проект bignum.bpr, а потом запустить bc.bat.
                              Прикреплённый файлПрикреплённый файлExamples.rar (30.1 Кбайт, скачиваний: 156)
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0677 ]   [ 16 queries used ]   [ Generated: 3.05.24, 02:43 GMT ]