有没有办法用QuickBooks/QBW32.exe正确地结束会话,这样它就不会在后台运行了

本文关键字:运行 后台 会话 QuickBooks QBW32 结束 正确地 exe 有没有 | 更新日期: 2023-09-27 18:00:20

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

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

1) 打开我的一个程序。

2) 执行启动与QuickBooks的连接和会话的操作。

3) QuickBooks接口返回一个错误,表示必须打开QuickBooks并将其登录到公司文件中才能执行此操作。

4) 我的程序关闭会话和连接,然后向用户显示一些对话框,为他们提供疑难解答提示。

结果:

QuickBooks本身继续以QBW32.exe的形式在后台运行,即使会话和连接都已关闭。

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

我用下面写的一个非常基本的C#程序复制了这个。

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

先决条件:1)测试应用程序未设置为自动登录QuickBooks。它设置为仅当用户打开QuickBooks桌面程序并且打开了公司文件时才登录。

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

步骤:

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

2) 按下上面写着"打开连接"的按钮。应该通过QBXML互操作使用QuickBooks的界面打开连接。

3) 按下上面写着"开始会话"的按钮。会话应该使用QuickBooks启动。

4) 假设测试预先要求已满足,您应该会收到QuickBooks返回的错误消息,告诉您应用程序未设置为自动登录,您需要打开QuickBooks才能尝试会话。

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

6) 按下表示结束会话的按钮。这应该使用QuickBooks界面结束会话。不管怎样,会话应该已经通过步骤3的按钮中的try-catch结束了。

7) 按下上面写着"关闭连接"的按钮。这将关闭与QuickBooks的所有连接。

8) 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在会话和连接都结束后在后台保持打开状态。我看到这种行为发生在2013年至2015年的QB中。

有没有办法用QuickBooks/QBW32.exe正确地结束会话,这样它就不会在后台运行了

根据多年使用C#桌面SDK的经验,我可以告诉你,你并不孤单。Intuit意识到了这一点,它与"继续运行"选项无关。我和Intuit的支持人员聊过;有些人认为这是一个bug,有些人则认为这是故意的。

我有一个WinForms应用程序,它从QuickBooks 2006年开始生产,大约从2011年(Enterprise 11)开始,这个过程中的问题就开始了。截至2013年,即使是SDK的测试应用程序("SDK Test Plus 3")也会执行与测试应用程序相同的行为。

我的应用程序在我客户端的许多PC上运行,但与QB通信的部分会调用他们服务器上的QB实例(而不是安装在他们PC上的QB),我选择使用"如果QBW32无法关闭,就杀死它"的想法。2014年,我将其更改为在他们的桌面上与QB通信(因为他们的电脑上有QB),而不使用杀死技术(因为他们可能同时运行QB)。由于这个变化,我不必担心QBW32仍在运行,我也没有遇到任何问题(我的客户是让我知道的类型)。

在使用Geetanjali提出的场景进行了一些进一步的测试后,我得出了以下结论:

  • QBW32.exe只有在QB中的集成应用程序列表上设置了程序以自动登录时才会自动关闭。

  • 如果您的程序没有设置为自动登录,QBW32.exe将在您输入公司文件名时启动会话时打开,即使您结束会话并结束连接,它也将保持打开状态。

  • 如果在启动会话时没有传入公司文件,则QBW32.exe不会启动。

我已经在Intuit论坛上与William确认了这似乎是按预期进行的。

为了解决这个问题,我在我的测试应用程序中做了这件事

我在会话开始时添加了一个额外的if块,以便在没有指定公司文件的情况下通过打开会话调用首先发送连接测试。这迫使接口返回一个错误,告诉我我无法启动会话,因为没有指定公司文件,并且QuickBooks也没有打开。这随后迫使我的测试应用程序显示一条消息,告诉我在重试之前打开公司文件。

我想我可以通过添加一个"在自动模式下使用登录"answers"常规模式下"的设置来进一步完善这一点,这样,如果我真的想使用自动登录,可以在需要时跳过测试连接。

无论如何,这似乎是绕过这种情况的唯一方法,除了添加一个杀死QBW32.exe进程的代码块。这并不完全令人满意,但也是一种选择。

无论如何,我希望这能帮助任何在不久的将来遇到这个障碍的人。

自2017年9月12日起更新:

从QuickBooks 2016开始,这种行为似乎不再是问题。无论您是否在自动登录或不自动登录的情况下传入公司文件,当您启动会话时,当用户尝试直接或通过桌面/开始菜单快捷方式运行可执行文件时,QBW32.exe将在之后打开。有趣的是,QBW32.exe进程可能已经在后台运行,因为您在没有自动登录的情况下传入了公司文件。尽管如此,用户仍然可以打开QuickBooks,但他们不会收到说明QuickBooks已经在运行的消息。

我已经在QuickBooks Enterprise 2016和Enterprise 2017中测试过这一点。我们所有至少拥有QuickBooks 2016(各种版本,Pro,Premier等)的用户也没有抱怨上述问题。我将在这里冒险,猜测Intuit决定有意或无意地解决这个问题。

因此,只有当您或集成应用程序的用户仍在使用QuickBooks 2016以下的QuickBooks版本时,我才推荐上述方法。

如果您的QuickBooks在后台运行,请执行以下步骤:

关闭QuickBooks 2011或更高版本中的"保持QuickBooks运行以快速启动"首选项。

  1. 打开QuickBooks并打开您的公司文件
  2. 选择"编辑>首选项"
  3. 选择左侧列表中的"常规"图标
  4. 选择顶部的"我的首选项"选项卡
  5. 单击以清除"为快速启动保持QuickBooks运行"复选框
  6. 单击"确定"

关闭QuickBooks或重新启动计算机后,QuickBooks将不会在后台运行。

我尝试了以下操作:打开SQL Server Management Studio,运行一个查询QuickBooks的Integration包(QuickBooks将在后台自动启动),然后完全关闭SQL MS。我可以确认QBW32.EXE仍然在运行,并且访问QB的服务不再运行。

调用应用程序必须始终关闭连接。终止调用应用程序会杀死应用程序,而不是连接。使用MS SQL Server时,需要链接和取消链接QODBC。

例如:

EXEC sp_addlinkedserver@server=N'QODBC',@srvproduct=N'QODBC',@provider=N'MSDASQL',@datasrc=N'QuickBooks Data',@provestr='ODBC;DSN=QuickBooks数据;DFQ=C:''Program Files''QODBC QuickBooks''sample04.qbw驱动程序;服务器=QODBC;使用DCOM=Y;OptimizerDBFolder=C:''Program Files''QODBC QuickBooks''Optimizer驱动程序;OptimizerAllowDirtyReads=Y'

EXEC sp_dropserver@server=N'QODBC'

希望这对你有帮助。