QB 2014升级后,WinForms应用程序将无法连接

时间:2014-04-25 14:16:09

标签: quickbooks intuit-partner-platform qbfc

我支持连接到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错误。

是否有其他人遇到过这些类型的问题,或者知道可能导致这些问题的原因是什么?我需要这个应用程序像过去那样一致地工作!!

2 个答案:

答案 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");
            }

        }

    }