![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Существует приложение типа системы без GUI, в состав которой входят уже несколько прикладных программ, работающих на общих библиотеках dll. Так же в комплекте идёт пакет для разработки, включающий в себя хедеры для Си и файлы сценариев .vb для Бейсик.
Как я понимаю, на основе этой информации, можно при правильном синтаксисе использовать эти функции? Последний раз редактировалось Olstgel, 27.01.2018 в 23:35. |
#2
|
|||
|
|||
![]() ПОнимаешь правильно. просто надо написать правильный импорт функций. Например, как-то так:
Код:
function __apiCheckVersion(versionCompatibility : Integer; versionInfo : PChar) : Boolean; extern 'dllname.dll'; |
#3
|
|||
|
|||
![]() Ну да, вроде так и применяю. Но вот беда - в исходном хедере функция инициализации сервера описана так:
'С# Код:
FAR PASCAL Init(unsigned int far *handle); Мой "сервер" запускается и инициализируется (могу видеть эти процессы), но от своей программы в этот момент получаю краш "Debugger fault notification: access violation at addr=..., write of addr=... . Process stoped". Последний раз редактировалось Olstgel, 27.01.2018 в 23:37. |
#4
|
|||
|
|||
![]() Ну дык правильно крашится, у тебя функция неправильно описана. Должно быть как-то так:
Код:
function __apiInit(var Handle : Cardinal) : Boolean; stdcall; external 'Api32.dll'; |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Olstgel (18.12.2017)
|
#5
|
|||
|
|||
![]() только не boolean, а BOOL
|
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
Olstgel (18.12.2017)
|
#6
|
|||
|
|||
![]() Спасибо! С моим-то опытом даже в голову не пришла мысль.
Последний раз редактировалось Olstgel, 18.12.2017 в 15:15. |
#7
|
|||
|
|||
![]() Вот такой вопрос ещё:
Функция должна передавать версию сервера (5 символов). Код:
implementation Function BVersion (comp: longint; vtxt: shortstring; var vlen: integer) : integer; stdcall; external '2.dll'; //------------ Function Version( var comp : longint; var vInf : string) : integer; var tmp : shortString; n : Integer; begin result := BVersion(Comp, tmp, n); If n > 0 Then begin vInf := ansimidstr(tmp,0, n); //ansileftstr(tmp, n); end; end; а переменная "tmp" приносит только '.1.3'#0#0#0..... По какой причине пропущен первый символ? Эта же функция в бейсике возвращает '6.1.3'. Последний раз редактировалось Olstgel, 27.01.2018 в 23:38. |
#8
|
|||
|
|||
![]() Потому что shortstring не совсем тот тип, который надо использовать. передай туда массив [0..255] of char или что-то подобное. Потом его можно через pchar перевести в нормальную строку.
ЗЫ. В shortstring первый байт занят под длинну строки, вот ты и получаешь что-то неправильное. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Olstgel (31.12.2017)
|
#9
|
|||
|
|||
![]() Да, ключевым решением оказалось объявление tmp [0..255] as char и vtxt как Pchar. Изначально пробовал, но vtxt ума не хватило сразу переопределить.
Странно почему в таблице соответствия типов VB/С/Delphi об этом ни слова. Может не так ищу или читаю. Главное - что с вашими подсказками всё начинает сразу работать. )) Спасибо!! |
#10
|
|||
|
|||
![]() Дело в том, что для паскалевских строк (shortstring) вообще нет аналогов в других языках. Так что по определению надо использовать аналоги PChar или что-то с ним совместимое. Т.е. можно было сразу выделить память под PChar и его передавать в функцию.
|
#11
|
|||
|
|||
![]() И снова у меня затык.
![]() И опять по старым чертежам: пробую в Бейсике - всё работает, перекладываю в Делфи - отваливается. Опишу проблему комментариями в кодах 'VB Код:
Private Declare Function VBstart Lib "vb.dll" (scope&) As Integer Private Declare Sub VBstep Lib "vb.dll" (ByVal scope&, ByVal modl$, ByVal step$, ByVal Pars$, ByVal pars2$) Function Fstart() As Integer Fstart = VBstart(dllscope) End Function Sub Fstep(ByVal modl$, ByVal step$, ByVal Pars$, ByVal pars2$) If Len(modl) = 0 Then modl = "" End If If Len(step) = 0 Then step = "" End If If Len(Pars) = 0 Then pars = "" End If If Len(pars2) = 0 Then pars2 = "" End If Call VBstep(dllscope, modl, step, pars, pars2) End Sub Private Sub Step_Button_Click() modl = "Test" step = "Data" Call Fstart Call Fstep(modl, step, Pars, pars2) End Sub 'Pas Код:
Function Fstart() :integer; Procedure Fstep(modl : string; step : string; pars : string; pars2 : string); implementation Function VBstart(var scope: longint) : integer; stdcall; external 'vb.dll'; Procedure VBstep (var scope: LongInt; modl: string; step: string; pars: string; pars2: string); stdcall; external 'vb.dll'; // функ. запуска сервера. function Fstart() :integer; begin result:= VBstart(dllscope); end; // проц. загрузки файла на сервер Procedure Fstep(modl : string; step : string; pars : string; pars2 : String); begin If Length(modl) = 0 Then begin modl := ''; End; If Length(step) = 0 Then begin step := ''; End; If Length(pars) = 0 Then begin pars := ''; End; If Length(pars2) = 0 Then begin pars2 := ''; End; VBstep(dllscope, modl, step, pars, pars2); end; procedure TForm1.Step_Click(Sender: TObject); begin modl:='Test'; // передаём заведомо известные значения в переменные step:='Data'; Fstart(); // инициализируем сервер Fstep(modl, step, pars, pars2); // отправляем Fstep('Test', 'Data','', '') // ... // в этом месте находится следующая функция (независимая от состояния сервера), //которая выдаёт сообщение об ошибке в случае неуспешной // операции. end; Даже если я буду передавать Fstep('', '','', '') в таком виде, то по условию сервера мне должен прийти ответ "FILE NOT FOUND" (моделировал ситуацию в Бейсике), а пока что постоянно вижу только "ACCESS DENIED" как в случае, если сервер не инициализирован. Хотя после функции Fstep я продолжаю видеть сервер в состоянии "Ready" Использую Delphi7 , Win_XP_32x. Последний раз редактировалось Olstgel, 03.01.2018 в 00:39. |
#12
|
|||
|
|||
![]() 1. Тебе уже сказали, что String не годится для функции из DLL.
2. ACCESS DENIED это возврат из функции или эксепшн? |
#13
|
|||
|
|||
![]() Цитата:
Передавал и как Pchar - итог одинаков. Кстати некоторые функции у меня всё же работают с типом String. ACCESS DENIED это возврат из функции(внутрисерверный обработчик ошибок). |