我对许多使用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/