2014-04-25 68 views
2

我支持連接到2個QuickBooks文件的傳統WinForms C#應用程序。多年來,QuickBooks 2008和QuickBooks 2011都運行良好。QB 2014升級後,WinForms應用程序無法連接

幾天前,客戶端升級到QuickBooks 2014.該應用程序還沒有成功連接到QuickBooks文件。當我手動運行該應用程序,它拋出一個.NET錯誤說System.Runtime.InteropServices.COMException(0x80040408):無法啓動的Quickbooks。

我決定測試一下,以確保我使用的SDK 8.0版實際上可以連接到QB 2014.所以,我運行了SDKTestPlus3應用程序。當我嘗試連接公司文件時,它告訴我該應用程序未被授權連接到該公司文件。所以,我在QB開公司文件,並進入單用戶模式,並再次嘗試 - 期望得到的彈出窗口,詢問我授予該應用程序連接的權利。相反,當我嘗試以單用戶模式連接QB中打開的文件時,SDKTestPlus3發出一個錯誤消息:「QuickBooks公司數據文件已經打開,並且與請求的不同,或者打開了多個公司文件。」

任何人都可以在這裏指出正確的方向。是QBFC8用QB 2014兼容的,如果是的話是不是我需要做的就是這個應用程序,它一直與2011 QB這麼長時間繼續與QB 2014的工作?

TIA!

其他信息

現在我已經注意到,在連接到QhickBooks錯誤似乎是間歇性的。 WinForms應用程序每天早晨在凌晨1:00由Windows計劃任務運行。自星期一升級到2014年以來,星期二,星期三和星期四早上都已經失敗。在看今天的日誌文件 - 今天早上在QB成功連接和處理的記錄。現在,當我嘗試手動運行而不是(0x80040408)時:無法啓動Quickbooks COM錯誤,而是收到COM錯誤(0x8004041C):嘗試訪問QuickBooks公司數據文件時發生內部QuickBooks錯誤。

有沒有其他人經歷過這些類型的問題或有任何想法可能會導致他們?我需要這個應用程序像過去一樣持續工作!

+0

截至今天這仍是一個巨大的* *的問題。有人遇到過這種情況麼?我估計應用程序可能會成功連接50%的時間。 – bjthomps

回答

0

確保未選中Keep QuickBooks運行選項。

關閉所有打開的QB文件,並確保任務管理器中沒有其他QBW32.exe文件正在運行。如果有,殺了他們。

嘗試再次連接。

+0

我確定沒有其他QB實例在運行,並且沒有運行QBW32.exe。我沒有在任何地方看到「Keep QuickBooks正在運行」複選框,我在哪裏找到它? – bjthomps

+0

它在首選項 - 常規選項卡中。 2014年的哪個補丁發佈? –

+0

它說的是QB Pro 2104.我沒有選中Keep QuickBooks運行選項,SDKTestPlus應用程序仍然無法連接。 – bjthomps

0

QuickBooks可能會挑剔誰在做什麼。更妙的是,雖然我敢肯定有一些集合,使其100%複製的邏輯條件,它抱怨用戶訪問看似隨機。

確保您的傳統WinForms應用程序和QuickBooks本身已安裝並在同一用戶帳戶下運行。

另一種選擇是更改UAC設置。

的TechNet上的UAC:關於UAC https://technet.microsoft.com/en-us/library/cc709691%28v=ws.10%29.aspx

Intuit和你呈現的錯誤代碼: 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"); 
      } 

     } 

    }