我对许多使用QuickBooks SDK执行各种功能的程序进行技术支持和开发。最近,我注意到用户执行以下操作时:

先决条件:
-QuickBooks在桌面上未打开,并且当前未运行。
-我的桌面程序未在QuickBooks集成应用程序列表中设置为自动登录。

1)打开我的程序之一。

2)执行一个操作,以启动与QuickBooks的连接和 session 。

3)QuickBooks界面返回错误,提示您必须打开QuickBooks并登录到公司文件中才能执行此操作。

4)我的程序关闭 session 和连接,然后向用户显示一些对话框,向他们提供故障排除提示。

结果:

即使 session 和连接都已关闭,QuickBooks本身也继续以QBW32.exe在后台后缀中运行。

如果用户然后尝试打开QuickBooks桌面程序,他们会收到一条错误消息,告诉他们QuickBooks已经在运行。然后,他们必须在Windows中打开任务管理器并关闭正在运行的QBW32.exe,然后才能成功打开QuickBooks。

我使用下面编写的非常基本的C#程序重现了这一点。

在测试应用中,我正在使用以下步骤/场景:

先决条件:1)未将测试应用程序设置为自动登录QuickBooks。设置为仅在用户打开QuickBooks桌面程序并且他们具有打开的公司文件时登录。

2)在进行以下测试之前,请确保未打开QuickBooks。

脚步:

1)打开测试C#应用程序

2)按下显示“打开连接”的按钮。应该通过QBXML互操作使用QuickBooks的界面打开连接。

3)按下显示“开始 session ”的按钮。 session 应从QuickBooks开始。

4)假设已满足上述测试先决条件,您应该收到QuickBooks返回的错误消息,告知您该应用程序未设置为自动登录,并且您需要先打开QuickBooks,然后才能尝试 session 。

5)QBW32.exe现在应该在后台运行。

6)按下表示结束 session 的按钮。这应该使用QuickBooks界面结束 session 。无论如何, session 应该已经通过步骤3的按钮中的try-catch结束了。

7)按下“关闭连接”按钮。这将关闭与QuickBooks的所有连接。

8)即使 session 和连接都已结束并关闭,QBW32.exe仍在后台运行。

9)使用退出按钮关闭测试应用程序。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using Interop.QBXMLRP2;

namespace Open_Connection
{

    public partial class Form1 : Form
    {

        bool sessionBegun = false;
        bool connectionOpen = false;
        RequestProcessor2 rp = null;
        string ticket;


        public Form1()
        {
            InitializeComponent();
        }

        private void End_Click(object sender, EventArgs e)
        {
            Environment.Exit(0);
        }

        private void OpenConn_Click(object sender, EventArgs e)
        {
            try
            {  //Start a new connection with QuickBooks
                rp = new RequestProcessor2();
                rp.OpenConnection2("", "Open Connection", QBXMLRPConnectionType.localQBD);
                connectionOpen = true;
            }

            catch (Exception connectionException)
                { //If the connection fails, close the connection to avoid the program from getting stuck in an interop error loop.
                        MessageBox.Show(connectionException.Message, "Error");
                        if (connectionOpen)
                        {
                            rp.CloseConnection();
                        }
                }
        }

        private void StartSess_Click(object sender, EventArgs e)
        {
            try
            {  //Start a new session with QuickBooks using the company file specified below.
                string ticket = rp.BeginSession(@"C:\Users\username\Documents\Quickbooks Company Files\example.QBW", QBFileMode.qbFileOpenDoNotCare);
                sessionBegun = true;
            }
            catch (Exception sessException)
            {
                //If the session fails (I.E. QuickBooks is not open with a user logged into the company file and the program is not given permission to
                //automatically log in, imeedietly end the session and close the connection.
                MessageBox.Show(sessException.Message, "Error");
                if (sessionBegun)
                {
                    rp.EndSession(ticket);
                }

                if (connectionOpen)
                {
                    rp.CloseConnection();
                }
            }
        }

        private void EndSess_Click(object sender, EventArgs e)
        {
            try
            { //End the session
                rp.EndSession(ticket);
                sessionBegun = false;
            }

            catch (Exception ex)
            { //If a session was not started already, set the session begun flag to false to avoid getting stuck in a loop.
                sessionBegun = false;
            }

        }

        private void CloseConn_Click(object sender, EventArgs e)
        {
            try
            { //Close the connection to QuickBooks
                rp.CloseConnection();
                connectionOpen = false;
            }

            catch (Exception ex)
            { //If the connection was not open, set the connection open flag ot false to avoid getting stuck in a loop.
                connectionOpen = false;
            }

        }
    }
}

根据我上面提供的示例程序,是否可以做一些事情来自行关闭QBW32.exe,以使其在我上面描述的场景下不会在后台运行?

更新:本人和其他许多用户已经尝试关闭QuickBooks首选项部分中的“保持Quickbooks运行以加快启动速度”设置。这不会阻止QBW32.exe在 session 和连接都结束后在后台保持打开状态。我看到这种行为发生在QB 2013到2015年之间。

最佳答案

从多年使用C#桌面SDK的经验中,我可以告诉您,您并不孤单。 Intuit意识到了这一点,并且与“保持运行”选项无关。我已经与Intuit支持人员聊天;有些人认为这是一个错误,有些人认为这是设计使然。

我有一个WinForms应用程序,该应用程序自QuickBooks 2006以来一直在生产中,并且从2011年左右开始(企业11)开始,这个过程的问题就一直悬而未决。从2013年起,即使SDK的测试器应用程序(“SDK Test Plus 3”)也将具有与您的测试器应用程序相同的行为。

我的应用程序在客户端的许多PC上运行,但是与QB通信的部分将调用其服务器上的QB实例(而不是在其PC上安装的QB),因此我选择使用“杀死QBW32”。 t关闭”的想法。在2014年,我将其更改为与台式机上的QB通信(因为他们的PC上具有QB),并且不使用kill技术(因为他们可能同时运行QB)。由于此更改,我不必担心QBW32仍在运行,也没有任何问题(我的客户端就是让我知道的类型)。

关于c# - 有没有一种方法可以正确结束与QuickBooks/QBW32.exe的 session ,使其不会在后台运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31126496/

10-11 00:03