Добавлено: 09 Март 2004, 12:38
Здрствуйте!
Есть внешяя библиоткека с набором различных функций написанная на Delphi.
Подключить билиотеку к проекту получилось. Получается так же вызывать простые функции. Но есть функции, которые использовать не получается. Привожу описание функций из документации на библиотеку:
1)function cbAddTitleLine(Line: PChar): Integer;
Принимаемые параметры:
Line - указатель на нуль-терминированную строку, содержащую строку заголовка.
Возвращаемые значения:
1 - в случае успешного завершения;
0 - в случае возникновения ошибки.
2)function cbGetTitleLine(Index: Integer; var Line: PChar): Integer;
Принимаемые параметры:
Index - номер строки заголовка, которую необходимо получить;
Line - переменная, через которую возвращается указатель на нуль-терминированную строку, содержащую
текст запрошенной строки заголовка.
Возвращаемые значения:
1 - в случае успешного завершения;
0 - в случае возникновения ошибки.
Первая ф-ция добавляет строку в массив библиотеки, а 2-я считывает.
3) function cbAddSale(Name: PChar; Price, Qty: Double; Section: Integer): Integer;
4) function cbGetSale(Index: Integer; var Name: PChar; var Price, Qty: Double; var Section: Integer): Integer;
Аналогично для 3-й и 4-й. Одна добавляет,а другая считывает.
Как правильно описать прототипы этих функций и осуществлять их вызов?
Спасибо!
С увжением, Анатолий
(Добавление)
По идее так, хотя могу и ошибаться (не использовал никогда стыковку Clarion + Delphi):
1) cbAddTitleLine(*Cstring Line), Long, Raw
2) cbGetTitleLine(Long Index, *Cstring Line), Long, Raw
3) cbAddSale(*Cstring Name, Real Price, Real Qty, Long Section), Long, Raw
4) cbGetSale(Long Index, *Cstring Name, *Real Price, *Real Qty, *Long Section), Long, Raw
Best regards,
Andrew Listiev
Work mailto:andrewl@inbox.lv
Home mailto:gidravlic@mhm.lv
ICQ UID: 169357390
MS Messenger: werdna_werdna@hotmail.com
Спасибо!
У меня сработал вариант:
cbAddTitleLine(*Cstring Line), Long,Pascal,Raw
cbGetTitleLine(Long Index, *Cstring Line), Long, Pascal,Raw
Вернее обе функции возвращают код успеха. А вот как правильно объявить переменую из которой считывается и в которую заносится строка.
У меня проходит только CSTRING(18). Все другое приводит к аварийному закрытию приложения. Как вообще правильно сделать вызов функций?
Извиняюсь!
Забыл упомянуть, что хоть вариант CSTRIN(18) сраьатывает, но переменная при использовании второй функции остается пустой. Пожоже ничего на записывается и ничего не считывается!
"Анатолий" <gik7@list.ru>
А почему именно размер 18? может нжуно больший буфер дать? да и посмотреть что там возвращается побайтово в строке...
--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757
В описании библиотеки есть пример использовании ф-ции на Delphi. С Delphi я не знаком, но по коду вроде видно, что объявлется переменная и стоит размер 18. Как только я установил CSTRING(18), так работать все стало, только информация пожоже не записывается и не считывается. Все другие варианты объявления переменной, вырубают приложение напрочь при вызове ф-ций.
Кстати, в библиотеки есть такая ф-ция:
function GetErrorMsg: PChar;
Принимаемые параметры:
PChar -Указатель на нуль-терминированную строку, содержащую сообщение об ошибке.
Возвращаемые значения:
1 - в случае успешного завершения;
0 - в случае возникновения ошибки.
Для нее я сделал прототип GetErrorMsg (),CSTRING,PASCAL,RAW и все работает. Проблема только с выше приведенными ф-циями.
"Анатолий" <gik7@list.ru>
(Добавление)
А почему "похоже"? Еще раз - в этом буфере после вызова есть что-то или нет?
А какие еще были варианты декларации?
Может стоит дать CSTRING(19)?
Или как минимум привести пример гарантированно корректного использования на делфях. Иначе все это похоже на гадание на кофейной гуще
--
Best regards,
Vadym
cbGetTitleLine
Описание:
function cbGetTitleLine(Index: Integer; var Line: PChar): Integer;
Принимаемые параметры:
Index - номер строки заголовка, которую необходимо получить;
Line - переменная, через которую возвращается указатель на нуль-терминированную строку, содержащую текст запрошенной строки заголовка.
Возвращаемые значения:
1 - в случае успешного завершения;
0 - в случае возникновения ошибки.
Функция позволяет получить текст строки заголовка чека, добавленной ранее во внутренний массив загруженного экземпляра библиотеки при помощи функции cbAddTitleLine.
Пример
Если делаю CSTRING(19), то приложение вылетает.
Могу выслать проект с библиотекой и описанием самой библиотеки. Если кто знает как заставить это работать, буду очень признателен!
"Анатолий" <gik7@list.ru>
(Добавление)
Вот оно ключевое слово: "возвращается указатель" ! Т.е. переменную декларируешь не ты. Тебе говорят где лежит результат. Попробуй так:
И не забыть
DISPOSE(pLocLineCopy)
Nick Tsigouro <nick@arsis.ru>
Хм, и что же мы, Николай, должны увидеть в Message(pLocLineCopy) ?
Если функция возвращает указатель на некую созданную в самой DLL
0-терминированную строку, то надо, получив этот указатель:
1. определить длину строки (функция StrLen)
2. создать нужный CSTRING буфер для копии
3. скопировать строку в этот буфер (функция StrCpy)
4. Обработать полученную копию и освободить буфер.
И все это потому, что в Clarion-е нет указателей.
При этом, кстати, прототипы лучше такие использовать:
Можно попробовать другой вариант, по идее должно сработать. Эмулировать
указатель в Clarion-e.
Удачи!
__________________________________
Владимир Якимченко (ICQ: 16993194)
TmpLine = ALL('<0>',SIZE(TmpLine))
С уважением, Андрей Истомин
(Добавление)
Привет, Всем!
Пардон, с прототипами ошибся. Так правильнее (если вообще правильно
) :
Удачи!
__________________________________
Владимир Якимченко (ICQ: 16993194)
Написал: ClaList(2)
Есть внешяя библиоткека с набором различных функций написанная на Delphi.
Подключить билиотеку к проекту получилось. Получается так же вызывать простые функции. Но есть функции, которые использовать не получается. Привожу описание функций из документации на библиотеку:
1)function cbAddTitleLine(Line: PChar): Integer;
Принимаемые параметры:
Line - указатель на нуль-терминированную строку, содержащую строку заголовка.
Возвращаемые значения:
1 - в случае успешного завершения;
0 - в случае возникновения ошибки.
2)function cbGetTitleLine(Index: Integer; var Line: PChar): Integer;
Принимаемые параметры:
Index - номер строки заголовка, которую необходимо получить;
Line - переменная, через которую возвращается указатель на нуль-терминированную строку, содержащую
текст запрошенной строки заголовка.
Возвращаемые значения:
1 - в случае успешного завершения;
0 - в случае возникновения ошибки.
Первая ф-ция добавляет строку в массив библиотеки, а 2-я считывает.
3) function cbAddSale(Name: PChar; Price, Qty: Double; Section: Integer): Integer;
4) function cbGetSale(Index: Integer; var Name: PChar; var Price, Qty: Double; var Section: Integer): Integer;
Аналогично для 3-й и 4-й. Одна добавляет,а другая считывает.
Как правильно описать прототипы этих функций и осуществлять их вызов?
Спасибо!
С увжением, Анатолий
(Добавление)
По идее так, хотя могу и ошибаться (не использовал никогда стыковку Clarion + Delphi):
1) cbAddTitleLine(*Cstring Line), Long, Raw
2) cbGetTitleLine(Long Index, *Cstring Line), Long, Raw
3) cbAddSale(*Cstring Name, Real Price, Real Qty, Long Section), Long, Raw
4) cbGetSale(Long Index, *Cstring Name, *Real Price, *Real Qty, *Long Section), Long, Raw
Best regards,
Andrew Listiev
Work mailto:andrewl@inbox.lv
Home mailto:gidravlic@mhm.lv
ICQ UID: 169357390
MS Messenger: werdna_werdna@hotmail.com
Спасибо!
У меня сработал вариант:
cbAddTitleLine(*Cstring Line), Long,Pascal,Raw
cbGetTitleLine(Long Index, *Cstring Line), Long, Pascal,Raw
Вернее обе функции возвращают код успеха. А вот как правильно объявить переменую из которой считывается и в которую заносится строка.
У меня проходит только CSTRING(18). Все другое приводит к аварийному закрытию приложения. Как вообще правильно сделать вызов функций?
Извиняюсь!
Забыл упомянуть, что хоть вариант CSTRIN(18) сраьатывает, но переменная при использовании второй функции остается пустой. Пожоже ничего на записывается и ничего не считывается!
"Анатолий" <gik7@list.ru>
А почему именно размер 18? может нжуно больший буфер дать? да и посмотреть что там возвращается побайтово в строке...
--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757
В описании библиотеки есть пример использовании ф-ции на Delphi. С Delphi я не знаком, но по коду вроде видно, что объявлется переменная и стоит размер 18. Как только я установил CSTRING(18), так работать все стало, только информация пожоже не записывается и не считывается. Все другие варианты объявления переменной, вырубают приложение напрочь при вызове ф-ций.
Кстати, в библиотеки есть такая ф-ция:
function GetErrorMsg: PChar;
Принимаемые параметры:
PChar -Указатель на нуль-терминированную строку, содержащую сообщение об ошибке.
Возвращаемые значения:
1 - в случае успешного завершения;
0 - в случае возникновения ошибки.
Для нее я сделал прототип GetErrorMsg (),CSTRING,PASCAL,RAW и все работает. Проблема только с выше приведенными ф-циями.
"Анатолий" <gik7@list.ru>
(Добавление)
Как только я установил CSTRING(18), так работать все стало, только информация пожоже не записывается и не считывается.
А почему "похоже"? Еще раз - в этом буфере после вызова есть что-то или нет?
Все другие варианты объявления переменной, вырубают приложение
напрочь при вызове ф-ций.
А какие еще были варианты декларации?
Может стоит дать CSTRING(19)?
Или как минимум привести пример гарантированно корректного использования на делфях. Иначе все это похоже на гадание на кофейной гуще
--
Best regards,
Vadym
cbGetTitleLine
Описание:
function cbGetTitleLine(Index: Integer; var Line: PChar): Integer;
Принимаемые параметры:
Index - номер строки заголовка, которую необходимо получить;
Line - переменная, через которую возвращается указатель на нуль-терминированную строку, содержащую текст запрошенной строки заголовка.
Возвращаемые значения:
1 - в случае успешного завершения;
0 - в случае возникновения ошибки.
Функция позволяет получить текст строки заголовка чека, добавленной ранее во внутренний массив загруженного экземпляра библиотеки при помощи функции cbAddTitleLine.
Пример
Код: Выделить всё
procedure TDemoForm.ReadTitleButtonClick(Sender: TObject); //Читаем весь заголовок
var
i, Count: Integer;
ResultStr: String;
TempLine: PChar;
S: String[18];
begin
Count:=cbGetTitleLinesCount; //Получаем число строк заголовка
ResultStr:='';
TempLine:=@S;
for i:=1 to Count do
begin
if cbGetTitleLine(i, TempLine)<>1 then //Читаем строку
begin
ShowMessage(GetErrorMsg);
Exit;
end;
ResultStr:=ResultStr+String(TempLine)+#13+#10;
end;
ShowMessage(ResultStr);
end;
Могу выслать проект с библиотекой и описанием самой библиотеки. Если кто знает как заставить это работать, буду очень признателен!
"Анатолий" <gik7@list.ru>
(Добавление)
Вот оно ключевое слово: "возвращается указатель" ! Т.е. переменную декларируешь не ты. Тебе говорят где лежит результат. Попробуй так:
Код: Выделить всё
pLine &CString
pLocLineCopy &CString
If cbGetTitleLine(Index, pLine)
LineCopyLen# = Len(pLine) + 1
pLocLineCopy = New(CString(LineCopyLen#))
Message(pLocLineCopy)
else
Message('O-o-ps ;-(')
end
DISPOSE(pLocLineCopy)
Nick Tsigouro <nick@arsis.ru>
Хм, и что же мы, Николай, должны увидеть в Message(pLocLineCopy) ?

Если функция возвращает указатель на некую созданную в самой DLL
0-терминированную строку, то надо, получив этот указатель:
1. определить длину строки (функция StrLen)
2. создать нужный CSTRING буфер для копии
3. скопировать строку в этот буфер (функция StrCpy)
4. Обработать полученную копию и освободить буфер.
И все это потому, что в Clarion-е нет указателей.
При этом, кстати, прототипы лучше такие использовать:
Код: Выделить всё
MAP
cbGetTitleLine (SIGNED nIndex, ULONG pcLine),SIGNED,PASCAL
MODULE('Clarion RTL')
StrCpy (ULONG pcDestStr, ULONG
pcSourceStr),CSTRING,PROC,RAW,NAME('_strcpy')
StrLen (ULONG pcStr),UNSIGNED,PROC,NAME('_strlen')
END
END
указатель в Clarion-e.
Код: Выделить всё
nIndex SIGNED
ResLineGrp GROUP
cLine &CSTRING
END
ResLinePointer ULONG,OVER(ResLineGrp)
CODE
...
IF cbGetTitleLine(nIndex, ResLinePointer)
! Здесь работаем с полученным указателем, как с ResLineGrp.cLine
END
__________________________________
Владимир Якимченко (ICQ: 16993194)
Перед вызовом сделайЕсли делаю CSTRING(19), то приложение вылетает.
TmpLine = ALL('<0>',SIZE(TmpLine))
С уважением, Андрей Истомин
(Добавление)
Привет, Всем!
Пардон, с прототипами ошибся. Так правильнее (если вообще правильно

Код: Выделить всё
MAP
MODULE('MyDelphi.dll')
cbGetTitleLine (SIGNED nIndex, *ULONG pcLine),SIGNED,PASCAL
END
MODULE('Clarion RTL')
StrCpy (ULONG pcDestStr, ULONG
pcSourceStr),CSTRING,PROC,RAW,NAME('_strcpy')
StrLen (ULONG pcStr),UNSIGNED,PROC,NAME('_strlen')
END
END
__________________________________
Владимир Якимченко (ICQ: 16993194)
Написал: ClaList(2)