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

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

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

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

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

mihas83



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

Цитата:
def тоже как и lib добавить  

*.def - текстовый файл (где имена функций прописаны явно, пишу его сам вручную) создаетcя если вместе с *.dll в Project-dll хочешь получить и *.lib
Во второй Project добавлять не надо...

Цитата:
рекомендую "ПРОШТУДИРОВАТЬ" Рихтера... - где мне его взять  

Рихтер "Programming Applications for Microsoft Windows, 4lh ed" у меня есть и бумажное русское издание ("Питер", 2001) и 2 варианта в электронном виде (в т.ч. русское, весом более 3 Мб)... Если не помогут здесь:
http://forum.ru-board.com/topic.cgi?forum=35&bm=1&topic=16945&start=1820#lt
попробуем "сообразить" что-то...

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 08:07 17-02-2004 | Исправлено: mihas83, 08:09 17-02-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
при использовании implib с параметрами -a -cснаблюдаю следующую картину

Код:
 
c:\test.dll>implib felix.lib felix.dll -a -c
 
Borland Implib Version 3.0.22 Copyright (c) 1991, 2000 Inprise Corporation
Warning duplicate symbol: ___CPPdebugHook
Warning duplicate symbol: frfAddGoods
Warning duplicate symbol: frfAddGoodsRepeat
Warning duplicate symbol: frfCloseCicle
Warning duplicate symbol: frfCloseDocument
Warning duplicate symbol: frfDiscount
Warning duplicate symbol: frfDoFiscalize
Warning duplicate symbol: frfDocumentStorno
Warning duplicate symbol: frfDocumentTaxes
Warning duplicate symbol: frfDoneTransport
Warning duplicate symbol: frfGetDateTime
Warning duplicate symbol: frfGetDocumentNumber
Warning duplicate symbol: frfGetErrorString
Warning duplicate symbol: frfGetFelixStatus
Warning duplicate symbol: frfGetMoney
Warning duplicate symbol: frfGetSNandINN
Warning duplicate symbol: frfGetSerialNumber
Warning duplicate symbol: frfInitTransport
Warning duplicate symbol: frfNewBigDocument
Warning duplicate symbol: frfNewCicle
Warning duplicate symbol: frfNewDocument
Warning duplicate symbol: frfPays
Warning duplicate symbol: frfPrintDateReport
Warning duplicate symbol: frfPrintFullFiReport
Warning duplicate symbol: frfPrintLine
Warning duplicate symbol: frfPrintNoReport
Warning duplicate symbol: frfPrintReport
Warning duplicate symbol: frfPutMoney
Warning duplicate symbol: frfQueryReport
Warning duplicate symbol: frfRegetResult
Warning duplicate symbol: frfRegetStatus
Warning duplicate symbol: frfRepeatDocument
Warning duplicate symbol: frfSetCallBackProcedure
Warning duplicate symbol: frfSetCommunicationPassword
Warning duplicate symbol: frfSetDateTime
Warning duplicate symbol: frfSetDriverReadMode
Warning duplicate symbol: frfSetFelixSpeed
Warning duplicate symbol: frfSetFont
Warning duplicate symbol: frfSetFontDensity
Warning duplicate symbol: frfSetFooter
Warning duplicate symbol: frfSetPayKindNames
Warning duplicate symbol: frfSetPayNames
Warning duplicate symbol: frfSetSerialNumber
Warning duplicate symbol: frfSetTaxNames
Warning duplicate symbol: frfSetTaxRates
Warning duplicate symbol: frfSetTextOffset
Warning duplicate symbol: frfSetTitle
Warning duplicate symbol: frfTotal
Warning duplicate symbol: ___CPPdebugHook
Warning duplicate symbol: frfAddGoods
Warning duplicate symbol: frfAddGoodsRepeat
Warning duplicate symbol: frfCloseCicle
Warning duplicate symbol: frfCloseDocument
Warning duplicate symbol: frfDiscount
Warning duplicate symbol: frfDoFiscalize
Warning duplicate symbol: frfDocumentStorno
Warning duplicate symbol: frfDocumentTaxes
Warning duplicate symbol: frfDoneTransport
Warning duplicate symbol: frfGetDateTime
Warning duplicate symbol: frfGetDocumentNumber
Warning duplicate symbol: frfGetErrorString
Warning duplicate symbol: frfGetFelixStatus
Warning duplicate symbol: frfGetMoney
Warning duplicate symbol: frfGetSNandINN
Warning duplicate symbol: frfGetSerialNumber
Warning duplicate symbol: frfInitTransport
Warning duplicate symbol: frfNewBigDocument
Warning duplicate symbol: frfNewCicle
Warning duplicate symbol: frfNewDocument
Warning duplicate symbol: frfPays
Warning duplicate symbol: frfPrintDateReport
Warning duplicate symbol: frfPrintFullFiReport
Warning duplicate symbol: frfPrintLine
Warning duplicate symbol: frfPrintNoReport
Warning duplicate symbol: frfPrintReport
Warning duplicate symbol: frfPutMoney
Warning duplicate symbol: frfQueryReport
Warning duplicate symbol: frfRegetResult
Warning duplicate symbol: frfRegetStatus
Warning duplicate symbol: frfRepeatDocument
Warning duplicate symbol: frfSetCallBackProcedure
Warning duplicate symbol: frfSetCommunicationPassword
Warning duplicate symbol: frfSetDateTime
Warning duplicate symbol: frfSetDriverReadMode
Warning duplicate symbol: frfSetFelixSpeed
Warning duplicate symbol: frfSetFont
Warning duplicate symbol: frfSetFontDensity
Warning duplicate symbol: frfSetFooter
Warning duplicate symbol: frfSetPayKindNames
Warning duplicate symbol: frfSetPayNames
Warning duplicate symbol: frfSetSerialNumber
Warning duplicate symbol: frfSetTaxNames
Warning duplicate symbol: frfSetTaxRates
Warning duplicate symbol: frfSetTextOffset
Warning duplicate symbol: frfSetTitle
Warning duplicate symbol: frfTotal
 
c:\test.dll>
 

 
причем как я понимю, не нравится из-за
Код:
HFelix H;

может надо как описать в cpp файле что за HFelix, что мы его берем из felix.h или ....
 
с помощью impdef felix.def felix.dll -a -c  я получил

Код:
 
LIBRARY     FELIX.DLL
 
EXPORTS
    ___CPPdebugHook                @48  ; ___CPPdebugHook
    frfAddGoods                    @15  ; frfAddGoods
    frfAddGoodsRepeat              @23  ; frfAddGoodsRepeat
    frfCloseCicle                  @26  ; frfCloseCicle
    frfCloseDocument               @18  ; frfCloseDocument
    frfDiscount                    @19  ; frfDiscount
    frfDoFiscalize                 @10  ; frfDoFiscalize
    frfDocumentStorno              @21  ; frfDocumentStorno
    frfDocumentTaxes               @20  ; frfDocumentTaxes
    frfDoneTransport               @2   ; frfDoneTransport
    frfGetDateTime                 @33  ; frfGetDateTime
    frfGetDocumentNumber           @7   ; frfGetDocumentNumber
    frfGetErrorString              @5   ; frfGetErrorString
    frfGetFelixStatus              @3   ; frfGetFelixStatus
    frfGetMoney                    @29  ; frfGetMoney
    frfGetSNandINN                 @9   ; frfGetSNandINN
    frfGetSerialNumber             @8   ; frfGetSerialNumber
    frfInitTransport               @1   ; frfInitTransport
    frfNewBigDocument              @24  ; frfNewBigDocument
    frfNewCicle                    @6   ; frfNewCicle
    frfNewDocument                 @14  ; frfNewDocument
    frfPays                        @17  ; frfPays
    frfPrintDateReport             @11  ; frfPrintDateReport
    frfPrintFullFiReport           @13  ; frfPrintFullFiReport
    frfPrintLine                   @43  ; frfPrintLine
    frfPrintNoReport               @12  ; frfPrintNoReport
    frfPrintReport                 @25  ; frfPrintReport
    frfPutMoney                    @28  ; frfPutMoney
    frfQueryReport                 @27  ; frfQueryReport
    frfRegetResult                 @46  ; frfRegetResult
    frfRegetStatus                 @44  ; frfRegetStatus
    frfRepeatDocument              @22  ; frfRepeatDocument
    frfSetCallBackProcedure        @45  ; frfSetCallBackProcedure
    frfSetCommunicationPassword    @30  ; frfSetCommunicationPassword
    frfSetDateTime                 @32  ; frfSetDateTime
    frfSetDriverReadMode           @4   ; frfSetDriverReadMode
    frfSetFelixSpeed               @47  ; frfSetFelixSpeed
    frfSetFont                     @40  ; frfSetFont
    frfSetFontDensity              @41  ; frfSetFontDensity
    frfSetFooter                   @34  ; frfSetFooter
    frfSetPayKindNames             @36  ; frfSetPayKindNames
    frfSetPayNames                 @35  ; frfSetPayNames
    frfSetSerialNumber             @39  ; frfSetSerialNumber
    frfSetTaxNames                 @37  ; frfSetTaxNames
    frfSetTaxRates                 @38  ; frfSetTaxRates
    frfSetTextOffset               @42  ; frfSetTextOffset
    frfSetTitle                    @31  ; frfSetTitle
    frfTotal                       @16  ; frfTotal
 

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А разве в felix.h не описана структура HFelix? Как я понимаю, это указатель.
И как ругается билдер при использовании felix.h и lib или def файлов. Такое ощущение, что описанные в felix.h функции не совпадают с реально присутствующими в dll, т.к. в def файле для функции после @ сообщается количество байт передающихся в качестве параметров. Поэтому для  frfInitTransport должно было быть @16.

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

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

Цитата:
Такое ощущение, что описанные в felix.h функции не совпадают с реально присутствующими в dll, т.к. в def файле для функции после @ сообщается количество байт передающихся в качестве параметров.

 
Ну вы блин даете (c) не мой
 
В .def фале после @ идет ordinal (порядковый) номер функции в dll. На самом деле получать адрес функции в dll можно двумя способами с помощью имени функции или ее порядкового номера. Вот для этого в def файле и пишется порядковый номер.
 
На самом деле def файл для использования dll в программе совсем не нужен. Он нужен при компиляции dll.

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



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

Цитата:
На самом деле def файл для использования dll в программе совсем не нужен. Он нужен при компиляции dll.  

Я как раз это написал утром, в предыдущем посте... spike, не читал или не понял?  

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
spike
 
Прежде чем прдолжать вкратце и несколько образно опишу процесс сборки exe из исходников.
 
1 шаг это компиляция набора .c файлов (модулей) с исходным кодом в объектный код (obj файлы). Объектный код - это код на машинном языке. Отличие его от реально исполняемого кода образно говоря в следующем. Объектный код содержит набор скомпилированных в машинный код функций, содержащихся в исходном коде.  При этом имя функции на языке программирования переводится во внутренне представление (которое в частности может быть точно таким же как и исходное, или содержать знак подчеркивания перед исходным именем или какое-либо другое представление).
 
Важно то, что на этапе компиляции компилятор, встречая в исходном коде вызов какой либо функции, не пытается найти ее. Вместо этого он заносит ссылку (reference) на эту функцию в таблицу вызываемых функций и в том месте где эта функция вызывается он вставляет не реальный адрес функции а ссылку на таблицу вызываемых функций.
 
2 шаг link-овка. Утилита link (называемая также редактором связей) проходит по всем obj и lib файлам указанным ей и пытается для каждой записи, указанной в списке вызываемых функций найти ее реализацию либо в других obj файлах, либо в lib файлах.
Если функция нигде не найдена, то и появляется то сообщение которое ты получил.
 

Цитата:
[Linker Error] Unresolved external 'frfInitTransport(const char *, const char *, int)' referenced from C:\TEST.DLL\UNIT1.OBJ  

 
Затем, если все в порядке, эта утилита ищет точку входа в программу. Точка входа эта та функция которой передается управление при старте программы. В языке C это функция main. Далее все указанные obj модули собираются в один exe модуль. После этого в том месте где вызываются функции вместо ссылки на таблицу функций вставляется найденный адрес функции.  
 
 
Собственно где может быть ошибка.
 
1. Ни в одном из файлов нет описания этой функции.
2. В lib файле эта функция описана, но то внутренне представление имени функции которое сгенерил компилятор не совпадает с тем которое записано в lib файле.
 
В твоем случае скорее всего второе.
 
С чем это может быть связано.
 
1. Возможно, действительно, внутренне имя содержит '_' соответственно нужна задать утилите implib опцию -а. То, что у тебя пошли warnings связано с опцией -c для утилиты implib. Убери эту опцию или игнорируй warnings и попробуй все собрать. Если не получится то второй вариант.
 
2. Тут немного сложнее. Поскольку язык c++ позволяет создавать перегруженные функции (функции с одинаковыми именами, но разными входными параметрами), то внутреннее имя функции сгенерированное компиляром c++ сильно отличается от имени сгенерированного компилятором c. Вот пример внутреннего имени в c++

Цитата:
??0?$CEmbeddedButActsLikePtr@VCMapPtrToPtr@@@@QAE@XZ
.
Оно содержит закодированное число и типы параметров функции.
Внутренне имя можно увидеть в def файле поэтому из приведенного тобой листинга видно, что в dll функции описаны в формате c.
 
Что делать?
 
Нужно указать c++ компилятору, что та функция которую ты вызываешь являетя функцией c и соответственно нужно при компиляции использовать c формат.
 
Сделать это можно двумя способами.  
 
1. В описании функции написть extern "C" (описание находится в фале filex.h).
2. В файле felix.h в начале файла поставить следующее:
 
#ifdef __cplusplus
extern "C" {
#endif  /* __cplusplus */
 
а в конце следующее:
 
#ifdef __cplusplus
}
#endif  /* __cplusplus */
 
Этот способ лучше. Он проверяет, если компилятор C++, то все объеявления в h файле будут интерпретироваться как c.
 
Почему я подумал о втором варианте. В той ошибке которую ты написал сказано, что не найдена функция с таким-то именем и указан список ее параметров. В случае C представления утилита link видит только название функци и ничего не знает о ее входных и выходных параметрах. А вот в случае C++ она может из внутреннего представления получить эти данные.
 
Может в твоем felix.h уже есть такое, тогда пиши будем разбираться дальше.
 

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
drobitko
Поддержу твой почин:
 Kомпоновщик создает LIB-файл со списком идентификаторов, экспортируемых из DLL Этот LIB-файл нужен при сборке любого ЕХЕ-модуля, ссылающегося на такие идентификаторы. Компоновщик также вставляет в конечный DLL-файл таблицу экспортируемых идентификаторов - раздел экспорта, в котором содержится список (в алфавитном порядке) идентификаторов экспортируемых функций, пeрeмeнных и классов.
(Воспользовавшись утилитой DumpBin.exe (с ключом -exports) из состава Microsoft Visual Studio, мы можем увидеть содержимое раздела экспорта в DLL-модуле.)
 Kомпоновщик собирает все OBJ-модули в конечный ЕХЕ-модуль. Для этого он должен знать, в каких DLL содержатся импортируемые идентификаторы, на которые есть ссылки в коде Информацию об этом он получает из передаваемого ему LIBфайла. Я уже говорил, что этот файл — просто список идентификаторов, экспортируемых DLL.    Компоновщик должен удостовериться в существовании идентификатора, на который Вы ссылаетесь в коде, и узнать, в какой DLL он находится. Если компоновщик сможет разрешить все ссылки на внешние идентификаторы, на свет появится ЕХЕ-модуль.

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 18:09 17-02-2004
spike



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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
spike
Еще капля теории:
 Если компоновщик обнаружит, что DLL экспортирует хотя бы одну переменную или функцию, то создаст и LIB-файл Этот файл совсем крошечный, поскольку в нем нет ничего, кроме cписка символьных имен функций и переменных, экспортируемых из DLL.
 Из-за искажения имен нужно применять один и тот же компилятор. Даже при программировании на стандартном С инструментальные средства от разных поставщиков создают проблемы. Дело в том, что компилятор Microsoft С, экспортируя С-функцию, искажает eе имя, даже если Вы вообще не пользуетесь С++. Это происходит, только когда Ваша функция экспортируется по соглашению __stdcall. (Увы, это самое популярное соглашение). Тогда компилятор Microsoft искажает имя С-функции. впереди ставит знак подчеркивания, а к концу добавляет суффикс, состоящий из символа @ и числа байтов, передаваемых функции в качестве параметров...
 Чтобы средствами Microsoft собрать DLL, способную работать с инструментарием от другого поставщика, нужно указать компилятору Microsoft экспортировать имя функции бeз искажений...
 Один из способов cделать это как раз и есть *.def -файл...

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 09:32 18-02-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dll написана на Delphi хотя может и на C++Builder 5

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



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

Цитата:
dll написана на Delphi хотя может и на C++Builder 5

Это сути дела не меняет... С выполнением всех "рекомендаций", проблем не будет...

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 09:54 18-02-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
felix.h - здесь не все функции, а только те, что нужны для работы мне

Код:
 
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
    Драйвер для работы с фискальным регистратором "Феликс-Ф Р"
                           ОАО Счетмаш
 
    Пример использования драйвера:
        ........
        HFelix H;
        H = frfInitTransport("COM1", "AERF", 0);
        frfNewCicle(H, "01.01.01", "09:00", "Доп. строка");
        frfNewDocument(H, 0, 0,  "Иванов", "1", "1", "00000001", "Доп. строка", NULL);
        frfAddGoods(H, 1, "Молоко", "097854658", "15.20", "1", "шт.",
                          "Отдел 2", "Доп. строка", NULL, NULL);
        frfTotal(H, 1, NULL);
        frfPays(H, 0, "20.00", "", NULL, NULL);
        frfCloseDocument(H, 1);
        ........
        frfDoneTransport(H);
        ........
 
*******************************************************************************/
////////////////////////////////////////////////////////////////////////////////
 
 
 
 
////////////////////////////////////////////////////////////////////////////////
////////////// Специфичные для драйвера функции и типы данных //////////////////
////////////////////////////////////////////////////////////////////////////////
 
//  Дескриптор открытого для обмена устройства
typedef unsigned int HFelix;
 
typedef unsigned char byte;
typedef unsigned short int word;
typedef unsigned int cardinal;
 
//  Структура для получения состояния машины,
//  после выполнения последней команды
struct frfFelixStatus {
  byte ErrorCode;                 //  22.3  Результат выполнения команды
  byte HardStatus;                //  22.1  Постоянный статус машины
  word CurrentStatus;             //  22.2  Текущий статус машины
  byte PrinterStatus;             //  22.4  Состояние печатающего устройства
};
 
//      Открыть COM порт для обмена
HFelix frfInitTransport(const char* PortName, const char* Password, int SPEED);
 
//      Закрыть COM порт
int frfDoneTransport(HFelix H);
 
//      получить статус машины, возвращенный последней командой
int frfGetFelixStatus(HFelix H, frfFelixStatus* Status);
 
//      получить строку с объяснением ошибки по коду ошибки
int frfGetErrorString(HFelix H, byte ErrorCode, char* ErrorString);
 
//             Установить процедуру обратного вызова
void frfSetCallBackProcedure(HFelix H, int (*Proc)(int, char*));
// при обработке команды драйвер может вызывать процедуру обратной связи.
/* процедура обратной связи должна быть примерно такой:
int MyCallBackProcedure(int Message, char* Param)
{
  if (Message == 1)
  {
    после вызова команды для Феликса процедура обратной связи вызавается с Message == 1
    Param содержит указатель на строку с названием выполняемой команды (на русском языке)
  }
  if (Message & 0x300 == 256)
  {
    после этого процедура обратной связи вызавается по одному разу для каждого
    входного параметра команды - Message имеет установленный восьмой бит
    и младший байт содержит номер параметра, а Param - значение
    (в том виде, как оно будет передано на Феликс)
  }
  if (Message == 0)
  { пока Феликс выполняет команду, драйвер примерно каждые 40 мс опрашивает
    Феликс. Если примерно 7 секунд ответа нет вообще, то цикл прерывается, и
    считается, что Феликс повис, или связи нет.
    Если же Феликс отвечает на запросы, то, после каждой проверки статуса,
    вызавается процедура обратной связи с Message == 0.
    Здесь можно прочитать состояние (командой frfGetFelixStatus), проанализировать его,
    (если, например, установлены биты "нет бумаги", то сообщить пользователю)
    и возвратить 1 или 0.
    Если возвратить 0 - драйвер прекратит ожидать ответ на текущей комаду и возвратит
    управление основной программе, если возвратить 1 - работа будет продолжена.
  }
  if (Message & 0x300 == 512) {
    после выполнения команды этого процедура обратной связи вызавается по одному
    разу для каждого возвращаемого параметра команды - Message имеет установленный
    девятый бит и младший байт содержит номер параметра, а Param - значение
    (в том виде, как оно принято с Феликса)
  }
  return 1;
}
 
*/
 
 
////////////////////////////////////////////////////////////////////////////////
//////////////        Функции фискального регистратора        //////////////////
////////////////////////////////////////////////////////////////////////////////
 
 
//      23.1  Открыть смену
int frfNewCicle(HFelix H, char* Date, char* Time, char* Comment);
 
//      25.1.1  Начать формирование документа на чековой ленте
int frfNewDocument(HFelix H, int DocKind, int GroupKind,  char* Operator,
                   char* N1, char* N2, char* AccountNo, char* Comment,
                   char* DocumentNumber);
 
//      25.1.2  Продажа (чековая  лента)
typedef unsigned int frfGoodsKind;
 
int frfAddGoods(HFelix H, frfGoodsKind IsGoods, char* GoodsName, char* GoodsCode,
                char* Price, char* Quantity, char* Units,
                char* Department, char* Comment,
                char* Summa, char* Total);
 
//      25.1.3  Итог (чековая лента)
int frfTotal(HFelix H, int Final, char* Total);
 
//      25.1.4  Расчет (чековая лента)
int frfPays(HFelix H, int PayKind, char* Summa, char* PayCardNameAndNumber,
            char* Need, char* Left);
 
//      25.1.5  Закрытие документа (чековая лента)
//      25.1.8  Аннулирование (чековая лента)
int frfCloseDocument(HFelix H, int Apply);
 
//      25.1.11  Повторный чек (чековая лента)
int frfRepeatDocument(HFelix H);
 
//      27.1 Печать финансового отчета (Отчет Х)
int frfPrintReport(HFelix H);
 
//      27.2 Печать отчета закрытия смены (Отчет Z)
int frfCloseCicle(HFelix H);
 
//      27.7  Внесение денежных сумм
int frfPutMoney(HFelix H, char* Summa, char* OldSumma, char* NewSumma);
 
//      27.8 Инкассация (изъятие) денежных сумм
int frfGetMoney(HFelix H, char* Summa, char* OldSumma, char* NewSumma);
 

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



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

Цитата:
здесь не все функции, а только те, что нужны для работы мне  

На первый взгляд ничего настораживающего...

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 10:31 18-02-2004
spike



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

Цитата:
1. В описании функции написть extern "C" (описание находится в фале filex.h).  
2. В файле felix.h в начале файла поставить следующее:  
 
#ifdef __cplusplus  
extern "C" {  
#endif  /* __cplusplus */  
 
а в конце следующее:  
 
#ifdef __cplusplus  
}  
#endif  /* __cplusplus */  

 
теперь Линковщик пишет
Код:
[Linker Error] Unresolved external '_frfInitTransport(const char *, const char *, int)' referenced from C:\TEST.DLL\UNIT1.OBJ

 
Т.е. добавилось перед функцией знак поподчеркивания
в felix.h я изменил так:

Код:
//      Открыть COM порт для обмена
extern "C" HFelix frfInitTransport(const char* PortName, const char* Password, int SPEED);
 
//      Закрыть COM порт
extern "C" int frfDoneTransport(HFelix H);

 
Тут я нарыл старые исходники их программы, там есть прямой доступ к регистратору. и там я нашел драйвер, я думаю что это почти таже dll, я сейчас пытаюсь подключить.
Может как-то можно выдрать код из этого файла и вставиьт в свою программу и не использовать dll-ку ?  
FelixDRV.cpp

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

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

Цитата:
теперь Линковщик пишет  
Код:[Linker Error] Unresolved external '_frfInitTransport(const char *, const char *, int)' referenced from C:\TEST.DLL\UNIT1.OBJ  

Пересоздай lib файл с оцией -a утилите implib - должно помочь.
 

Цитата:
Тут я нарыл старые исходники их программы, там есть прямой доступ к регистратору. и там я нашел драйвер, я думаю что это почти таже dll, я сейчас пытаюсь подключить.  
Может как-то можно выдрать код из этого файла и вставиьт в свою программу и не использовать dll-ку ?  
FelixDRV.cpp  

Это опасно. А вдруг, они протокол изменили, да так, что сразу не поймешь. В простых случаях работать будет, а в сложных валится или, что хуже, данные искажать.

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



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

Код:
c:\test.dll>implib felix.lib felix.dll -a -c  

или опции надо перед felix.lib ?
 
 
Добавлено
вообщем получилось
 
но возникла другая ошибка. при вызове функции frfDoneTransport(H) ошибка Access Violation, но я поставил try и catch пустой и вроде пашет.
 
но вот есть одна беда, которую никак не получается победить
 
в файле felix.h есть функция
Код:
 
//      25.1.2  Продажа (чековая  лента)
typedef unsigned int frfGoodsKind;
const frfGoodsKind FRF_TARA 0;
const frfGoodsKind FRF_TOVAR 1;
 
extern "C" int frfAddGoods(HFelix H, frfGoodsKind IsGoods, char* GoodsName, char* GoodsCode, char* Price, char* Quantity, char* Units, char* Department, char* Comment, сhar* Summa, char* Total);
 

и вот компилятор ругается на
Код:
const frfGoodsKind FRF_TARA 0;
const frfGoodsKind FRF_TOVAR 1;

пишет что константы должны быть проинициализированны
 
если я их удаляю, эти строки, то все типа ок, но когда я пытаюсь  

Код:
1 HFelix H;  
2 H = frfInitTransport("COM1", "AERF", 0);  
3 frfNewCicle(H, "01.01.01", "09:00", "Доп. строка");  
4 frfNewDocument(H, 0, 0,  "Иванов", "1", "1", "00000001", "Доп. строка", NULL);  
5 frfAddGoods(H, 1, "Молоко", "097854658", "15.20", "1", "шт.", "Отдел 2", "Доп. строка", NULL, NULL);  
6 frfTotal(H, 1, NULL);  
7 frfPays(H, 0, "20.00", "", NULL, NULL);  
8 frfCloseDocument(H, 1);  
9 try{frfDoneTransport(H);}ctach(...){}

и вот 4 строка распечатывается и на 5ой опять access violation при это окошко Builder не ICONSTOP а ICONINFORMATION, т.е. не знак ошибки а знак инйормации и при этом вывод окошко с машинными кодами
 
есть подозрение, что ему не нравится, что я убил эти константы
 
в чем может быть трабл ????
 

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

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

Цитата:
и вот компилятор ругается на  
Код:const frfGoodsKind FRF_TARA 0;  
const frfGoodsKind FRF_TOVAR 1;  
 
пишет что константы должны быть проинициализированны  

 
Ну это победить еще проще:
 
правильный формат для инициализации констант:
 
const frfGoodsKind FRF_TARA = 0;  
const frfGoodsKind FRF_TOVAR = 1;  
 
И все должно заработать.
 

Цитата:
но возникла другая ошибка. при вызове функции frfDoneTransport(H) ошибка Access Violation, но я поставил try и catch пустой и вроде пашет.  

 
А вот это плохо То, что не появляется Access Vialoation это еще не значит, что все хорошо. Ты поставил блок try и catch для отлова этих самых Access Vialotion, но поскольку блок пустой, то ты не видишь ошибок. Поставь в блоке catch вывод на экран сообщения и увидишь, что не все так хорошо.
 
 
А другие функции нормально отработали?
 

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
некоторые тоже access violation вызывают, причем очень важные
 
похоже, что-то у них с dll-кой не все окей
 
 
 
Добавлено
может в это тоже поможете ???
http://forum.ru-board.com/topic.cgi?forum=33&topic=2843#1

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня есть подозрение, в чем дело.
 
Для того, что-бы проверить нужно сделать следующее.
 
1. Пересоздать lib файл утилитой implib только без опции -a. Т.е.  
 
c:\test.dll>implib felix.lib felix.dll
 
2. В файле felix.h перед каждой функцией поставить префикс __stdcall. Например:
 
int __stdcall frfDoneTransport(HFelix H);
 
Кстати у тебя в твоих постах перед функциями стоит extern "C". Это не надо делать если ты вставил в felix.h следующее:
 

Цитата:
#ifdef __cplusplus  
extern "C" {  
#endif  /* __cplusplus */  
   
а в конце следующее:  
   
#ifdef __cplusplus  
}  
#endif  /* __cplusplus */

 
3. Пересобрать приложение.
 
4. Попробовать
 
Что собственно делается этими изменениями объясню чуть позже.

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



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

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 19:54 20-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-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru