Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.26.176] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток.
Вот, возникла некоторая проблемка. Есть у меня код на C++, который вычисляет некоторый ключик. Код этот писал не я сам, а нашел в одной статейке, просто взял и скопировал. Пытался переписать на паскале, но не получилось, ибо с C++ я знаком очень поверхностно, зато получилось скомпилировать в Си Билдере (5м). Основное же приложение у меня на Delphi (6й), и мне нужно использовать функцию void get_blowfish_key(const byte* s, byte* d) из файла uMain.cpp в аттаче в моем дельфи-приложении. Можно ли это сделать НЕ прибегая к использованию DLL? Если да то как? Если нет, то как сделать это с помощью DLL? Заранее благодарен за ответ. Прикреплённый файлbignum.rar (4.28 Кбайт, скачиваний: 145) |
Сообщ.
#2
,
|
|
|
Если речь идет о Билдере то с Delphi есть восместимость по Obj-файлам.
Т.е. на Билдере надо получить obj-файл с нужной процой (например, ProcC.obj). При этом желательно выставить для процедуры модификаторы вызова stdcall или cdecl явно. Далее в Delphi ее можно задействовать так: {$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: procedure get_blowfish_key( s, d: PChar); stdcall; external 'ProcC.dll'; 2.б) или можно подключать динамически, чтобы программа могла запускаться при отсутствии dll (см. LoadLibrary). Но здесь больше гемора. Если понадобится скажи. |
Сообщ.
#3
,
|
|
|
Вот, про obj-файл поподробнее можно? Как получить obj-файл с именно той процедурой которая мне нужна?
|
Сообщ.
#4
,
|
|
|
Цитата Shadow @ Как получить obj-файл с именно той процедурой которая мне нужна? ??? Создай любой проект в Билдере. Включи в него cpp- или c-файл с твоей процой. Выполни компиляцию. Должен быть создан obj-файл. Если не создался - посмотри в настройках билдера (или проекта) параметр генерации obj. |
Сообщ.
#5
,
|
|
|
Вот именно, создается, подключаю его и получаю следующее:
"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'" Вот. И процедура не вызывается. Пробовал даже вот так: int __cdecl get_some_var ( int a ) { return a; } {$L uMain.obj} function get_some_var ( a: integer): integer; cdecl; external; Где моя ошибка?? |
Сообщ.
#6
,
|
|
|
Похоже надо сделать что-то наподобии:
// файл MyProc.cpp // extern "C" { int __cdecl get_some_var( int ); } int __cdecl get_some_var( int ) { return a; } и код на Delphi: 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; |
Сообщ.
#7
,
|
|
|
И Всё равно не работает почему-то.
[Error] MixDll.pas(8): Unsatisfied forward or external declaration: 'get_some_var' Хотя сделал всё именно так, как в предыдущем посте. В чём прикол?? |
Сообщ.
#8
,
|
|
|
Тогда вместо __cdecl можно попробовать использовать __pascal.
... Или просто использовать библиотеку , сделанную в Билдере (в котороую надо будет поместить нудный код). |
Сообщ.
#9
,
|
|
|
Не знаю, и __pascal не работает. Если можно, то хотя бы код в DLL запихнуть, потому что переписать на Delphi всё это я вряд-ли смогу (не хватит знания cpp).
Как вообще экспортировать функцию из DLL в билдере? |
Сообщ.
#10
,
|
|
|
А найти исходник на паскале не получается?
Cpp -> Pas |
Сообщ.
#11
,
|
|
|
2 trainer : да, да, да. Наверное, придется переписывать на паскале. Ну что ж, придется помучиться (потому что в си я почти нуль)
|
Сообщ.
#12
,
|
|
|
Цитата Shadow @ Я же там дал ссылку на исходник на паскале, реализующий этот самый blowfish да, да, да. Наверное, придется переписывать на паскале. |
Сообщ.
#13
,
|
|
|
А мне блоуфиш и не надо. Мне надо 80-байтный ключик преобразовать в 56-байтный. Реализацию алгоритма blowfish на паскале я нашел и сам (яндексом и гуглом пользоваться умею).
|
Сообщ.
#14
,
|
|
|
---
Значит, прогресс есть. Переписывать код очень не хочется, я поискал тут по форуму и нашел примерчик (ссылку на топик правда не сохранил) для использования сишного кода в дельфях. Теперь у меня другие проблемы: в программе используются функции strlen, memset, memmove и memcpy, так вот, Дельфи по поводу этих функций выдает следующее: [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) |