Возможна ли параллельная работа с Компасом ?

Автор Doom, 28.01.23, 16:04:30

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Doom


p3452

31.01.23, 14:29:20 #41 Последнее редактирование: 31.01.23, 15:16:50 от p3452
"Не, ну нормально, а..."?

- Начали с вопроса по разбору "дерева модели" и претензий на многопоточность, а закончили неумением подключить "Step1"!
Две страницы исписали и ради чего?

Doom

31.01.23, 18:31:20 #42 Последнее редактирование: 31.01.23, 19:13:43 от Doom
Все равно не хочет библиотека работать  :bebebe:

если отключить автозапуск - то все работает.

При автозапуске выполняется только функция GetLibraryName
подставив строку MessageBox.Show("Hello"); - сразу водит окошко

а если подставить строку MessageBox.Show("Hello"); в метод ExternalRunCommand - тишина.

долго не думая добавил аргумент объекта Компас в функцию GetLibraryName что бы выполнить kompas.ksMessage("Привет!");
- Компас при запуске аварийно завершается но при этом не выдав ошибку.

мне кажется что библиотека пытается получить доступ к объекту Компаса который еще не успел инициализироваться - если в метод ExternalRunCommand добавить ожидание - то он уйдет в бесконечный цикл.
а сделать метод асинхронным нельзя

Мне важно поймать момент когда главное окно Компаса будет инициализировано, а библиотека пытается отработать когда главного окна нет - только заставка которая возможно имеет другой хендл.

При автозапуске библиотека слишком рано пытается начать работу.

Doom

31.01.23, 19:31:19 #43 Последнее редактирование: 31.01.23, 19:46:08 от Doom
Цитата: Doom от 31.01.23, 18:31:20а сделать метод асинхронным нельзя

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

Doom

попробовал так - все отлично но не могу зарегистрировать объект

private Kompas6API5.Application iKompasObject; // Интерфейс KompasObject

[DllImport("ole32.dll")]
public extern static int CreateItemMoniker([MarshalAs(UnmanagedType.LPWStr)] string lpszDelim, [MarshalAs(UnmanagedType.LPWStr)] string lpszItem, ref System.Runtime.InteropServices.ComTypes.IMoniker ppmk);


// Имя библиотеки
[return: MarshalAs(UnmanagedType.BStr)] public string GetLibraryName()
{
    Thread trd = new Thread(GetHandle);
    trd.IsBackground = true;
    trd.Start();

    return "Step1 - Самая простая библиотека на C#";
}


// Головная функция библиотеки
public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_)
{
    // это не работает при автозапуске
    //KompasObject kompas = (KompasObject) kompas_;
    //kompas.ksMessage("Привет!");
}


public object GetHandle()
{
IntPtr handle = IntPtr.Zero;

while (handle == IntPtr.Zero)
{

System.Threading.Thread.Sleep(1000);
handle = Process.GetCurrentProcess().MainWindowHandle;
}

//MsgBox(handle.ToString) - тут все верно
IMoniker pMoniker = null;
CreateItemMoniker(null, handle.ToString(), pMoniker);
IRunningObjectTable RunningObjectTable = null;
RunningObjectTable.Register(1, iKompasObject, pMoniker); // - тут какая то ошибка

return true;
}


Doom

p3452 а куда Вы пропали? вон оно как оказалось? Это Вам не это !

Doom

[DllImport("ole32.dll")]
private extern static int GetRunningObjectTable(uint reserved, ref System.Runtime.InteropServices.ComTypes.IRunningObjectTable pprot);


[DllImport("ole32.dll")]
private extern static int CreateItemMoniker([MarshalAs(UnmanagedType.LPWStr)] string lpszDelim, [MarshalAs(UnmanagedType.LPWStr)] string lpszItem, ref System.Runtime.InteropServices.ComTypes.IMoniker ppmk);


private const int ROTFLAGS_REGISTRATIONKEEPSALIVE = 1;
private string thisObjectName = "ROT.ROTObjectKompas";

private int hresult;
private System.Runtime.InteropServices.ComTypes.IRunningObjectTable rot = null;
private System.Runtime.InteropServices.ComTypes.IMoniker moniker = null;

hresult = GetRunningObjectTable(0, ref rot);
hresult = CreateItemMoniker("!", thisObjectName, ref moniker);

Kompas6API5.Application iKompasObject = (Kompas6API5.Application)Microsoft.VisualBasic.Interaction.GetObject(, "KOMPAS.Application.5"); // Интерфейс KompasObject
int register = rot.Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, iKompasObject, moniker);

Снимок13.JPG