Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 01, November, 2014 13:14

Здравствуйте.
Хочу поинтересоваться, как можно получить программный доступ к полю ключ АРМа Каталогизатор: [yadi.sk]
Есть ли у него какой-то уникальный идентификатор среди окон программы?

Re: Доступ извне к полю Ключ
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 01, November, 2014 19:15

artgonch написал(а):
-------------------------------------------------------
> Хочу поинтересоваться, как можно получить
> программный доступ к полю ключ АРМа Каталогизатор:
> [yadi.sk]
> Есть ли у него какой-то уникальный идентификатор
> среди окон программы?

Это обычный дельфийский контрол TTntEdit, ничем не выделяющийся среди множества своих собратьев. Точно такой же живёт, например, в диалоге «Поиск по словарю/Рубрикатору». Изучение его с помощью утилиты Spy++ (см. приложенный снимок экрана), входящей в поставку Microsoft Visual Studio, не обнаружило у него никаких специфических особенностей (что логично).

Внимательное изучение ресурсов cirbisc_new_unicode.exe показывает, что на самом деле контролов «Ключ» несколько: один для поиска по обычному словарю, другой – для поиска по дереву рубрикатора (есть и ещё и третий, похоже, пока не задействованный). Просто остальные контролы не видны, пока не активируется соответствующий режим. Внешне же они выглядят одинаково, пользователь не замечает подмены (если только он не вооружён Spy++). Так что «заложиться» на один идентификатор контрола не получится.

object FindKeyEdit: TTntEdit
              Left = 32
              Top = 6
              Width = 185
              Height = 22
              Anchors = [akLeft, akTop, akRight, akBottom]
              TabOrder = 0
              OnChange = FindKeyEditChange
              OnEnter = DictionStringGridEnter
              OnKeyDown = FindKeyEditKeyDown
              OnKeyPress = FindKeyEditKeyPress
            end
...
          object TntEdit1: TTntEdit
            Left = 88
            Top = 64
            Width = 121
            Height = 22
            Font.Charset = RUSSIAN_CHARSET
            Font.Color = clWindowText
            Font.Height = -11
            Font.Name = 'Arial'
            Font.Style = []
            ParentFont = False
            TabOrder = 3
            Text = 'TntEdit1'
            Visible = False
          end
...
            object RubFindKeyEdit: TTntEdit
              Left = 32
              Top = 6
              Width = 185
              Height = 22
              Anchors = [akLeft, akTop, akRight, akBottom]
              TabOrder = 0
              OnChange = RubFindKeyEditChange
              OnEnter = DictionStringGridEnter
              OnKeyDown = FindKeyEditKeyDown
              OnKeyPress = RubFindKeyEditKeyPress
            end

С точки зрения Delphi все эти контролы имеют уникальные (в пределах формы) идентификаторы (FindKeyEdit, TntEdit1, RubFindKeyEdit). Но добраться до идентификаторов средствами WinAPI, похоже, не выйдет.

Впрочем, добраться до самого контрола довольно несложно. Вот программка, которая устанавливает текст в поле «Ключ» и посылает в него перевод строки, чтобы АРМ показал список найденных документов. Вся магия сосредоточена в методе SetKeyText.

using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace IrbisKeyWindow
{
    public partial class MainForm : Form
    {
        public delegate bool EnumChildProc
        (
            IntPtr hwnd,
            IntPtr lParam
        );

        [DllImport("User32")]
        public static extern IntPtr FindWindow
            (
                string lpClassName,
                string lpWindowName
            );

        [DllImport("User32")]
        public static extern bool EnumChildWindows
            (
                IntPtr hWndParent,
                EnumChildProc lpEnumFunc,
                IntPtr lParam
            );

        [DllImport("User32")]
        public static extern int GetClassName
            (
                IntPtr hWnd,
                StringBuilder lpClassName,
                int nMaxCount
            );

        [DllImport("User32", SetLastError = false)]
        public static extern int SendMessage
            (
                IntPtr hWnd,
                int msg,
                IntPtr wParam,
                string lParam
            );

        [DllImport("User32", SetLastError = false)]
        public static extern int SendMessage
            (
                IntPtr hWnd,
                int msg,
                int wParam,
                int lParam
            );

        private const int WM_SETTEXT = 0x000C;
        private const int WM_CHAR = 0x0102;
        private const int VK_RETURN = 0x0D;

        public MainForm()
        {
            InitializeComponent();
        }

        private IntPtr foundHwnd;

        private bool MyEnumProc
            (
                IntPtr hwnd,
                IntPtr param
            )
        {
            StringBuilder builder = new StringBuilder(1024);
            GetClassName ( hwnd, builder, builder.Capacity );
            if ( builder.ToString () == "TTntEdit.UnicodeClass" )
            {
                foundHwnd = hwnd;
                return false;
            }
            return true;
        }

        private void SetKeyText ( string text )
        {
            IntPtr mainHwnd = FindWindow("TCmainForm", null);
            if (mainHwnd == IntPtr.Zero)
            {
                MessageBox.Show("Не могу найти АРМ Каталогизатор!");
                return;
            }

            foundHwnd = IntPtr.Zero;
            EnumChildWindows(mainHwnd, MyEnumProc, IntPtr.Zero);
            if ( foundHwnd == IntPtr.Zero )
            {
                MessageBox.Show ( "Не могу найти окно Ключ!" );
            }
            else
            {
                SendMessage(foundHwnd, WM_SETTEXT, IntPtr.Zero, text);
                Thread.Sleep(100);
                SendMessage(foundHwnd, WM_CHAR, VK_RETURN, 0);
            }
        }

        private void button1_Click
            (
                object sender, 
                EventArgs e
            )
        {
            SetKeyText ( textBox1.Text );
        }

        [STAThread]
        static void Main()
        {
            Application.Run(new MainForm());
        }
    }
}



Редактировано 1 раз. Последний раз 01.11.2014 19:21 пользователем amironov73.

Вложения: 2014-11-01_234048.png (9.8KB)  
Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 01, November, 2014 19:51

Спасибо

Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 02, November, 2014 06:31

А вот если в системе запущено несколько копий Каталогизатора или Книговыдачи... В этом случае хорошо бы узнать, какое окно расположено под тем, которое в данный момент наверху (т.е. окно моей программы). Возможно это узнать? Google ничего толкового не дал...

Re: Доступ извне к полю Ключ
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 02, November, 2014 10:01

artgonch написал(а):
-------------------------------------------------------
> А вот если в системе запущено несколько копий
> Каталогизатора или Книговыдачи... В этом случае
> хорошо бы узнать, какое окно расположено под тем,
> которое в данный момент наверху (т.е. окно моей
> программы). Возможно это узнать? Google ничего
> толкового не дал...

В зависимости от того, какой смысл Вы вкладываете в «наверху», может помочь API GetActiveWindow или GetForegroundWindow (окно, имеющее фокус ввода, не обязательно имеет самый большой Z-индекс).

Вообще, отношение «над/под» для окон управляется так называемым Z-индексом. Z-индекс для интересующего Вас окна можно вычислить, например, так:
int GetZOrder(IntPtr hWnd)
{
    var z = 0;
    for (IntPtr h = hWnd; h != IntPtr.Zero; h = GetWindow(h, 3)) z++;
    return z;
}
А затем можно сравнивать: то окно, у которого Z-индекс больше, визуально располагается «над» тем, у которого индекс меньше.

Перечислить открытые главные окна Каталогизатора и Книгообеспеченности можно через API EnumWindows. Главное окно Каталогизатора имеет класс TCmainForm, Книговыдачи – TWbmainForm.



Редактировано 2 раз. Последний раз 02.11.2014 13:08 пользователем amironov73.

Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 02, November, 2014 14:48

Спасибо, попробую.

У меня идея такая. Хочу сделать маленькое расширение для Каталогизатора. Его можно вызывать, нажав кнопку на панели инструментов. Морочиться из-за этого с C++ я не хочу. .NET - самое подходящее дело. Пользователь нажимает кнопку на панели инструментов, моя программа показывает окно с полем ввода. Пользователь вводит запрос, программа обращается к серверу ИРБИС, получает от него ответ и вставляет этот ответ в поле Ключ Каталогизатора. Для этого мне и нужно знать, какое окно расположено "под" окном моей программы.

Re: Доступ извне к полю Ключ
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 02, November, 2014 16:30

artgonch написал(а):
-------------------------------------------------------
> У меня идея такая. Хочу сделать маленькое
> расширение для Каталогизатора. Его можно вызывать,
> нажав кнопку на панели инструментов. Морочиться
> из-за этого с C++ я не хочу. .NET - самое
> подходящее дело. Пользователь нажимает кнопку на
> панели инструментов, моя программа показывает окно
> с полем ввода. Пользователь вводит запрос,
> программа обращается к серверу ИРБИС, получает от
> него ответ и вставляет этот ответ в поле Ключ
> Каталогизатора. Для этого мне и нужно знать, какое
> окно расположено "под" окном моей программы.

Это всё сильно упрощает. Поскольку Ваше расширение будет являться частью процесса АРМ, то опознать «своё» окно АРМа очень легко:

1. Узнаём идентификатор своего процесса с помощью GetCurrentProcessId или Process.GetCurrentProcess().Id, смотря что больше нравится.

2. Перебираем окна верхнего верхнего уровня с помощью EnumWindows.

3. То окно, у которого класс равен "TCmainForm", а GetWindowThreadProcessId выдаёт идентификатор «нашего» процесса, и есть искомое.

После этого процесс АРМа в полном нашем распоряжении smiling smiley

Выглядеть это может примерно так (внимание, код не тестировался!):
        public delegate bool EnumWindowsProc
        (
            IntPtr hwnd,
            IntPtr lParam
        );

        [DllImport("User32")]
        public static extern bool EnumWindows
            (
                EnumWindowsProc lpEnumFunc,
                IntPtr lParam
            );

        [DllImport("User32")]
        public static extern int GetClassName
            (
                IntPtr hWnd,
                StringBuilder lpClassName,
                int nMaxCount
            );

        [DllImport("User32")]
        public static extern int GetWindowThreadProcessId
            (
                IntPtr hWnd,
                out int lpdwProcessId
            );

        private bool MyEnumProc
            (
                IntPtr hwnd,
                IntPtr param
            )
        {
            StringBuilder builder = new StringBuilder(1024);
            GetClassName(hwnd, builder, builder.Capacity);
            if (builder.ToString() == "TCmainForm")
            {
                int procId;
                GetWindowThreadProcessId ( hwnd, out procId );
                if ( procId == Process.GetCurrentProcess ().Id )
                {
                    foundHwnd = hwnd;
                    return false;
                }
            }
            return true;
        }

        private IntPtr FindArmWindow ()
        {
            foundHwnd = IntPtr.Zero;
            EnumWindows ( MyEnumProc, IntPtr.Zero );
            return foundHwnd;
        }



Редактировано 1 раз. Последний раз 02.11.2014 16:32 пользователем amironov73.

Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 02, November, 2014 16:45

Спасибо за подсказку. Но разве можно на .NET сделать расширение для АРМа Каталогизатор?

Re: Доступ извне к полю Ключ
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 02, November, 2014 18:23

artgonch написал(а):
-------------------------------------------------------
> Спасибо за подсказку. Но разве можно на .NET
> сделать расширение для АРМа Каталогизатор?

Всё, что не запрещено, разрешено. Разве кто-то запрещал делать расширения к ИРБИС на управляемых языках? smiling smiley
Лично я сделал почти десяток.

Самое сложное в этом деле – экспортировать точку входа в DLL, но большая часть работы уже сделана за нас добрыми людьми: http://www.codeproject.com/Articles/37675/Simple-Method-of-DLL-Export-without-C-CLI и http://www.codeproject.com/Articles/16310/How-to-Automate-Exporting-NET-Function-to-Unmanage

На нашу долю остаётся только приписать [ExportDll] к соответствующему статическому методу, и вперёд, к свершениям!
private static string GetUtfString
   (
       IntPtr buf
   )
{
   List<byte> bytes = new List<byte>();
   for (int offset = 0; offset < int.MaxValue; offset++)
      {
          byte b = Marshal.ReadByte(buf, offset);
          if (b == 0)
                break;
          bytes.Add(b);
      }
   string result = Encoding.UTF8.GetString(bytes.ToArray());
   return result;
}

private static void SetResult
   (
       IntPtr buf,
       int size,
       byte[] result
   )
{
    byte[] dummy = new byte[size];
    Marshal.Copy(dummy, 0, buf, size);
    size = Math.Min(result.Length, size);
    Marshal.Copy(result, 0, buf, size);
}

[ExportDll("Show", CallingConvention.Winapi)]
public static int Show
    (
        IntPtr buf1,
        IntPtr buf2,
        int size
    )
{
   // Получаем привычную строку .Net
   string text = GetUtfString(buf1);

   // Показываем, что нам пришло
   MessageBox.Show (text); 
   // Можно сделать что-нибудь более осмысленное :)

   // Заполняем буфер результатом нашей бурной деятельности
   byte[] result = new UTF8Encoding(false).GetBytes(text);
   SetResult(buf2, size, result);
   
   // Сообщаем АРМу, что мы модифицировали запись
   return 1;
}
Ограничения тут два:

1. Надо компилировать DLL как 32-битную, т. к. АРМ является 32-битным процессом, и смешивать модули разной разрядности Microsoft не разрешает. Впрочем, если расширение будут запускать только на 32-битных машинах, можно компилировать как AnyCPU.

2. В один процесс может быть загружено произвольное количество управляемых модулей при условии, что все они пользуются одной и той же версией .Net framework, например, 3.5 SP1. При попытке смешать модули разных версий фреймворка (даже 3.0 с 3.5) возможны любые эксцессы вплоть до аварийного вылета АРМ.

Подключается это дело к АРМ обычным образом:
[USERMODE]
UMNUMB=8
...
UMDLL3=LookAVD.dll
UMFUNCTION3=Show
UMPFT3=lookavd.pft
UMNAME3=Сводный каталог ИО
UMGROUP3=1
UMICON3=AVD2
...

Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 06, November, 2014 05:55

Спасибо!

Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 04, January, 2016 10:03

Здравствуйте.
С Новым Годом.
Вот наконец дошли у меня руки сделать свое расширение для клиента ИРБИС в .NET. И вот с какой трудностью я столкнулся: не могу совладать с утилитой DllExporter.exe. В каталоге у меня лежат 3 файла: моя DLL, DllExporter.exe и DllExporter.exe.config. В последнем такой текст (пути в ildasm.exe и ilasm.exe я прописал):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" 
        type="System.Configuration.ApplicationSettingsGroup, 
        System, Version=2.0.0.0, Culture=neutral, 
        PublicKeyToken=b77a5c561934e089" >
            <section name="ExportDll.Properties.Settings"
        type="System.Configuration.ClientSettingsSection,
        System, Version=2.0.0.0, Culture=neutral,
        PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <ExportDll.Properties.Settings>
            <setting name="ildasmpath" serializeAs="String">
                <value>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe</value>
            </setting>
            <setting name="ilasmpath" serializeAs="String">
                <value>C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\ilasm.exe
                </value>
            </setting>
        </ExportDll.Properties.Settings>
    </applicationSettings>
</configuration>

Но программа выдает сообщение: Cannot localte ildasm.exe.

Re: Доступ извне к полю Ключ
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 04, January, 2016 11:23

artgonch написал(а):
-------------------------------------------------------
> С Новым Годом.
> Вот наконец дошли у меня руки сделать свое
> расширение для клиента ИРБИС в .NET. И вот с какой
> трудностью я столкнулся: не могу совладать с
> утилитой DllExporter.exe. В каталоге у меня лежат
> 3 файла: моя DLL, DllExporter.exe и
> DllExporter.exe.config. В последнем такой текст
> (пути в ildasm.exe и ilasm.exe я прописал):
> Но программа выдает сообщение: Cannot localte
> ildasm.exe.

Вы уверены, что точно привели текст сообщения об ошибке? Я попробовал подставить Ваш конфиг, у меня программа выдала
ipdf.il(195) : warning : Reference to undeclared extern assembly 'ExportDllAttribute'. Attempting autodetect
ipdf.il(195) : warning : Failed to autodetect assembly 'ExportDllAttribute'
Тем не менее, все полагающиеся методы она-таки экспортировала, если верить утилите depends.exe (см. приложенный снимок экрана, методы Sum и CountPages).

http://irbis.gpntb.ru/file.php?24,file=13520

Вот какой вариант config у меня работает много лет без малейших нареканий (тьфу-тьфу! smiling smiley):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" 
        type="System.Configuration.ApplicationSettingsGroup, 
        System, Version=2.0.0.0, Culture=neutral, 
        PublicKeyToken=b77a5c561934e089" >
            <section name="ExportDll.Properties.Settings"
        type="System.Configuration.ClientSettingsSection,
        System, Version=2.0.0.0, Culture=neutral,
        PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <ExportDll.Properties.Settings>
            <setting name="ildasmpath" serializeAs="String">
                <value>C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe</value>
            </setting>
            <setting name="ilasmpath" serializeAs="String">
                <value>C:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe</value>
            </setting>
        </ExportDll.Properties.Settings>
    </applicationSettings>
</configuration>
У Вас установлен .NET версии 2.0? ExportDll.exe, похоже, рассчитана на эту версию фреймворка. Может, в этом дело? У меня установлены .NET: 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1.



Редактировано 1 раз. Последний раз 04.01.2016 11:24 пользователем amironov73.

Вложения: 2016-01-04_173048.png (229.5KB)  
Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 04, January, 2016 11:47

У меня установлена .NET последней версии (Windows10 + VS Express 2015). попробую собрать утилиту своими руками.

Изучение исходного кода утилиты показало, что никакой конфигурационный файл ей не нужен (в статье написано, что НУЖЕН). Все пути к утилитам из SDK "жестко зашиты" в коде. Поэтому программа и выдает такое сообщение.



Редактировано 1 раз. Последний раз 04.01.2016 11:56 пользователем artgonch.

Re: Доступ извне к полю Ключ
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 04, January, 2016 12:24

artgonch написал(а):
-------------------------------------------------------
> Изучение исходного кода утилиты показало, что
> никакой конфигурационный файл ей не нужен (в
> статье написано, что НУЖЕН). Все пути к утилитам
> из SDK "жестко зашиты" в коде. Поэтому программа и
> выдает такое сообщение.

Как выяснилось, мы пользуемся разными утилитами. Та, что у меня – ExportDll.exe – требует правильно настроенный config. Та, что у Вас – DllExporter.exe – пытается найти ildasm.exe самостоятельно, не используя config.

Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 04, January, 2016 12:49

А пришлите свою, пожалуйста.

amironov73 написал(а):
-------------------------------------------------------
> artgonch написал(а):
> --------------------------------------------------
> -----
> > Изучение исходного кода утилиты показало, что
> > никакой конфигурационный файл ей не нужен (в
> > статье написано, что НУЖЕН). Все пути к
> утилитам
> > из SDK "жестко зашиты" в коде. Поэтому программа
> и
> > выдает такое сообщение.
>
> Как выяснилось, мы пользуемся разными утилитами.
> Та, что у меня – ExportDll.exe – требует правильно
> настроенный config. Та, что у Вас –
> DllExporter.exe – пытается найти ildasm.exe
> самостоятельно, не используя config.

Re: Доступ извне к полю Ключ
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 04, January, 2016 13:14

artgonch написал(а):
-------------------------------------------------------
> А пришлите свою, пожалуйста.

Я пользуюсь утилитой из этой статьи.

Прикрепляю архив к сообщению. Обратите внимание, в архиве EXE-файл называется ExportDll.exe.delext. Надо удалить лишнее расширение delext.

Вложения: ExportDll.zip (19.4KB)  
Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 04, January, 2016 14:58

Спасибо.

Я сейчас пытаюсь запустить ее из-под отладчика, но программа бросает исключение при попытке запуска ildasm.exe, хотя я путь указал правильно. А в исключении получаю сообщение: не удается найти указанный файл.

amironov73 написал(а):
-------------------------------------------------------
> artgonch написал(а):
> --------------------------------------------------
> -----
> > А пришлите свою, пожалуйста.
>
> Я пользуюсь утилитой из этой статьи.
>
> Прикрепляю архив к сообщению. Обратите внимание, в
> архиве EXE-файл называется ExportDll.exe.delext.
> Надо удалить лишнее расширение delext.

Re: Доступ извне к полю Ключ
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 04, January, 2016 15:55

artgonch написал(а):
-------------------------------------------------------
> Я сейчас пытаюсь запустить ее из-под отладчика,
> но программа бросает исключение при попытке
> запуска ildasm.exe, хотя я путь указал правильно.
> А в исключении получаю сообщение: не удается найти
> указанный файл.

Это очень странно. Не знаю, что и думать. Только что специально загрузил машину с Windows 10, попробовал – ExportDll.exe отработала нормально с config'ом и от .NET 4.5 и от .NET 2.0 (который я показывал в одном из предыдущих сообщений) — функции успешно экспортировались, их прекрасно видно из depends.exe, да и GenPFT64.exe замечательно их находит и вызывает.

Характеристики машины: Windows 10 x64 Корпоративная RUS (пиратская, активированная), UAC отключен, установлена VS 2015 Community Edition, установлен .NET 2.0, 3.0, 3.5, 4.0, 4.5, 4.6. Запуск производился из-под локального администратора.

Сам по себе ildasm.exe запустить из Проводника удаётся? Может, не хватает прав или отсутствует/повреждена какая-нибудь DLL?

Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 04, January, 2016 16:06

Я уже совсем устал... Могу я попросить Вас обработать вот эту DLL-ку? Заранее спасибо.

Вложения: MBACopierRunner.dll (5KB)  
Re: Доступ извне к полю Ключ
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 04, January, 2016 17:40

artgonch написал(а):
-------------------------------------------------------
> Я уже совсем устал... Могу я попросить Вас
> обработать вот эту DLL-ку? Заранее спасибо.

А она не обрабатывается. smiling smiley
Точнее, успешно обрабатывается, однако, функции не экспортируются, потому что ExportDll не находит атрибута ExportDllAttribute.

Прилагаю в качестве примера «как делать, чтобы работало» свой проект ipdf, в котором экспортируются три функции: Sum, CreationDate и CountPages. Проект успешно собирается в Visual Studio 2015 Community Edition на Windows 10.

Чтобы убедиться, что функции успешно экспортированы, можно положить ipdf.dll и ExportDllAttribute.dll рядом с GenPft64.exe и попробовать формат следующего вида:
&uf('+8ipdf,CreationDate,C:\IRBIS64\Irbismsg.txt')
где вместо C:\IRBIS64\Irbismsg.txt подойдёт любой существующий файл с правами на чтение. Должно получиться следующее:
http://irbis.gpntb.ru/file.php?24,file=13523



Редактировано 1 раз. Последний раз 04.01.2016 17:41 пользователем amironov73.

Вложения: 2016-01-04_234019.png (21.9KB)   ipdf.rar (1.79MB)  
Re: Доступ извне к полю Ключ
Пользователь: artgonch (IP-адрес скрыт)
Дата: 05, January, 2016 05:28

Спасибо! Все получилось.



Редактировано 1 раз. Последний раз 05.01.2016 07:03 пользователем artgonch.



Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.