Есть внешяя библиоткека с набором различных функций написанная на 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)