![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 это возврат из функции(внутрисерверный обработчик ошибок). |