QBFC10调用sessionManager.BeginSession触发System.AccessViolationException求助
QBFC10调用BeginSession指定文件路径触发AccessViolationException问题解决
使用QBFC10开发时,调用sessionManager.BeginSession(@"D:\CompanyFile.qbw", ENOpenMode.omDontCare)触发如下异常:
System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'
若将文件路径设为空字符串"",代码可正常执行,但无法实现在QuickBooks未运行时指定文件启动的需求。
相关代码:
private void BtnQuery_Click(object sender, EventArgs e) { bool sessionBegun = false; bool connectionOpen = false; QBSessionManager sessionManager = null; try { sessionManager = new QBSessionManager(); IMsgSetRequest requestMsgSet = sessionManager.CreateMsgSetRequest("US", 10, 0); requestMsgSet.Attributes.OnError = ENRqOnError.roeContinue; IItemInventoryQuery ItemInventoryQueryRq = requestMsgSet.AppendItemInventoryQueryRq(); sessionManager.OpenConnection2("", "AppName", ENConnectionType.ctLocalQBD); connectionOpen = true; sessionManager.BeginSession(@"D:\CompanyFile.qbw", ENOpenMode.omDontCare); sessionBegun = true; IMsgSetResponse responseMsgSet = sessionManager.DoRequests(requestMsgSet); sessionManager.EndSession(); sessionBegun = false; sessionManager.CloseConnection(); connectionOpen = false; String xml = responseMsgSet.ToXMLString(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error"); if (sessionBegun) { sessionManager.EndSession(); } if (connectionOpen) { sessionManager.CloseConnection(); } } }
解决建议
验证文件路径与权限
确认D:\CompanyFile.qbw路径完全正确,文件存在且未被锁定;同时确保程序拥有该文件及所在目录的读写权限,必要时以管理员身份运行程序,或调整文件夹的安全权限。匹配QBFC与QuickBooks版本
QBFC10仅兼容QuickBooks 2010版本,若使用更高版本的QuickBooks,需升级QBFC到对应版本(如QBFC13对应QB 2013等)。此外,可尝试重新注册QBFC组件:regsvr32 "C:\Program Files (x86)\Intuit\QBFC10\bin\QBFC10.dll"注意替换为实际安装路径,需管理员权限执行。
修改打开模式参数
将ENOpenMode.omDontCare替换为明确的打开模式,比如omSingleUser或omMultiUser,避免模糊模式引发的内存访问问题:sessionManager.BeginSession(@"D:\CompanyFile.qbw", ENOpenMode.omSingleUser);排查文件锁定与QB运行状态
确保无其他进程占用该QBW文件(如后台QB实例、备份程序、杀毒扫描),可重启系统后再测试。若QB未运行,需确认系统权限未阻止QBFC启动QB实例。调试.NET与QBFC交互问题
清理项目的bin/obj目录后重新编译;将项目目标平台切换为x86(QBFC为32位组件,AnyCPU模式可能引发兼容性问题)。
内容的提问来源于stack exchange,提问作者RickyBelmont
相关产品推荐
相关产品推荐

