Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Ошибка после вызова процедуры из dll  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 564
Добрый день!

Столкнулся с такой ситуацией. Есть библиотека на Си написанная. Её грузим при открытии формы. Выгружаем на Destroy.
Есть Action, в котором ищем необходимую процедуру в dll-ке и выполняем её. Но после выполнения всего кода в Action у меня вылетает циклический Access Violation на выделенной строке.
unit System.Classes;
...
function TBasicActionLink.Update: Boolean;
begin
  Result := not FAction.Suspended and FAction.Update;
end;

В чем может быть проблема?
Заранее благодарен за конструктив.

Сообщение было отредактировано: 19 мар 20, 16:07
19 мар 20, 16:07    [22102309]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4200
Леонов Юрий
В чем может быть проблема?

В декларации процедуры, например.
19 мар 20, 16:10    [22102312]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 564
вот кусок кода вызова процедуры из dll
function TfrmReestr.CheckSign(PData, PSign: TBytes; PDataLen, PSignLen: Integer; out PErrorText: string): Boolean;
{DLL_API DWORD sfVerifyData( void *Data, DWORD LenData, BYTE *Sign, DWORD LenSign, char *SignInfoXml);}
var
  LSignInfo: PAnsiChar;
  LError: Integer;
  VerifyDLL: function(Data: TBytes; LenData: Integer; Sign: TBytes;
    LenSign: Integer; SignInfoXml: PAnsiChar): Integer; stdcall;
begin
  Result := False;
  PErrorText := '';
  @VerifyDLL := nil;
  @VerifyDLL := GetProcAddress(FLibHandle, '?sfVerifyData@@YAKPEAXKPEAEKPEAD@Z');
  if @VerifyDLL <> nil then
  begin
    LError := VerifyDLL(PData, PDataLen, PSign, PSignLen, LSignInfo);
    if LError = 0 then
      Result := True
    else
      PErrorText := 'Помилка підписання даних: ' + GetErrorDesc(LError);
  end
  else // если мы  не нашли функцию в Dll
    PErrorText := 'Помилка підписання даних: функція підпису не знайдена!';
  @VerifyDLL := nil;
end;
19 мар 20, 16:24    [22102330]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 564
Kazantsev Alexey
В декларации процедуры, например.

В чем именно? Библиотека не моя, но контакт с автором есть.
19 мар 20, 16:32    [22102341]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4200
Леонов Юрий,

Сишная функция точно stdcall? Ещё, смотрю, LSignInfo не инициализируется...
19 мар 20, 16:43    [22102360]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 564
Kazantsev Alexey
Леонов Юрий,

Сишная функция точно stdcall? Ещё, смотрю, LSignInfo не инициализируется...


функция вроде stdcall, дополнительно спросил автора, а LSignInfo - out параметр, он и не должен инициализироваться
19 мар 20, 16:57    [22102390]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4200
Леонов Юрий
а LSignInfo - out параметр, он и не должен инициализироваться

Если он out, то почему у тебя не out?
19 мар 20, 17:00    [22102400]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6604
Леонов Юрий,


попробуйте:

var
   iSavedCW: word;
begin
   iSavedCW := Get8087CW;
   Set8087CW(iSavedCW or $7);
   try
      ... здесь вызов функции из DLL ...
   finally
      Set8087CW(iSavedCW);  
   end;


я однажды подобным образом вынужден был LoadLibrary / FreeLibrary / GetProcAddress / и все вызовы функций из либы обвязать

Сообщение было отредактировано: 19 мар 20, 17:06
19 мар 20, 17:03    [22102407]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49515

Леонов Юрий
Data: TBytes;

void* это совсем-совсем не TBytes.

Posted via ActualForum NNTP Server 1.5

19 мар 20, 17:08    [22102418]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49515

Леонов Юрий
LSignInfo - out параметр

Он не может быть out параметром, что-то ты напутал.

Posted via ActualForum NNTP Server 1.5

19 мар 20, 17:16    [22102434]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4200
Dimitry Sibiryakov
void* это совсем-совсем не TBytes.

TBytes можно рассматривать, как нетипизированный указатель.
19 мар 20, 17:17    [22102439]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12217
Dimitry Sibiryakov
Леонов Юрий
Data: TBytes;

void* это совсем-совсем не TBytes.
Да и последний параметр сомнителен.
19 мар 20, 17:17    [22102441]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12217
Kazantsev Alexey
TBytes можно рассматривать, как нетипизированный указатель.
В любом случае нужно память под него зарезервировать.
19 мар 20, 17:21    [22102450]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4200
Соколинский Борис
В любом случае нужно память под него зарезервировать.

Разумеется. Предполагается, что вызывающая сторона заботится об этом :)
19 мар 20, 17:24    [22102456]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 564
Kazantsev Alexey,
в этот параметр возвращается xml. Все работает, тесты были успешные.
19 мар 20, 17:35    [22102475]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31138

19.03.2020 17:35, Леонов Юрий пишет:
>
> в этот параметр возвращается xml. Все работает, тесты были успешные.
>

случайности не случайны! (С)

Posted via ActualForum NNTP Server 1.5

19 мар 20, 17:36    [22102480]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4200
Леонов Юрий
Все работает

Как выяснилось, не всё.
19 мар 20, 17:38    [22102482]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка после вызова процедуры из dll  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 564
Блин, точно сам лопух!
LSignInfo := GetMemory(4096); 
пропустил.
Вроде заработало, посмотрю дальше что будет. Всем спасибо за участие!
19 мар 20, 17:51    [22102488]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить