Сочетание COM ATL + WPF + AutoLISP (из AutoCAD) вызывает ошибку (можно ли в лиспе прочитать его детали, и может кто с подобным встречался?)
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Сочетание COM ATL + WPF + AutoLISP (из AutoCAD) вызывает ошибку (можно ли в лиспе прочитать его детали, и может кто с подобным встречался?)

Сочетание COM ATL + WPF + AutoLISP (из AutoCAD) вызывает ошибку (можно ли в лиспе прочитать его детали, и может кто с подобным встречался?)

Ответ
Поиск в этой теме
Непрочитано 05.08.2009, 11:20 #1
Сочетание COM ATL + WPF + AutoLISP (из AutoCAD) вызывает ошибку (можно ли в лиспе прочитать его детали, и может кто с подобным встречался?)
lexluther
 
Регистрация: 19.03.2009
Сообщений: 51

Всем привет, помогите пожалуйста советом в чем может быть проблема.

В общих словах у меня есть скрипт на АвтоЛИСП который вызывает методы ATL COM объекта написанного на С++ и который поддерживает CLR. В виду того что он поддерживает CLR то из метода который дергает АвтоЛИСП соответственно вызывается метод из другой .NET зборки написанной уже на си шарп.

Если все использовать из VB из отдельной программы то все работает нормально. Но если использовать АвтоЛИСП из Автокада то лисп выдает следующую ошибку:

; error: Unknown exception occurred
; warning: unwind skipped on unknown exception

Как я посмотрел то по сути исключение возникает тогда когда используется класс целиком написанный на .NET. Он его просто отказывается выполнять. Почему.

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

Последний раз редактировалось lexluther, 05.08.2009 в 11:45.
Просмотров: 2871
 
Непрочитано 05.08.2009, 11:39
#2
freese

ingénieur
 
Регистрация: 21.07.2008
Сообщений: 767


offtop: анекдот: пациент на приеме у врача:
- Доктор когда я трясу руками над головой, у меня за ухом стреляет
- А зачем вы тресете руками над головой?


Знатокам будет легче если представите пример этого скрипта))

Если из VB нет проблем (кад его прекрасно поддерживает)... почемубы его неиспользовать
freese вне форума  
 
Автор темы   Непрочитано 05.08.2009, 11:49
#3
lexluther


 
Регистрация: 19.03.2009
Сообщений: 51


Код:
[Выделить все]
(defun export-text-to-label-mark()
  (vl-load-com)  
  (if (setq lm-object (vlax-get-or-create-object "ACADLMConnector.ACADLMConnectorKern"))
    (progn      
      (vlax-invoke-method lm-object "LMClear")
      (setq text-entity (entnext))
      (while text-entity
    (setq text-element (entget text-entity)
          text-type (cdr (assoc 0 text-element))
          )
    (if (or (= text-type "TEXT") (= text-type "MTEXT"))
      (progn
        (setq text (cdr (assoc 1 text-element)))
        (vlax-invoke-method lm-object "LMAddToLM" text)
        )
      )
    (setq text-entity (entnext text-entity))
    )
      (vlax-invoke-method lm-object "LMExportToLM")
      (vlax-release-object lm-object)
      (setq lm-object nil)
      )
    (alert "ACADLMConnector.ACADLMConnectorKern not found. You need to reinstall LabelMark and LabelMark AutoCAD Add-ins.")
    )
  (alert "All done")
  )
IDL файл если нужно тоже вот:

Код:
[Выделить все]
// ACADLMConnector.idl : IDL source for ACADLMConnector
//

// This file will be processed by the MIDL tool to
// produce the type library (ACADLMConnector.tlb) and marshalling code.

import "oaidl.idl";
import "ocidl.idl";

[
    object,
    uuid(EC350C2C-C789-40E1-BAFF-2828A021AA50),
    dual,
    nonextensible,
    helpstring("IACADLMConnectorKern Interface"),
    pointer_default(unique)
]
interface IACADLMConnectorKern : IDispatch{
    [id(1), helpstring("THIS METHOD ONLY TAKES A PHRASE TO CHECK IF OUTSIDE-TO-COM TRANSACTION GOES FINE, FOR TEST ONLY")] HRESULT IceLaFox([in] BSTR TestMe);
    [id(2), helpstring("YOU NEED TO PASS TEXT STRINGS USING THIS METHOD TO FILL INTERNAL LIST OF TEXT STRINGS")] HRESULT LMAddToLM([in] BSTR text);
    [id(3), helpstring("METHOD USED TO CLEAR INTERNAL LIST OF TEXT STRINGS CREATED BY LMAddToLM")] HRESULT LMClear(void);
    [id(4), helpstring("METHOD THAT PASSES INTERNAL TEXT LIST TO THE LABEL MARK AND CLEARS INTERNAL LIST")] HRESULT LMExportToLM(void);
};
[
    uuid(E3938134-8955-4962-A670-58DBBD96ED9A),
    version(1.0),
    helpstring("ACADLMConnector 1.0 Type Library")
]
library ACADLMConnectorLib
{
    importlib("stdole2.tlb");
    [
        uuid(679EBAEC-97F4-45AB-A274-355A2A6F14C3),
        helpstring("_IACADLMConnectorKernEvents Interface")
    ]
    dispinterface _IACADLMConnectorKernEvents
    {
        properties:
        methods:
    };
    [
        uuid(1559F73D-F1E9-4140-A424-85E794A76CDC),
        helpstring("ACADLMConnectorKern Class")
    ]
    coclass ACADLMConnectorKern
    {
        [default] interface IACADLMConnectorKern;
        [default, source] dispinterface _IACADLMConnectorKernEvents;
    };
};
С++ код (отрывок) ниже:

Код:
[Выделить все]
//YOU NEED TO PASS TEXT STRINGS USING THIS METHOD TO FILL INTERNAL LIST OF TEXT STRINGS
STDMETHODIMP CACADLMConnectorKern::LMAddToLM(BSTR text)
{
    CComBSTR inputarg(text);

    System::String ^systemstring = gcnew System::String(inputarg);

    NETRoutines::NETAutoCAD::NETAddToLM(systemstring);

    delete systemstring;

    return S_OK;
}

//METHOD USED TO CLEAR INTERNAL LIST OF TEXT STRINGS CREATED BY LMAddToLM
STDMETHODIMP CACADLMConnectorKern::LMClear(void)
{
    NETRoutines::NETAutoCAD::NETClear();

    return S_OK;
}

//METHOD THAT PASSES INTERNAL TEXT LIST TO THE LABEL MARK AND CLEARS INTERNAL LIST
STDMETHODIMP CACADLMConnectorKern::LMExportToLM(void)
{
    NETRoutines::NETAutoCAD::NETExportToLM();

    return S_OK;
}
и соответственно:

Код:
[Выделить все]
#ifndef _NETRoutines_h_467701C6_5B11_4b98_9C7F_5A2992CCDB74_
#define _NETRoutines_h_467701C6_5B11_4b98_9C7F_5A2992CCDB74_

#pragma once

#include "windows.h"
#include <iostream>
#include <vector>
#include <string>

using namespace System;
using namespace System::Collections::Generic;
using namespace Brady::LabelMark::AddIns::Common;
using namespace System::Diagnostics;

namespace NETRoutines {

    public ref class NETAutoCAD
    {
    public:
        static System::Collections::Generic::List<System::String^>^ NETStrings = gcnew System::Collections::Generic::List<System::String^>();

        static void NETAddToLM(System::String^ mstr)
        {
            NETStrings->Add(mstr);
        }

        static void NETClear()
        {
            NETStrings->Clear();
        }

        static void NETExportToLM()
        {
            System::Windows::MessageBox::Show("A",NETStrings->Count.ToString());

            Brady::LabelMark::AddIns::Common::AutoCADExportAddIn::LoadDataFromAutoCAD(NETStrings);
        }
    };
}

#endif
Потоковую модель использую "Both"

Прикол в том что даже System::Windows::MessageBox::Show не вызывается. Хотя из фрагмента кода выше вызывается без никаких проблем. А это одна и та же сборка. Компилится без единого ворнинга.

Последний раз редактировалось lexluther, 05.08.2009 в 11:55.
lexluther вне форума  
 
Непрочитано 05.08.2009, 11:53
#4
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


На какой функции вылет (попробуй в отладчике VLIDE)? Да и по одному lisp-коду сказать в чем проблема врядли удастся.
Александр Ривилис вне форума  
 
Непрочитано 05.08.2009, 11:55
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Если сборки написаны в debugmode, может, сработает установка ключа реестра
ветка: HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework
ключ: MDA
тип: DWORD
значение: 0
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.08.2009, 12:06
#6
lexluther


 
Регистрация: 19.03.2009
Сообщений: 51


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
На какой функции вылет (попробуй в отладчике VLIDE)? Да и по одному lisp-коду сказать в чем проблема врядли удастся.
Вылетает здесь
(vlax-invoke-method lm-object "LMExportToLM")

Код на IDL а также на С++/CLI я добавил к тому сообщению.

Последний раз редактировалось lexluther, 05.08.2009 в 12:29.
lexluther вне форума  
 
Непрочитано 05.08.2009, 12:45
#7
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Я так понял, что NETClear и NETAddToLM вызвались успешно. Я прав?
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 05.08.2009, 13:44
#8
lexluther


 
Регистрация: 19.03.2009
Сообщений: 51


Да, но при вызове NETAddToLM все вылетает, а Fusion Log Viewer выдает:

*** Assembly Binder Log Entry (8/5/2009 @ 12:35:42 PM) *** The operation failed. Bind result: hr = 0x80070002. The system cannot find the file specified. Assembly manager loaded from: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll Running under executable D:\AutoCAD 2009\acad.exe --- A detailed error log follows. === Pre-bind state information === LOG: User = SYNAPSE\artem.vyrtosu LOG: DisplayName = LabelMark.AddIns.Common, Version=5.0.0.2338, Culture=neutral, PublicKeyToken=d1b8b51a0c1937e0 (Fully-specified) LOG: Appbase = file:///D:/AutoCAD 2009/ LOG: Initial PrivatePath = NULL LOG: Dynamic Base = NULL LOG: Cache Base = NULL LOG: AppName = NULL Calling assembly : (Unknown). === LOG: This bind starts in default load context. LOG: Using application configuration file: D:\AutoCAD 2009\acad.exe.Config LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config. LOG: Post-policy reference: LabelMark.AddIns.Common, Version=5.0.0.2338, Culture=neutral, PublicKeyToken=d1b8b51a0c1937e0 LOG: The same bind was seen before, and was failed with hr = 0x80070002. ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002).

При этом эта сборка есть и там где ком объект, и даже в папку с автокадом ее скопировал. Это из-за вызова
Brady::LabelMark::AddIns::Common::AutoCADExportAddIn:: ...
lexluther вне форума  
 
Непрочитано 05.08.2009, 13:55
#9
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Может попробуешь эту сборку грузить программно?
Александр Ривилис вне форума  
 
Непрочитано 05.08.2009, 17:45
#10
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


lexluther, если тебе не трудно, дай скомпилированный idl. Я тоже побалуюсь немного.
Как я понял, ты собираешь тексты в Автокаде и куда-то их отправляешь с помощью "ACADLMConnector.ACADLMConnectorKern"?
Если не секрет, то куда?

А также хочется знать, когда на VB это делал, то тоже из Автокада тексты собирал? Если да, то я знаю в чем причина твоих бед и как ее преодолеть.
Supermax вне форума  
 
Автор темы   Непрочитано 06.08.2009, 08:33
#11
lexluther


 
Регистрация: 19.03.2009
Сообщений: 51


Всем спасибо за помощь!!

Оказалось что после запроса к КОМ объекту фреймворк ищет сборки не в папке где находится ком объект а в папке Автокада. А там их естественно нет. Значит надо подгружать вручную .

Но есть еще проблема. Пока что я пишу вслепую, т.е. дебагить я могу только код на лиспе а если пытаюсь дебагить нейтив код или менеджед код то почему то автокад виснет, а студия (2008) типа как бы аттачится к процессу но почемуто не реагирует на брейкпоинт. Попробовал насильно заставить аттачиться к дебагу:

Debugger debugger;

debugger.Launch();
debugger.Break();

Но та же ситуация. Он вызывает окно запроса дебаггера но опять никак не хочет на брейкпоинте останавливаться. И вообще студию игнорирует, только показывает что типа к процессу зааттачился но больше толку никакого.

Кто то научился дебаггить нейтив и менеджед код который вызывается под автокадом из удаленного ком объекта в студии?

Последний раз редактировалось lexluther, 06.08.2009 в 09:09.
lexluther вне форума  
 
Автор темы   Непрочитано 12.08.2009, 08:39
#12
lexluther


 
Регистрация: 19.03.2009
Сообщений: 51


Решил проблему написанием минипрожки на ВБ в которой делал то же что и на Лиспе, в результате отлаживаю на ВБ а в релизе уже работаю из Лиспа
lexluther вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Сочетание COM ATL + WPF + AutoLISP (из AutoCAD) вызывает ошибку (можно ли в лиспе прочитать его детали, и может кто с подобным встречался?)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42