Объявление

Свернуть
Пока нет объявлений.

Использование CPSNXML.dll

Свернуть
X
  • Фильтр
  • Время
  • Показать
  • Сортировать
  • Упорядочить по
Очистить всё
новые сообщения

    Использование CPSNXML.dll

    Здравствуйте!

    К сожалению не удаются попытки воспользоваться CPSNXML.dll.

    Например код (Delphi, Win32):
    Код:
    program Project1;
    {$APPTYPE CONSOLE}
    uses
      SysUtils,
      Windows;
    
      function cpsnInitLib(Parent: THandle; BaseDir: LPCTSTR): HRESULT; external 'CPSNXML.dll';
    
    var
      BaseDir: LPCTSTR;
    begin
      BaseDir := PAnsiChar(ExtractFileDir(ParamStr(0)));
      cpsnInitLib(0, BaseDir);
    end.
    Выдает: Ошибка при инициализации библиотеки: Нет доступа к папке й@Іяялли!·яяђ\Xsd.
    Скомпилированный исполняемый файл расположен в папке с CPSNXML.dll.

    Такой код: (С#, .net):
    Код:
    [DllImport("CPSNXML.dll", CharSet = CharSet.Ansi, PreserveSig = false)]
    private static extern void cpsnInitLib(IntPtr hParent, string baseDir);
    
    cpsnInitLib(IntPtr.Zero, @"C:\Program Files\ПФР");
    Выдает: Ошибка при инициализации библиотеки: Ошибка базы данных классификатора.

    Версия CPSNXML.dll: 7.1.3.5

    В чем может быть проблема?

    #2
    Аналогичная проблема.

    Аналогичная проблема.

    Подключаю библиотеку из Delphi, пробовал и динамическую загрузку и
    статическую.

    В варианте с динамическим подключением не инициализируется
    библиотека пишет нет доступа к папке й@Іяялли!·яяђ\Xsd., варианты параметров cpsnInitLib пробовал самые разные, ошибка одна и таже, такое впечатление что на basedir не реагирует.

    Код:
    @cpsnInitLib:=nil;
    xmlLibHandle:=LoadLibrary(xmlC_dir+'\cpsnxml.dll');
    if xmlLibHandle >= 32 then begin
      @cpsnInitLib := GetProcAddress(xmlLibHandle,'cpsnInitLib');
    
      if @cpsnInitLib<>nil then
      try
        if cpsnInitLib(handle,  LPCTSTR(exe_path+xmlC_dir) ) <>0 then
          info_message('Ошибка при инициализации checkPSN_XML')
        else xmlC_init:=true;
      except
        info_message('Ошибка при инициализации checkPSN_XML');
      end;
    
      xmlC_init:=false;
      FreeLibrary(xmlLibHandle);
    end;

    В другом варианте (статическое подключение) подключение и проверка проходит нормально, но при завершении работы библиотеки cpsnFreeLib выдает access violation.

    Код:
    const xmlC_dir='cpsnxml';
    function cpsnInitLib( hParent: THandle; BaseDir: LPCTSTR): integer; stdcall; external xmlC_dir+'\cpsnxml.dll';
    function cpsnFreeLib( ): hresult; stdcall; external xmlC_dir+'\cpsnxml.dll';
    function cpsnValidate ( fileName: LPCTSTR; pnError: pinteger; pnWarning: pinteger ): integer;
      stdcall; external xmlC_dir+'\cpsnxml.dll';
    function cpsnValidate2 ( fileName: LPCTSTR ): hresult; stdcall; external xmlC_dir+'\cpsnxml.dll';
    function cpsnGetLogFileName ( fileName: LPCTSTR; logName: LPCTSTR; maxNameLen: integer; FullPath: boolean ): integer;
      stdcall; external xmlC_dir+'\cpsnxml.dll';

    Комментарий


      #3
      Походу разработчики где-то закосячили

      Проблема наблюдается при статическом связывании, походу не коректно отрабатывает освобождение библиотеки.
      Однако есть решение, главное не забывать о stdcall.

      var
      FName: string;
      BaseDir:string;
      xmlLibHandle:THANDLE;
      cpsnInitLib:function(Parent: THandle; BDir: LPCTSTR):HRESULT;stdcall;
      cpsnValidateZ:function(lpszXmlFn:LPCTSTR):HRESULT ;stdcall;
      cpsnFreeLib:function:HRESULT;stdcall;
      begin
      FName:=('x:\XXX.xxx');
      BaseDir:='X:\XXXXXX\XXXXXXXXXXX\CPSNXML\';
      @cpsnInitLib:=nil;
      @cpsnValidateZ:=nil;
      @cpsnFreeLib:=nil;

      xmlLibHandle:=LoadLibrary('CPSNXML\CPSNXML.dll');
      if xmlLibHandle >= 32 then
      begin
      @cpsnInitLib := GetProcAddress(xmlLibHandle,'cpsnInitLib');
      if @cpsnInitLib<>nil then
      try
      if cpsnInitLib(0,PChar(BaseDir))<>0 then showmessage('Ошибка при инициализации checkPSN_XML');
      except
      showmessage('Ошибка при инициализации checkPSN_XML');
      end;
      @cpsnValidateZ := GetProcAddress(xmlLibHandle,'cpsnValidateZ');
      if @cpsnValidateZ<>nil then
      try
      cpsnValidateZ(PChar(FName));
      except
      showmessage('Ошибка cpsnValidateZ');
      end;
      if @cpsnFreeLib<>nil then
      try
      if cpsnFreeLib<>0 then showmessage('Ошибка cpsnFreeLib');
      except
      showmessage('Ошибка cpsnFreeLib');
      end;
      if not FreeLibrary(xmlLibHandle) then showmessage('Ошибка освобождения');
      end;

      Так се замечательо работает

      Комментарий

      реклама

      Свернуть
      Обработка...
      X