首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种方法可以正确地结束与QuickBooks/QBW32.exe的会话,这样它就不会在后台继续运行?

是否有一种方法可以正确地结束与QuickBooks/QBW32.exe的会话,这样它就不会在后台继续运行?
EN

Stack Overflow用户
提问于 2015-06-29 22:16:16
回答 4查看 5.1K关注 0票数 6

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

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

1)开播我的一个节目。

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

3) QuickBooks接口返回一个错误,要求您必须打开QuickBooks并将其签名到公司文件中才能执行此操作。

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

结果:

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

如果用户随后试图打开QuickBooks桌面程序,他们会收到一个错误,告诉他们QuickBooks已经在运行。然后,他们必须在windows中打开任务管理器,并关闭正在运行的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的尝试捕获结束了。

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

8)即使会话和连接已经结束和关闭,QBW32.exe仍然在后台运行。

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

代码语言:javascript
复制
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。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-08 00:09:36

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

  • 只有在QB中的集成应用程序列表上设置程序以自动登录时,QBW32.exe才会关闭自己。
  • 如果程序未设置为自动登录,则QBW32.exe将在您传入公司文件名时打开会话,即使结束会话并结束连接,QBW32.exe也将保持打开状态。
  • 如果在启动会话时没有传入公司文件,则QBW32.exe不会启动。

我与William在Intuit论坛上证实,这似乎是按计划进行的。

为了解决这个问题,我已经在我的测试应用程序中这样做了:

我在会话周围添加了一个额外的if块,它首先通过一个未指定公司文件的开放会话调用发送连接测试。这迫使接口返回一个错误,告诉我不能启动会话,因为没有指定任何公司文件,而且QuickBooks也没有打开。这将迫使我的测试应用程序显示一条消息,告诉我在再次尝试之前打开公司文件。

我设想我可以在此基础上添加一个设置为“在自动模式下使用日志”和“常规模式”,这样如果我真的想要使用自动登录,就可以在需要时跳过测试连接。

无论如何,这似乎是绕过这个场景的唯一方法,而不仅仅是添加一个扼杀QBW32.exe进程的代码块。这并不是完全可取的,但也是一种选择。

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

截至1997年12月9日的最新情况:

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

我已经用QuickBooks 2016和Enterprise2017对此进行了测试。我们所有的用户谁有至少QuickBooks 2016 (各种版本,临,总理等)没有抱怨上述问题也。我将在这里冒险,猜测Intuit有意或无意地解决了这个问题。

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

票数 4
EN

Stack Overflow用户

发布于 2015-08-27 17:37:47

根据多年使用C#桌面SDK的经验,我可以告诉您,您并不孤单。Intuit知道这一点,它与“持续运行”选项无关。我已经和Intuit支持人员聊过了;有些人认为这是一个bug,还有一些人认为这是经过设计的。

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

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

票数 4
EN

Stack Overflow用户

发布于 2015-06-30 11:18:00

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

2011或更高版本中,关闭“QuickBooks Turn for for”首选项。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31126496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档