| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Как использовать dll откомпиленный для С в Delphi |
| Автор: Гость_Frikazoid 7.10.2003, 22:05 |
| Доброго времени суток Господа! Собственно сабж! есть http://www.scancode.ru/download/10/Downl/71/ Мне надо те ф-ии в Delphi использовать! Заранее спасибо за помощь! |
| Автор: Vit 7.10.2003, 23:10 |
| ДЫк в чём проблема, все WINAPI на С написаны и импортируются без проблем... |
| Автор: var-alex 8.10.2003, 14:46 |
| Импотрируешь функции из него. Только описания надо верно перевести. И обязательно установить тип вызова stdcall для импортированных функций! |
| Автор: Dmitry V.Abramov 8.10.2003, 15:41 | ||
Если бы это было написано на C - подошел бы любой из предложенных тебе советов. Если бы это было писано на BCB - пришлось бы подумать, но, скорее всего, тоже удалось бы подключить. Но то, что у тебя там лежит, писано на VC++ с активным использованием MSVCRT.DLL и наружу торчат не функции, а классы и методы. В этом случае единственным вариантом видится написание на VC "посредника", преобразующего простые cdecl вызовы из Delphi в вызовы классов этой DLL. |
| Автор: Dmitry V.Abramov 8.10.2003, 15:53 | ||
Именно на С и потому без проблем. В вопросе же фигурирует DLL писанная на C++ и экспортирующая класс и его методы. |
| Автор: Гость_Frikazoid 8.10.2003, 17:11 |
| Не могли бы вы кинуть в меня чем ни будь откомпиленным или кусок кода? Я просто с С вааще никогда не работал! |
| Автор: var-alex 8.10.2003, 19:13 | ||||
Прошу извинения. Я не смотрел туда... У меня инет не резиновый, кончается иногда |
| Автор: Гость_Frikazoid 9.10.2003, 19:53 |
| Ну хоть что ни будь! ПЛЗ! |
| Автор: Гость_Frikazoid 11.10.2003, 16:17 |
| Ну, Господа, может скажите что я должен сделать? Плиз! |
| Автор: Dmitry V.Abramov 11.10.2003, 19:09 | ||
Разве не помогло? Что именно не получилось? |
| Автор: Гость_Frikazoid 12.10.2003, 23:33 | ||
Вот это мешает! |
| Автор: stab 13.10.2003, 03:34 | ||||||||||
| сейчас я опишу свои соображения, которые, возможно, не совсем верны и не всегда будут работать Эксперименты будут проводиться с:
после того, как скомпиляли получили dll с такими функциями: ??0CDLLClass1@@QAE@HH@Z ??1CDLLClass1@@QAE@XZ ?GetF@CDLLClass1@@QAEHH@Z ?Inc@CDLLClass1@@QAEXHH@Z ??4CDLLClass1@@QAEAAV0@ABV0@@Z если это перевести в удобоваримую форму, то получим: CDLLClass1::CDLLClass1(int,int) CDLLClass1::~CDLLClass1(void) int CDLLClass1::GetF(int) void CDLLClass1::Inc(int,int) class CDLLClass1 & CDLLClass1::operator=(class CDLLClass1 const &) Последнюю процедуру мы не определяли, ее добавил компилер. Судя по всему она осуществляет копирование экземпляров класса байт к байту. Начнем с того, что попытаемся создать объект класса CDLLClass1. Объект в C++, так же как и в Delphi, просто область памяти, т.е. все что нам нужно это выделить нужное кол-во памяти и применить к ней конструктор. Если класс содержит виртуальные функции, то как-то надо еще помучиться с таблицой виртуальных функций, но мы обойдемся и без них. Размер объекта нашего класса 8 байт, т.к. два поля, каждое по 4 байта. Получаем:
Теперь надо вызвать конструктор. Все методы в C++, кроме методов с переменным числом параметров, используют thiscall соглашение о вызовах. thiscall -- это то же самое, что и stdcall только в ECX передается this (в Delphi-терминологии Self). Попытаемся это сделать:
Теперь вызовем методы Inc и GetF:
Я снова объявил obj как Pointer, для того, чтобы показать ненужность знаний о внутренней структуре объекта. И на конец вызовем деструктор и освободим память.
|
| Автор: stab 13.10.2003, 03:48 |
| теперь о вопросе этого топика список функций: ??0CCipher@@QAE@XZ ??4CCipher@@QAEAAV0@ABV0@@Z ?CheckComm@CCipher@@QAEHXZ ?ClearDatabase@CCipher@@QAEHH@Z ?CloseComm@CCipher@@QAEXXZ ?Finish@CCipher@@QAEHXZ ?GetCurrentState@CCipher@@QAEHPAD@Z ?GetDataCount@CCipher@@QAEJH@Z ?GetFreeMemory@CCipher@@QAEJXZ ?GetLastError@CCipher@@QAEHPAD@Z ?GetSerialNumber@CCipher@@QAEHPAD@Z ?GetTime@CCipher@@QAEHPAD@Z ?InitComm@CCipher@@AAEHXZ ?OpenComm@CCipher@@QAEHH@Z ?OpenComm@CCipher@@QAEHHH@Z ?OpenComm@CCipher@@QAEHHHH@Z ?OpenIrDA@CCipher@@AAEHXZ ?Ping@CCipher@@QAEHXZ ?PutRecord@CCipher@@QAEHHPBD@Z ?ReadRecord@CCipher@@QAEHHPAD@Z ?SendCommand@CCipher@@AAEHPBDPAD@Z ?SendData@CCipher@@AAEHPBD@Z ?TestIrDA@CCipher@@AAEHK@Z ?TimeDly@CCipher@@AAEXXZ ?UpdateTime@CCipher@@QAEHXZ CCipher::CCipher(void) class CCipher & CCipher::operator=(class CCipher const &) int CCipher::CheckComm(void) int CCipher::ClearDatabase(int) void CCipher::CloseComm(void) int CCipher::Finish(void) int CCipher::GetCurrentState(char *) long CCipher::GetDataCount(int) long CCipher::GetFreeMemory(void) int CCipher::GetLastError(char *) int CCipher::GetSerialNumber(char *) int CCipher::GetTime(char *) int CCipher::InitComm(void) int CCipher::OpenComm(int) int CCipher::OpenComm(int,int) int CCipher::OpenComm(int,int,int) int CCipher::OpenIrDA(void) int CCipher::Ping(void) int CCipher::PutRecord(int,char const *) int CCipher::ReadRecord(int,char *) int CCipher::SendCommand(char const *,char *) int CCipher::SendData(char const *) int CCipher::TestIrDA(unsigned long) void CCipher::TimeDly(void) int CCipher::UpdateTime(void) проблем быть, вроде, не должно ;) самое сложное определить размер объекта, тут два варианта: 1. В VC написать sizeof(CCipher) и посмотреть чему это равно. 2. Взять заведомо достаточный объем памяти. Вариант 1 конечно лучше. Frikazoid, если будут проблемы с конвертацией функций в delphi -- пиши, ну и вообще если будут проблемы -- пиши |
| Автор: stab 13.10.2003, 04:22 | ||
хм, sizeof(CCipher) = 1
приводит к "Unhandled exception at 0x10001100 (Cipher.dll) in app.exe: 0xC0000005: Access violation reading location 0x00000020." Обращение к любому методу приводит к эксепшенам. Похоже sizeof(CCipher) != 1 |
| Автор: Dmitry V.Abramov 13.10.2003, 07:06 | ||||
Хочется выказать уважение к проделанной работе, и оказать посильную помощь. Судя по коду оператора копирования
... величина этого Cipher'a равна $10*4=64 байта. |
| Автор: stab 13.10.2003, 07:53 |
| Dmitry V.Abramov, во! а я сидел думал, где бы это число нарыть |
| Автор: Cashey 14.10.2003, 14:33 |
| Простите за глупую встрячку. У меня вопросик по ходу. Можно ли в Дельфях использовать DLL'ки написанные на др. языках напрямую, не регистря их в виндах (т.е. не через OLE)? |
| Автор: Dmitry V.Abramov 14.10.2003, 15:51 |
| Можно. Если вызвать в начале работы DllRegisterServer из этой DLL, а в конце DllUnregisterServer. |
| Автор: Cashey 14.10.2003, 15:56 |
| Это что в самой DLL'ки прописано должно быть? Или оно вызывается перед использованием DLL |
| Автор: stab 14.10.2003, 17:48 |
| перед использованием. |
| Автор: Cashey 15.10.2003, 10:25 | ||
А примерчик использования можно? Я вот тут одну DLL'ку, фоксовскую, использовал, регистря ее с помощью REGSVR32.EXE, и все работало, а унинсталировал ее и попробовал зделать так
А он ругается и выдает except. Дельфийский хелп без примера, а методом проб и ошибок ковырятся не охота. |
| Автор: stab 15.10.2003, 10:31 |
| Cashey, поищи на форуме, был уже такой топик. з.ы. и ваще это уже совсем другой вопрос |
| Автор: Гость_Frikazoid 15.10.2003, 19:59 |
| А откомпиленный длл мона? просто ставить VC не охота! ПЛЗ! |
| Автор: Dmitry V.Abramov 15.10.2003, 22:00 |
| Хммм... Вообще-то мы упорно обсуждаем вот этот: http://www.scancode.ru/download/10/Downl/71/ |
| Автор: Гость_Frikazoid 16.10.2003, 12:18 | ||
Так я за эту же тему! Мне нужен откомпиленный, промежуточный длл! Если можно плз! |
| Автор: stab 16.10.2003, 14:21 |
| выше описан способ как без промежуточных dll можно сделать... |
| Автор: man2002ua 17.10.2003, 14:42 |
| cully, смутно верится, что можно так подключить...в этой либе нет проц. DLLRegisterServer Frikazoid, тебе достаточно будет, что в библиотеке-заглушке используется жесткий экземпляр Ciphera? (т.е. при подключении заглушки будет создаваться один класс Cipher и др. создать будет низзя) Или тебе надо предусмотреть возможность создания нескольких классов (чуть сложнее)? Вот кстати заглушка с примером использования http://man2002ua.hotbox.ru/ciprar.exe.sfx |
| Автор: stab 17.10.2003, 17:00 |
| man2002ua, а при чем тут DLLRegisterServer? ты повнимательней почитай топик |
| Автор: man2002ua 18.10.2003, 09:02 |
| cully, это ты про те куски асм. вставок? Способ, к-й предложил Dmitry V.Abramov вначале - IMHO самый простой и верный... |
| Автор: stab 18.10.2003, 09:06 |
| man2002ua, но мы же не ищем легких путей |
| Автор: man2002ua 18.10.2003, 09:21 |
| Нифиговый эффективный путь Звините за оффтоп |
| Автор: Dmitry V.Abramov 18.10.2003, 12:37 | ||||
| man2002ua Так ведь у каждого своя эффективность. Например, у меня в радиусе 30 километров нет доступного VC++ -- зато есть дебаггер. У Гость_Frikazoid, похоже, вообще ничего нет кроме интернета... А подтема DllRegisterServer была порождена вопросом:
И шуточным ответом:
в конце которого было позабыто ":)". |
| Автор: Frikazoid 23.10.2003, 21:48 |
| Вы себе представить не можите, что у меня под боком валяются: Pascal, Delphi, BC, VC, C++, Basik, VB, eVC, eVB (PHP, PERL |
| Автор: Frikazoid 23.10.2003, 21:53 |
| man2002ua Здоровенный санькс! Ща попробую! |
| Автор: Frikazoid 24.10.2003, 14:59 |
| Протестил. Не работает! |
| Автор: man2002ua 24.10.2003, 15:48 |
| А что говорит? У меня выдает сообщения типа "время ожидания истекло", но мне не на чем проверить... |
| Автор: Frikazoid 24.10.2003, 23:25 |
| Говорит тоже самое! Я всякие позиции попробовал, никак! Вообще, за всё время, что я работаю с RS-232 я не имел таких проблем. Готов уже разбить этот сканер! ЗЫ На Сканкоде есть ещё и длл писаная для 1С! Подозреваю, что это оле сервер! Может её мона отпользовать, а? Вот одним словом http://scancode.ru/catalog/153/ Всё что есть там! |
| Автор: man2002ua 25.10.2003, 08:49 |
| "время истекло", значит функции работают правильно, иначе, как я понимаю - слетало бы что-либо... А насчет оле-сервера - тут уже просто подключай его к делфи и пользуй. Если не получится - говори, попробую тоже |
| Автор: Frikazoid 25.10.2003, 14:08 |
| Да я пробовал. Не получилось! Ерорами сыпался. Правда не слишком долго пытался. |
| Автор: Frikazoid 25.10.2003, 14:13 | ||
А вот и нет! Он! на команды терминал отвечает какой-то пургой! То же самое происходило, когда я пытался сам всё сделать! |
| Автор: man2002ua 27.10.2003, 09:56 |
| надо бы попробовать исп. эту библиотеку в программе написаной на VC++ и проверить, может ошибка в библиотеке... Ты напиши последовательность функций, к-е надо вызывать - я сделаю пример на Си - запустишь и проверишь, если выдает тоже самое - ошибка в библиотеке или терминале |
| Автор: Frikazoid 27.10.2003, 19:13 |
| 1) Инициализация ком порта 2) Ping Усё! |
| Автор: man2002ua 28.10.2003, 10:08 |
| Вот попробуй... http://man2002ua.hotbox.ru/CipherStub.exe |
| Автор: Frikazoid 28.10.2003, 22:02 |
| Вот и . dll не работает! Скажу директору, пусть звонит к ним на контору и разбирается. |
| Автор: Frikazoid 28.10.2003, 22:23 |
| Где есть хорошие доки по ком портам? А то у меня есть полный список параметров подключения стандартной проги к этому терминалу сканированной с помощью LGCOMSPY! А вот как это в код перевести не знаю! Киньте в меня плз полным описанием по криейтфайлу со всеми пораметрами на ком порт, какие тока можгут быть! плиз! Санькс! |