Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » CBuilder - Использование сторонней DLL

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вообще мне надо заставить работать фискальный регистратор (Феликс - Р Ф вер. 01).
Есть:
Felix.dll драйвер
Felix.h интерфейс для С, С++
FelixDRV.pas интерфейс для Delphi
 
файл - Felix.h

Код:
 
<skip>
//      Открыть COM порт для обмена
HFelix frfInitTransport(const char* PortName, const char* Password, int SPEED);
// SPEED = 0 - скорость 9600 бод
// SPEED = 1 - скорость 19200 бод
 
//      Закрыть COM порт
int frfDoneTransport(HFelix H);
<skip>
 

 
файл - FelixDRV.pas

Код:
 
<skip>
unit FelixDrv;
 
{    Borland Delphi (5.0) unit for FelixF-R cash register.
     API for felix.dll driver.
}
 
interface
 
type HFelix = Cardinal;
     frfFelixStatus = packed record
       ErrorCode: shortint;
       HardStatus: byte;
       CurrentStatus: word;
       PrinterStatus: byte;
     end;
 
{$EXTERNALSYM frfInitTransport}
function frfInitTransport(PortName, CommunicationPassword: PAnsiChar; SPEED: integer): HFelix; stdcall;
{$EXTERNALSYM frfDoneTransport}
function frfDoneTransport(Handle: HFelix): HRESULT; stdcall;
<skip>
implementation
 
const FiscalDrv = 'Felix.dll';
function frfInitTransport; external FiscalDrv name 'frfInitTransport';
function frfDoneTransport; external FiscalDrv name 'frfDoneTransport';
function frfNewCicle; external FiscalDrv name 'frfNewCicle';
<skip>
 

 
Что мне сделать, чтобы я мог пользоваться этой ddl-кой. Точнее вызывать функции из неё.

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 19:30 12-02-2004
Savage



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для С++ Builder: #include "Felix.h"
 
Для Delphi: uses FelixDRV
 
И пользуешь эти функции как свои родные. (Прим. скопируй эти файлы в каталог проекта, для дельфи Felix.h не нужен, для CBuilder не нужен FelixDRV.pas)

Всего записей: 126 | Зарегистр. 27-09-2003 | Отправлено: 22:54 12-02-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
но в Felix.h не прописано подключение dll-ки
компилятор ругается что не знает этих функций
 
я пробывал подключать ДИНАМИЧЕСКИ, но у меня не получается (просто не умею пока)
 
Где можно почитать подробно про работу ДИНАМИЧЕСКИ подключаемых dll-лок , а то я что-то не смог понять что я нет так делаю.
в книжке Программирование в С++Builder 5.0 А.Я. Архангельского написано следующее:
Если функция MyFunc(), то надо:
Объявить указатель на эту функцию. Например:

Код:
void (__stdcall *MyFunc) (HWIND)

 
Тогда операции с библиотекой могут строиться по следующей схеме:
 

Код:
 
// загрузка dll
HINSTANCE dllInstance = LoadLibrary ("mydll.dll");
 
// получение адреса функции
MyFunc = (void (__stdcall*) (HWIND)
                                 GetProcAddress (dllInstance, "_MyFunc");
 
// вызов функции  
MyFunc(Appliaction->Handle);
 
// выгрузка dll  
FreeLibrary(dllInstance);
 

 
1 Где объявляется этот указатель ???

Код:
void (__stdcall *MyFunc) (HWIND)

 
2 Где описывается "получение адреса функции" уже есть ошибка, т.к. нехватает скобки одной.
надо ли скобка пере "void"
// получение адреса функции

Код:
MyFunc = (void (__stdcall*) (HWIND)
                                 GetProcAddress (dllInstance, "_MyFunc");

 
Плиз хелп. Правильно ли это описано в книге ?

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 10:19 13-02-2004
drobitko

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что бы использовать .dll "статически" (я имею в виду без ручной настройки указателей на функции) нужен .lib файл коорый нужно прилинковать к проекту.
 
Если его нет, то нужно настраивать указатели вручную.
 

Цитата:
1 Где объявляется этот указатель ???  

 
Указатель описывается например вначале того файла в котором он используется.
 
Правильный код для объфвления указателя:
 
typedef void (__stdcall *MyFunc) (HWIND)  
 

Цитата:
2 Где описывается "получение адреса функции" уже есть ошибка, т.к. нехватает скобки одной.  
надо ли скобка пере "void"  
// получение адреса функции  

 
Описывать получение указателя не нужно. Ты его просто получаешь и все. Правильный код для получения указателя с использованием раннееобъявленного типа вот:
 
MyFunc func; // объявляешь переменную типа указатель на функцию
 
func = (MyFunc)GetProcAddress (dllInstance, "_MyFunc"); // присваиваешь этой переменной адрес функции в dll
 
Если будут вопросы - пиши.
 

Всего записей: 83 | Зарегистр. 10-02-2003 | Отправлено: 13:26 13-02-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ок, пропробую

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 14:42 13-02-2004
foo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
spike
Не обязательно писать указатели в ручную, из dll функции можно подцепить автоматом через lib файл, он создается какой-то утилиткой из bin директории buildera, кажется implib или что-то подобное, прочтите help.
Дальше созданный либ добавляется в проект, и все. Функции будут доступными при компиляции. При запуске программы эта дллина должна быть доступна, т.е. лежать в той же директории, что и экзешник или в system32 window'са или быть в директория указанных в %PATH%.

Всего записей: 1210 | Зарегистр. 26-09-2002 | Отправлено: 18:19 13-02-2004
drobitko

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Насколько я знаю implib переводит lib файлы из формата microsoft в формат borland. Но создать lib файл на основе dll она не может (в dll просто нет всей необходимой информации).

Всего записей: 83 | Зарегистр. 10-02-2003 | Отправлено: 18:32 13-02-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
drobitko
а как теперь использовать MyFunc что в dll
как  
MyFunc(par1,par2); не пашет
как func этот использовать

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 21:20 13-02-2004
foo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Насколько я знаю implib переводит lib файлы из формата microsoft в формат borland. Но создать lib файл на основе dll она не может (в dll просто нет всей необходимой информации).

В dll есть вся информация, т.е. имена функций их индексы и адреса вызовов.
Использовать implib можно так: (implib -f mydll.lib mydll.dll), полученную mydll.lib нужно добавить в проект и использовать функции объявленные в Felix.h, не забыв добавить (#include "Felix.h") в *.cpp файл.

Всего записей: 1210 | Зарегистр. 26-09-2002 | Отправлено: 21:32 15-02-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
foo
ок, попробую

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 00:32 16-02-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Компилятор ругается:

Код:
 
Build
  [Linker Error] Unresolved external 'frfInitTransport(const char *, const char *, int)' referenced from C:\TEST.DLL\UNIT1.OBJ
  [Linker Error] Unresolved external 'frfCloseCicle(unsigned int)' referenced from C:\TEST.DLL\UNIT1.OBJ
  [Linker Error] Unresolved external 'frfDoneTransport(unsigned int)' referenced from C:\TEST.DLL\UNIT1.OBJ
 

 
я вызываю:

Код:
 
HFelix H;
H = frfInitTransport("COM1","PASS",0); // установка соединения с регистратором
frfCloseCicle(H);   // печать  
frfDoneTransport(H); // завершение соединения
 

 
Может ещё что-то надо сделать. До этого, я вообще не работал с dll-ками.
Может надо описать функции которые я включаю ???? или я НЕПРАВИЛЬНО их вызываю.
 
ps: добавил #include "Felix.h" вверху, где все *.h файлы подключаются

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 11:04 16-02-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
spike

Цитата:
добавил #include "Felix.h" вверху, где все *.h файлы подключаются

А сам *.lib включил в проeкт?

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 11:26 16-02-2004 | Исправлено: mihas83, 11:29 16-02-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
да, правда его нет в Project->View Source
т.е. нет USELIB("felix.dll");
 
а в списке Project Manager есть felix.lib

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 12:50 16-02-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
spike
Ты его через соотв. меню должен добавить в твой проект... (В MS Visual Studio это: "Add Files to Project", ...в С++ Builder, наверняка, есть аналог.)

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 13:26 16-02-2004
drobitko

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
spike
 
В данном случае MyFunc - это тип указателя на функцию такой же как int, char и т.д. Использовать для вызова надо переменную func в которую ты уже получил адрес функции.
 
func(par1,par2);

Всего записей: 83 | Зарегистр. 10-02-2003 | Отправлено: 13:47 16-02-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
drobitko

Цитата:
В данном случае MyFunc - это тип указателя... Использовать для вызова надо переменную func в которую ты уже получил адрес функции.  

Если spike *.lib файл прилинкуeт к проекту, то всей этой "кухни" (сложной пока ему) для него не надо...

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 14:38 16-02-2004
drobitko

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да я так для общего развития.

Всего записей: 83 | Зарегистр. 10-02-2003 | Отправлено: 15:28 16-02-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
drobitko

Цитата:
Да я так для общего развития.

Что-то он совсем "замолк"... spike, рекомендую "ПРОШТУДИРОВАТЬ" Рихтера...  
Там очень толково все описано...

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 16:25 16-02-2004
foo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Чтобы добавить *.lib, в билдере Project->Add to Project, там выбрать Files of type - Library files и открыть созданную lib, чтобы убедиться, что lib содержит нжные функции его можно просмотреть в текстовом редакторе, там должны присутствовать нужные названия функций.  
Или использовать утилиту impdef (MPDEF DestName.DEF SourceName.DLL), которая создает *.def - текстовый файл, где имена функций прописаны явно. Нужно учесть, что в lib или def файлах (чтобы все работало хорошо) регистр букв имен функций должен совпадать с тем, что описано в используемом *.h файле.
Можно при создании lib и def добавитm опции -a -c
 
-aAdd '_' alias for cdecl functions for compatibility with Microsoft libraries
-cWarnings on case sensitive symbols

Всего записей: 1210 | Зарегистр. 26-09-2002 | Отправлено: 17:29 16-02-2004 | Исправлено: foo, 17:40 16-02-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
где мне его взять ???
 
foo
def тоже как и lib добавить ?
если добавить def нужен felix.h в проекте ???

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 00:42 17-02-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » CBuilder - Использование сторонней DLL


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru