2016-05-26 5 views
1

Я пытаюсь открыть документ Imanage в MS Word во временном тестовом приложении (для отладки), чтобы позже скопировать его в проект управления ActiveX. Ошибка, которая выскакивает является:Открытие документа из Imanage в Word 2016

Исключение брошено в 0x7618851A (msvcrt.dll) в w3wp.exe: 0xC0000005: Access> нарушение чтения расположение 0x09801000.

Если есть обработчик для этого исключения, программа может быть безопасно продолжена.

Ошибка при запуске строки cmd.Execute, и я не уверен, почему я получаю сообщение об ошибке.

using IManage; 
    using IMANEXTLib; 
    using System;   

     namespace WebApplication3 
     { 
      public partial class WebForm2 : System.Web.UI.Page 
      { 
       IManDatabase imanagedatabase; 
       IManDMS myDMS = new ManDMSClass(); 

       protected void Page_Load(object sender, EventArgs e) 
       { 
        openImanageDoc("docNumber", "versionNumber", "server", "database", ReadOnly); 
       } 
       public void imanageLogin(string server, string database) 
       { 
        try 
        { 
         IManSession session = myDMS.Sessions.Add(server); 
         IManWorkArea oWorkArea = session.WorkArea; 
         session.TrustedLogin(); 

         foreach (IManDatabase dbase in session.Databases) 
         { 
          if (dbase.Name == database) 
          { 
           imanagedatabase = dbase; 
          } 
         } 
        } 
        catch (Exception ex) 
        { 
         throw ex; 
        } 
       } 

       public void openImanageDoc(string docNo, string versionNo, string server, string database, bool isReadOnly = true) 
       { 
        IManDocument doc; 
        try 
        { 
         imanageLogin(server, database); 
         int iDocNo = int.Parse(docNo); 
         int iVersion = int.Parse(versionNo); 
         doc = imanagedatabase.GetDocument(iDocNo, iVersion); 
         openNRTDocument(ref doc, isReadOnly); 
         imanagedatabase.Session.Logout(); 
         myDMS.Close(); 
        } 
        catch (Exception Ex) 
        { 
         imanagedatabase.Session.Logout(); 
         throw Ex; 
        } 
        finally 
        { 
         imanagedatabase = null; 
         myDMS = null; 

        } 
       } 


       public void openNRTDocument(ref IManDocument nrtDocument, Boolean isReadonly) 
       { 
        OpenCmd cmd = new OpenCmd(); 
        ContextItems objContextItems = new ContextItems(); 


        objContextItems.Add("NRTDMS", myDMS); 
        objContextItems.Add("SelectedNRTDocuments", new[] { (NRTDocument)nrtDocument.LatestVersion }); 
        objContextItems.Add("IManExt.OpenCmd.Integration", false); 
        objContextItems.Add("IManExt.OpenCmd.NoCmdUI", true); 

        cmd.Initialize(objContextItems); 
        cmd.Update(); 
        cmd.Execute(); 

       } 
      } 
     } 

Из-за характера ошибки, я предполагаю, что это проблема конфигурации, а не код ошибки, хотя я мог бы совершенно неправильно, как я новичок в программировании.

Я выяснил, что w3wp.exe - это рабочий процесс IIS, созданный пулом приложений, но кроме этого я понятия не имею, что представляет собой числовой код. Любая помощь или совет с большой благодарностью.

ответ

2

Ошибка возникает экземпляром OpenCmd, поскольку, скорее всего, она пытается получить доступ к таким ресурсам, как настройки локального реестра. Это невозможно сделать в веб-приложении, если вы не размещаете свой код в проприетарной технологии, такой как ActiveX (что характерно для Internet Explorer).

На самом деле, здесь не подходит OpenCmd. Эти типы команд (реализация iManage «ICommand») предназначены для использования в обычных приложениях Windows, в которых установлен клиент iManage FileSite или DeskSite. Эти команды являются частью так называемых библиотек расширения Extensibility (iManExt.dll, iManExt2.dll и т. Д.) И не должны использоваться в веб-приложениях или, по крайней мере, использоваться с осторожностью, поскольку они могут ненадлежащим образом пытаться получить доступ к реестру, поскольку вы обнаружили или, возможно, даже отображаете диалоговые окна ввода Win32.

Для веб-приложения вместо этого вы должны просто ограничиться низкоуровневой библиотекой iManage COM (IManage.dll). Это на самом деле то, что iManage сами делать со своим собственным Worksite веб-приложения

Возможно, что вы должны сделать, это заменить метод openNRTDocument с чем-то вроде этого:

// create a temporary file on your web server.. 
var filePath = Path.GetTempFileName(); 
// fetch a copy of the iManage document and save to the temporary file location 
doc.GetCopy(filePath, imGetCopyOptions.imNativeFormat); 

В веб-приложения MVC вы бы тогда просто возврат FileContentResult, что-то вроде этого:

// read entire document as a byte array 
var docContent = File.ReadAllBytes(filePath); 
// delete temporary copy of file 
File.Delete(filePath); 
// return byte stream to web client 
return File(stream, MediaTypeNames.Application.Octet, fileName); 

В Web Forms приложение, которое вы могли бы сделать что-то вроде этого:

// set content disposition as appropriate - here example is for Word DOCX files 
Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 
// write file to HTTP content output stream 
Response.WriteFile(filePath); 
Response.End(); 
+0

Спасибо, я не знал, что эти функции не будут работать в веб-приложении. Единственная причина, по которой я был в веб-приложении, - проверить. Я намерен использовать его как элемент управления ActiveX. Я скопировал код обратно в мой проект управления ActiveX, и он больше не был ошибкой. –

Смежные вопросы