Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2021, 16:22   #1
Kat1807
 
Регистрация: 24.12.2020
Сообщений: 7
По умолчанию Ошибка Access violation на последней строчке кода при использовании нестандартной библиотеки

Добрый день, уважаемые гуру!
Бьюсь с проблемой уже неделю, но решить не выходит.
Была поставлена библиотека для работы с купленным софтом. Библиотека содержит пользовательские типы данных, на основе Connection и record. Имеются и функции, написанные в этих библиотеках. Первый вроде как отрабатывает нормально(Проблем с коннекшеном нет, соединение происходит штатно). Похоже, что дело во втором. Обращалась к разработчикам библиотеки, они утверждают, что библиотека должна работать и не только в Дельфи, но и в других языках(примеры приводят на Питоне)
Вызывает проблемы кусок с вызовом CreateReport3NF
Приведу 2 примера кода. Первый частично работает, НО docInfo должен иметь тип наследуемый от record, а потом нужно получить доступ к его полям

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  ConV:Variant;
  RepV:Variant;
  userName, userPassword,serverName: WideString;
  docInfo: Variant;
  docInfo2 : DocIden absolute docinfo;

  nRepType: Integer;
  bAssignOutNum: Boolean;
  nEmit: Integer;
  szAccountId: WideString;
  lCaNumb: Integer;
  dtBeginDate: TDateTime;
  bUseEndDate: Integer;
  dtEndDate: TDateTime;
  szOperNum: WideString;
  outputFileName: string;
begin
  ConV := CreateOleObject('ZenithObject.Connection2');
  userName     := 'user';      // имя пользователя
  userPassword := 'pass';       // пароль
  serverName   := 'server' ;         // имя сервера (точка - текущая машина)
  ConV.Open(serverName, userName, userPassword);
  RepV:=ConV.CreateReportsObject;
  nRepType:= 10060;
  bAssignOutNum:= 0;
  nEmit:=125;
  szAccountId := '';
  lCaNumb:= 0;
  dtBeginDate:= Today;
  bUseEndDate:= 0;
  dtEndDate:= Today;
  szOperNum:= '';
  docInfo := RepV.CreateReport3NF(nRepType, bAssignOutNum, nEmit,szAccountId, lCaNumb, dtBeginDate, bUseEndDate, dtEndDate, szOperNum);
Исключения не вылетают.
Второй вариант с использованием библиотечных типов

Код:
 
procedure TForm1.Test;
userName, userPassword,serverName: WideString;
Con:IConnection2;
Rep:IReports;

  docInfo: DocIden;
 nRepType: Integer;
 bAssignOutNum: Integer;
 nEmit: Integer;
 szAccountId: WideString;
 lCaNumb: Integer;
 dtBeginDate: TDateTime;
 bUseEndDate: Integer;
 dtEndDate: TDateTime;
 szOperNum: WideString;
 outputFileName: string;
begin
 Con:=CoConnection2.Create;
  try
  userName     := 'user';      // имя пользователя
  userPassword := 'password';       // пароль
  serverName   := 'server' ;         // имя сервера (точка - текущая машина)
  Con.Open(serverName, userName, userPassword);

  Rep:=Con.CreateReportsObject;
  nRepType:= 10060;
  bAssignOutNum:= 0;
  nEmit:=125;
  szAccountId := '';
  lCaNumb:= 0;
  dtBeginDate:= Today;
  bUseEndDate:= 0;
  dtEndDate:= Today;
  szOperNum:= '';
  docInfo := Rep.CreateReport3NF(nRepType, bAssignOutNum, nEmit,szAccountId, lCaNumb, dtBeginDate, bUseEndDate, dtEndDate, szOperNum);
  outputFileName := 'C:\1\1.xml';
   Rep.GetOutDoc(DocInfo.strLocalId, 2, outputFileName);//получение значения поля record
   finally
    Con.Close;
   end;
Получение значения отрабатывает, в файл записывается, НО в конце вылетает Access violation. Если последней строчкой будет Con.Close;, то отладчик покажет на него, если ShowMassage - то на него, если все стереть, то укажет, на Rep.GetOutDoc(DocInfo.strLocalId, 2, outputFileName);
Короче, на любую последнюю строку. Но если закомментировать CreateReport3NF, то этого не происходит.
Понимаю, что задачка выглядит абстрактно, но уже не знаю на что подумать, и как понять в чем конкретно проблема



Код:
function TReports.CreateReport3NF(nRepType: Integer; bAssignOutNum: Integer; nEmit: Integer; 
                                  const szAccountId: WideString; lCaNumb: Integer; 
                                  dtBeginDate: TDateTime; bUseEndDate: Integer; 
                                  dtEndDate: TDateTime; const szOperNum: WideString): DocIden;
begin
  Result := DefaultInterface.CreateReport3NF(nRepType, bAssignOutNum, nEmit, szAccountId, lCaNumb, 
                                             dtBeginDate, bUseEndDate, dtEndDate, szOperNum);
end;

Последний раз редактировалось Kat1807; 24.05.2021 в 16:44. Причина: дополнение
Kat1807 вне форума Ответить с цитированием
Старый 27.05.2021, 10:44   #2
Kat1807
 
Регистрация: 24.12.2020
Сообщений: 7
По умолчанию

Вопрос решился. Нужна была принудительная очистка record и уменьшение счетчика объектов интерфейса.
Код:
FillChar(docInfo, SizeOf(DocIden), 0);
Rep._Release;
Помимо этого подключение(импорт) tlb из dll корректнее выполнил Delphi XE5 нежели Delphi7
Kat1807 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возникает ошибка Acces Violation при использовании функции Copy Вадим Мошев Общие вопросы Delphi 9 07.05.2011 22:27
TList. Ошибка Access Violation при создании. thexqn Помощь студентам 3 28.11.2010 21:01
Access violation at address при использовании DLL spamer Общие вопросы Delphi 4 27.08.2009 22:19
в последней строчке ошибка! почему?? (Pascal) -=t-r-a-s-h=- Помощь студентам 6 02.06.2009 17:11