08.06.2006 12:38:38
Microsoft Visio
An exception occurred.
at Microsoft.Office.Interop.Visio.CellClass.set_Formula(String lpbstrRet)
at TcRVisioAddin.TcRDiagram.addActionToPageSheet(Page visioPage)
at TcRVisioAddin.TcRDiagram.generateShapes(TcRVisioObject diagram_obj, Hashtable referenced_objs)
at TcRVisioAddin.TcRDiagram.createDiagram(TcRVisioXMLParser parser_obj)
Visio и .NET
Имеется приложение написанное на Java, у него имеется интерфейс с MS Visio. Работает через .NET, как я понял так как для корректной работы этого интерфейса требуется установленный .NET. Принцип работы примерно такой: в приложении имеются объекты и связи между этими объектами. У объектов имеются свойства четырех типов (Choice, Date, Numeric, Text). Выбрав один или несколько объектов в меню выбираем пункт "Создать диаграмму". Открывается Visio в который загружается нужный stencil и создается диаграмма из этих объектов. Проблема: диаграмма не создается, visio пишет сообщение об ошибке, смотрите лог. Лог вот такой
Код:
в чем может быть проблема? У меня смутное подозрение что это из-за чего-то типа разные разделители целой и дробной части в проге и в Visio и т.п.
Начнём с того, что приложение написано не на Java, а на J# (интерпретацией Java от мелкомягких для .NET). Судя по трассировке стэка, приведённого тобой, ошибка вылетает на Microsoft.Office.Interop.Visio.CellClass.set_Formula, а потом летит всё остальное. Не мог бы ты привести кусок кода, в котором ошибка вылетает?
Из лога приведенного выше видно что ошибка возникает не в интерфесном аддоне (TcrVisioAddin), а уже в самом Visio.
Из лога приведенного выше видно что ошибка возникает не в интерфесном аддоне (TcrVisioAddin), а уже в самом Visio.[/quote]
Не может быть! Java приложения не могут использовать .NET компоненты, как и обратно тоже - у них разные производители, среды выполнения (Java - JVM, .NET - CLR). Даже если засунуть исходник от Java в J#, то в 90% вероятности он не скомпиллируется.
http://servername:8000/tcr - запускается стартовая страница со ссылками. Щекаем Lanch Application, запускается jsp страница из которой запускается апплет который запускает jar файл - основное окно программы. Пы ссылке Install Office-live Interface only запускается jsp страница установки интерфейса. Вот отрывок из jsp файла
[HTML]<!-- classid 8AD9C840-044E-11D1-B3E9-00805F499D93 provides dynamic version support, don't change -->
<OBJECT id="setup_applet"
classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="./installs/j2re-1_4_2-windows-i586.exe#Version=1,4,2,0"
width="<%= width %>" height="<%= height %>" align="baseline">
<PARAM name="code" value="com.edsplm.tc.req.client.install.InterfaceSetupApplet.class">
<PARAM name="codebase" value="./">
<PARAM name="archive" value="tcrInstall.jar,jsse.jar,jnet.jar,jcert.jar,registry.jar">
<PARAM name="type" value="application/x-java-applet;version=1.4">
<!-- Start TcR Parameters -->
<PARAM name="current_version" value="<%=version%>">
<PARAM name="download_file_url" value="<%=hostAddress%>/tcr/controller/tcr_download_file">
<PARAM name="app_installer_path" value="/ugs/tc/req/installs/addins/">
<PARAM name="app_file_list" value="TcROfficeInterfaceSetupwin32.exe">
<!-- Entry point i.e. name of Executable -->
<PARAM name="executable_file_name" value="TcROfficeInterfaceSetupwin32.exe">
<PARAM name="uninst_executable_file_name" value="TcROfficeInterfaceUninstaller.exe">
<!-- Registry Path for Tcr office Interface entries-->
<PARAM name="reg_key_base" value="HKEY_LOCAL_MACHINE\Software\UGSPLM\TeamCenter\TcR Office Interface">
<PARAM name="client_reg_key_base" value="HKEY_LOCAL_MACHINE\SOFTWARE\UGSPLM\Teamcenter\Requirements\<%=serverName%>">
<PARAM name="dot_net_installer_path" value="/ugs/tc/req/installs/dotnetfx.exe">
<PARAM name="locale_list" value="English,Chinese,French,German,Italian,Japanese,Korean,Portuguese,Spanish">
<PARAM name="user_agent" value="<%= request.getHeader("User-Agent") %>">
<PARAM name="dot_net_ver" value="CLR 1.0,CLR 1.1"> <!-- Comma delimited list of required .NET version(s) for ExcelLive; applet will search for version(s) in user_agent param -->
<PARAM name="language" value="<%=request.getParameter("language")%>">
<!-- End TcR Parameters -->
<PARAM name="scriptable" value="true">
<p>This applet requires Java Plug-in 1.4.2 or greater</p>
</OBJECT>
[/HTML]
если это поможет
Вот список файлов после установки интерфейса:
_jvm - folder
TcROfficeInterfaceUninstall - folder
Extensibility.dll
Interop.MSForms.dll
msvcr71.dll
stdole.dll
TcR.dll
TcROffice2K3Addin.dll
TcRUtil.dll
TcRVisioAddin.dll
gacutil.exe
RegAsm.exe
req.ico
TcR.tlb
TcROffice2K3Addin.tlb
TcRVisioAddin.tlb
Ну как же. Все приложение работает из под Tamcat. В браузере пишем
[HTML]<!-- classid 8AD9C840-044E-11D1-B3E9-00805F499D93 provides dynamic version support, don't change -->
<OBJECT id="setup_applet"
classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="./installs/j2re-1_4_2-windows-i586.exe#Version=1,4,2,0"
width="<%= width %>" height="<%= height %>" align="baseline">
<PARAM name="code" value="com.edsplm.tc.req.client.install.InterfaceSetupApplet.class">
<PARAM name="codebase" value="./">
<PARAM name="archive" value="tcrInstall.jar,jsse.jar,jnet.jar,jcert.jar,registry.jar">
<PARAM name="type" value="application/x-java-applet;version=1.4">
<!-- Start TcR Parameters -->
<PARAM name="current_version" value="<%=version%>">
<PARAM name="download_file_url" value="<%=hostAddress%>/tcr/controller/tcr_download_file">
<PARAM name="app_installer_path" value="/ugs/tc/req/installs/addins/">
<PARAM name="app_file_list" value="TcROfficeInterfaceSetupwin32.exe">
<!-- Entry point i.e. name of Executable -->
<PARAM name="executable_file_name" value="TcROfficeInterfaceSetupwin32.exe">
<PARAM name="uninst_executable_file_name" value="TcROfficeInterfaceUninstaller.exe">
<!-- Registry Path for Tcr office Interface entries-->
<PARAM name="reg_key_base" value="HKEY_LOCAL_MACHINE\Software\UGSPLM\TeamCenter\TcR Office Interface">
<PARAM name="client_reg_key_base" value="HKEY_LOCAL_MACHINE\SOFTWARE\UGSPLM\Teamcenter\Requirements\<%=serverName%>">
<PARAM name="dot_net_installer_path" value="/ugs/tc/req/installs/dotnetfx.exe">
<PARAM name="locale_list" value="English,Chinese,French,German,Italian,Japanese,Korean,Portuguese,Spanish">
<PARAM name="user_agent" value="<%= request.getHeader("User-Agent") %>">
<PARAM name="dot_net_ver" value="CLR 1.0,CLR 1.1"> <!-- Comma delimited list of required .NET version(s) for ExcelLive; applet will search for version(s) in user_agent param -->
<PARAM name="language" value="<%=request.getParameter("language")%>">
<!-- End TcR Parameters -->
<PARAM name="scriptable" value="true">
<p>This applet requires Java Plug-in 1.4.2 or greater</p>
</OBJECT>
[/HTML]
если это поможет
Вот список файлов после установки интерфейса:
Цитата:
_jvm - folder
TcROfficeInterfaceUninstall - folder
Extensibility.dll
Interop.MSForms.dll
msvcr71.dll
stdole.dll
TcR.dll
TcROffice2K3Addin.dll
TcRUtil.dll
TcRVisioAddin.dll
gacutil.exe
RegAsm.exe
req.ico
TcR.tlb
TcROffice2K3Addin.tlb
TcRVisioAddin.tlb
в папке _jvm собсвенно JVM и находится
Код:
[COLOR=#000080]classid=[/COLOR][COLOR=#0000ff]"clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"[/COLOR]
Поэтому вся эта жуть выражается такой схемой:
.NET TcR Office Library--->COM registration--->ActiveX Components--->Java Applet
Даже если дело не в Visio поменять компоненты библиотеки TcR не сможешь (исходных кодов нет), а у Java-апплета вообще хата с краю.
[QUOTE=RcT] А нельзя ли в .NET посмотреть как-нибудь более полный лог о том что там происходит и где возникает ошибка.
[/QUOTE]
Самый простой способ это написать мааааленькую программку на C#, которая что-нибудь делала с TcR компонентами, а блоке catch написать
Код:
[SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff]catch[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]Exception[/COLOR][/SIZE][SIZE=2] e)
{
[/SIZE][SIZE=2][COLOR=#008080]Console[/COLOR][/SIZE][SIZE=2].WriteLine(e.Message);
[/SIZE][SIZE=2][COLOR=#008080]Console[/COLOR][/SIZE][SIZE=2].WriteLine(e.Source);
[/SIZE][SIZE=2][COLOR=#008080]Console[/COLOR][/SIZE][SIZE=2].WriteLine(e.StackTrace);
[/SIZE][SIZE=2][COLOR=#008080]Console[/COLOR][/SIZE][SIZE=2].WriteLine(e.TargetSite);
}
[/SIZE]
{
[/SIZE][SIZE=2][COLOR=#008080]Console[/COLOR][/SIZE][SIZE=2].WriteLine(e.Message);
[/SIZE][SIZE=2][COLOR=#008080]Console[/COLOR][/SIZE][SIZE=2].WriteLine(e.Source);
[/SIZE][SIZE=2][COLOR=#008080]Console[/COLOR][/SIZE][SIZE=2].WriteLine(e.StackTrace);
[/SIZE][SIZE=2][COLOR=#008080]Console[/COLOR][/SIZE][SIZE=2].WriteLine(e.TargetSite);
}
[/SIZE]
Хотя когда выскакивает сообщение об ошибке, Windows предлагать запустить отладчик. Если исключение в .NET приложении обычно запускается .NET CLR Debugger и он даёт достаточно исчерпывающую информацию об ошибке.
Скриншот: [ATTACH]816[/ATTACH] А как узнать, запускается ли .NET CLR Debugger
В данном случае никак, так как компонент TcR использует блок catch для перехвата исключения сам и в этом блоке описывает код для вывода сообщения и сброса лога.