我在一些使用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按钮关闭测试应用程序。
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。
发布于 2015-07-08 00:09:36
在使用Geetanjali介绍的场景进行了一些进一步测试之后,我得出了以下结论:
我与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版本时,我才推荐采用上述方法。
发布于 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还在运行,也没有遇到任何问题(我的客户就是那种让我知道的类型)。
发布于 2015-06-30 11:18:00
如果您的QuickBooks在后台运行,那么执行以下步骤:
在 2011或更高版本中,关闭“QuickBooks Turn for for”首选项。
关闭QuickBooks或重新启动计算机后,QuickBooks将不会在后台运行。
https://stackoverflow.com/questions/31126496
复制相似问题