我支持连接到2个QuickBooks文件的传统WinForms C#应用程序。多年来,QuickBooks 2008和QuickBooks 2011都运行良好。
几天前,客户端升级到QuickBooks 2014.此后,应用程序还没有成功连接到QuickBooks文件。当我手动运行应用程序时,它会抛出一个.NET错误,说System.Runtime.InteropServices.COMException(0x80040408):无法启动Quickbooks。
我决定测试以确保我使用的SDK 8.0版实际上可以连接到QB 2014.所以,我运行了SDKTestPlus3应用程序。当我尝试连接到公司文件时,它告诉我该应用程序无权连接到该公司文件。所以,我在QB中打开了公司文件并进入了单用户模式,并再次尝试 - 期望获得弹出窗口,要求我授予该应用程序连接权。相反,当我尝试在单用户模式下连接QB中打开的文件时,SDKTestPlus3发出错误消息“QuickBooks公司数据文件已经打开,它与请求的文件不同,或者打开了多个公司文件。” / p>
任何人都可以在这里指出我正确的方向。 QBFC8是否与QB 2014兼容,如果是这样的话,我需要做些什么来使这个应用程序长期与QB 2011合作以继续与QB 2014合作?
TIA!
其他信息
我现在已经注意到连接到QhickBooks的错误似乎是间歇性的。 WinForms应用程序每天早上1:00由Windows计划任务运行。自周一升级至2014年以来,周二,周三和周四早上失败。在查看今天的日志文件时 - 今天早上它成功连接并处理了QB中的记录。现在,当我尝试手动运行时,而不是(0x80040408):无法启动Quickbooks COM错误我改为COM错误(0x8004041C):尝试访问QuickBooks公司数据文件时发生内部QuickBooks错误。
是否有其他人遇到过这些类型的问题,或者知道可能导致这些问题的原因是什么?我需要这个应用程序像过去那样一致地工作!!
答案 0 :(得分:0)
确保未选中Keep QuickBooks运行选项。
关闭所有打开的QB文件,并确保在任务管理器中没有运行其他QBW32.exe文件。如果有,杀了他们。
再次尝试连接。
答案 1 :(得分:0)
QuickBooks可以挑剔谁在做什么。更好的是,尽管我确信有一些逻辑条件可以使其100%可复制,但它却似乎随机地抱怨用户访问。
确保您的旧版WinForms应用程序和QuickBooks本身已安装并在同一用户帐户下运行。
另一种选择是改变UAC设置。
UAC上的technet:https://technet.microsoft.com/en-us/library/cc709691%28v=ws.10%29.aspx
直觉上UAC和您的呈现错误代码:http://support.quickbooks.intuit.com/support/articles/SLN40414
忽略那一点^^^。
QuickBooks Pro 2014中出现错误。我遇到它在无人参与模式下运行,您的连接和会话在公司文件之间来回传递。
经过几次来回,他们的代码中发生了一些事情,当你.EndSession / .CloseConnection时,QuickBooks exe没有关闭。然后,当您尝试打开下一个连接时,异常会冒泡并且您将获得InterOp异常。
我最终要做的是关闭连接后,等待半秒钟,然后,如果QB32正在运行,则将其杀死。这是一个糟糕的修复,但我没有选择,而且它有效。
// closeConnection is from Intuit's SessionManager.cs that gets installed with the SDK
private void closeConnection(bool logError)
{
try
{
endSession(true);
if (_bConnOpen)
{
_sessionMgr.CloseConnection();
System.Threading.Thread.Sleep(waitTime);
KillQB32W();
_queryResponse = null;
_bConnOpen = false;
}
}
catch (Exception e)
{
if (logError)
logger.logCritical("SessionManager.CloseConnection", e.Message);
throw;
}
}
private void KillQB32W()
{
System.Diagnostics.Process[] oProcess = System.Diagnostics.Process.GetProcessesByName("QBW32");
foreach (System.Diagnostics.Process q in oProcess)
{
if (!q.HasExited)
{
q.Kill();
System.Diagnostics.Debug.WriteLine("Killer");
}
}
}