IManExt ImportCmd 麻烦

发布于 2024-08-15 00:42:40 字数 4410 浏览 8 评论 0原文

我一直在使用 C# 编写一个小型应用程序,将文档复制到 DMS 服务器上的个人“我的文档”文件夹中。

我已经根据“WorkSite SDK 8:利用 IMANEXT2Lib.IManRefileCmd 归档新文档文件夹”博客中提供的列表编写了代码。

在 WinForm 应用程序中使用此代码,将文件从源文件夹复制到用户 DMS“我的文档”文件夹中时没有任何问题。

但是,如果我在复制过程中在命令行应用程序/.dll 或任何其他类型的应用程序(WinForm 除外)中使用代码,我会收到错误消息;

1.

尝试记录事件时发生错误!

IManExt:尝试记录事件时发生错误!

访问被拒绝。

2.

文档已导入数据库,但无法添加到 文件夹。

IManExt:文档已导入数据库,但无法导入 添加到文件夹。

IManExt.LogRuleEventsCmd.1:尝试记录事件时发生错误!

IManExt.LogRuleEventsCmd.1:访问被拒绝。

尝试记录事件时发生错误!

-%-

有谁知道为什么我在使用非 WinForms 应用程序复制文档时会收到“访问被拒绝”错误消息? 我需要做什么才能解决这个问题?

任何帮助都会很棒!

到位代码: <代码> <代码>

    public void moveToDMS(String servName, String dBName, String foldName)
    {
        const string SERVERNAME = servName; //Server name
        const string DATABASENAME = dBName; //Database name
        const string FOLDERNAME = foldName; //Matter alias of workspace

        IManDMS dms = new ManDMSClass();
        IManSession sess = dms.Sessions.Add(SERVERNAME);
        sess.TrustedLogin();

        //Get destination database.
        IManDatabase db = sess.Databases.ItemByName(DATABASENAME);

        //Get destination folder by folder and owner name.
        IManFolderSearchParameters fparms = dms.CreateFolderSearchParameters();
        fparms.Add(imFolderAttributeID.imFolderOwner, sess.UserID);
        fparms.Add(imFolderAttributeID.imFolderName, FOLDERNAME);           

        //Build a database list in which to search.
        ManStrings dblist = new ManStringsClass();
        dblist.Add(db.Name);

        IManFolders results = sess.WorkArea.SearchFolders(dblist, fparms);

        if (results.Empty == true)
        {
            //No results returned based on the search criteria.
            Console.WriteLine("NO RESULTS FOUND!");
        }

        IManDocumentFolder fldr = null;

        if (results.Empty == false)
        {
            //Assuming there is only one workspace returned from the results.
            fldr = (IManDocumentFolder)results.ItemByIndex(1);
        }

        if (fldr != null)
        {
            // Import file path
            string docPath = @"C:\Temp\";
            string docName = "MyWord.doc";

            // Create an instance of the ContextItems Collection Object.
            ContextItems context = new ContextItemsClass();

            // Invoke ImportCmd to import a new document to WorkSite database.
            ImportCmd impCmd = new ImportCmdClass();

            // The WorkSite object you pass in can be a database, session, or folder.
            // Depends on in where you want the imported doc to be stored.
            context.Add("IManDestinationObject", fldr); //The destination folder.

            // Filename set here is used for easy example, a string variable is normally used here
            context.Add("IManExt.Import.FileName", docPath + docName);

            // Document Author
            context.Add("IManExt.Import.DocAuthor", sess.UserID); //Example of a application type.

            // Document Class
            context.Add("IManExt.Import.DocClass", "BLANK"); //Example of a document class.
            //context.Add("IManExt.Import.DocClass", "DOC"); //Example of a document class.

            // Document Description (optional)
            context.Add("IManExt.Import.DocDescription", docName); //Using file path as example of a description.

            // Skip UI
            context.Add("IManExt.NewProfile.ProfileNoUI", true);

            impCmd.Initialize(context);
            impCmd.Update();

            if (impCmd.Status == (int)CommandStatus.nrActiveCommand)
            {
                impCmd.Execute();

                bool brefresh = (bool)context.Item("IManExt.Refresh");
                if (brefresh == true)
                {
                    //Succeeded in importing a document to WorkSite
                    IManDocument doc = (IManDocument)context.Item("ImportedDocument");

                    //Succeeded in filing the new folder under the folder.
                    Console.WriteLine("New document number, " + doc.Number + ", is successfully filed to " + fldr.Name + " folder.");
                }

            }


        }

    }

>

I have been writing a small application using C# to copy a document into an individuals 'My Documents' folder on our DMS server.

I've beased the code around the listing provided in the 'WorkSite SDK 8: Utilize the IMANEXT2Lib.IManRefileCmd to File New Document Folders' blog.

Using this code in a WinForm application I have no problems copying the file from the source folder into the users DMS 'My Documents' folder.

However if I use the code in a command line application/.dll or any other type of application (other than WinForm) during the copy process I receive the error messages;

1.

Error occurred when try to log the event!

IManExt: Error occurred when try to log the event!

Access is denied.

2.

The document was imported to the database, but could not be added to
the folder.

IManExt: The document was imported to the database, but could not be
added to the folder.

IManExt.LogRuleEventsCmd.1: Error occurred when try to log the event!

IManExt.LogRuleEventsCmd.1: Access is denied.

Error occurred when try to log the event!

-%-

Does anyone know why I'd receiving the 'Access Denied' error messages when using a non-WinForms application to copy documents?
What would I need to do to get around this issue?

Any help would be amazing!

Code in place:

    public void moveToDMS(String servName, String dBName, String foldName)
    {
        const string SERVERNAME = servName; //Server name
        const string DATABASENAME = dBName; //Database name
        const string FOLDERNAME = foldName; //Matter alias of workspace

        IManDMS dms = new ManDMSClass();
        IManSession sess = dms.Sessions.Add(SERVERNAME);
        sess.TrustedLogin();

        //Get destination database.
        IManDatabase db = sess.Databases.ItemByName(DATABASENAME);

        //Get destination folder by folder and owner name.
        IManFolderSearchParameters fparms = dms.CreateFolderSearchParameters();
        fparms.Add(imFolderAttributeID.imFolderOwner, sess.UserID);
        fparms.Add(imFolderAttributeID.imFolderName, FOLDERNAME);           

        //Build a database list in which to search.
        ManStrings dblist = new ManStringsClass();
        dblist.Add(db.Name);

        IManFolders results = sess.WorkArea.SearchFolders(dblist, fparms);

        if (results.Empty == true)
        {
            //No results returned based on the search criteria.
            Console.WriteLine("NO RESULTS FOUND!");
        }

        IManDocumentFolder fldr = null;

        if (results.Empty == false)
        {
            //Assuming there is only one workspace returned from the results.
            fldr = (IManDocumentFolder)results.ItemByIndex(1);
        }

        if (fldr != null)
        {
            // Import file path
            string docPath = @"C:\Temp\";
            string docName = "MyWord.doc";

            // Create an instance of the ContextItems Collection Object.
            ContextItems context = new ContextItemsClass();

            // Invoke ImportCmd to import a new document to WorkSite database.
            ImportCmd impCmd = new ImportCmdClass();

            // The WorkSite object you pass in can be a database, session, or folder.
            // Depends on in where you want the imported doc to be stored.
            context.Add("IManDestinationObject", fldr); //The destination folder.

            // Filename set here is used for easy example, a string variable is normally used here
            context.Add("IManExt.Import.FileName", docPath + docName);

            // Document Author
            context.Add("IManExt.Import.DocAuthor", sess.UserID); //Example of a application type.

            // Document Class
            context.Add("IManExt.Import.DocClass", "BLANK"); //Example of a document class.
            //context.Add("IManExt.Import.DocClass", "DOC"); //Example of a document class.

            // Document Description (optional)
            context.Add("IManExt.Import.DocDescription", docName); //Using file path as example of a description.

            // Skip UI
            context.Add("IManExt.NewProfile.ProfileNoUI", true);

            impCmd.Initialize(context);
            impCmd.Update();

            if (impCmd.Status == (int)CommandStatus.nrActiveCommand)
            {
                impCmd.Execute();

                bool brefresh = (bool)context.Item("IManExt.Refresh");
                if (brefresh == true)
                {
                    //Succeeded in importing a document to WorkSite
                    IManDocument doc = (IManDocument)context.Item("ImportedDocument");

                    //Succeeded in filing the new folder under the folder.
                    Console.WriteLine("New document number, " + doc.Number + ", is successfully filed to " + fldr.Name + " folder.");
                }

            }


        }

    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤星 2024-08-22 00:42:40

以防万一这对其他人有帮助。

我的问题似乎是线程问题的结果。

我注意到我创建的 C# winform 应用程序被自动设置为在单个“ApartmentState”线程 ([STAThread]) 上运行。

而控制台应用程序和类库线程状态和管理尚未在项目中定义,并使用默认的 .NET 配置进行处理。

要使其正常工作:在控制台应用程序中,我刚刚在 Main 方法调用上方的行中添加了 [STAThread] 标记。

在类库中,我为引用 IMANxxx.dll 的函数定义了一个线程,并设置了 ApartmentState,例如

Thread t = new Thread(new ThreadStart(PerformSearchAndMove));
t.SetApartmentState(ApartmentState.STA);
t.Start();

在这两种情况下,确保实现单个“ApartmentState”线程,设置将解决问题。

Just in case this helps someone else.

It seems my issue was the result of a threading issue.

I noticed the C# winform apps I had created were automatically set to run on a single 'ApartmentState' thread ([STAThread]).

Whereas the console applications & class library thread state and management hadn't been defined within the project and was being handled with the default .NET config.

To get this to work: In the console application, I just added the [STAThread] tag on the line above my Main method call.

In the class library, I defined a thread for the function referencing the IMANxxx.dll and set ApartmentState e.g.

Thread t = new Thread(new ThreadStart(PerformSearchAndMove));
t.SetApartmentState(ApartmentState.STA);
t.Start();

In both cases ensuring single 'ApartmentState' thread was implemented set would resolve the issue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文