我有一个第三方应用程序,到现在为止,使用插件与quickbooks交谈。该插件不再适用于windows的最新版本,因此我将使用PowerShell脚本替换它。插件将实例化QBXMLRP.RequestProcessor com对象,然后打开连接并开始使用QuickBooks进行会话,处理来自我的应用程序的各种请求,然后关闭并断开与quickbooks的连接。当连接打开时,QuickBooks提供的票据用于处理来自我的应用程序的任意数量的请求。
使用PowerShell,我执行命令行提示符以“启动”PowerShell并运行PowerShell .ps1脚本文件。与插件一样,PS脚本实例化com对象,打开qb连接,开始qb会话,发送qb请求,结束qb会话,关闭qb连接。
这很好,但与插件不同,在与QuickBooks的一个开放会话中,我不能从我的应用程序发送多个请求。一旦我发出命令行提示符,PS脚本就会执行它的操作,并且PS退出,com对象就会丢失。是为了保存qb对象的活动实例并在随后的PowerShell会话中重用它.
我的应用程序发出命令行提示符来运行开始qb会话的PowerShell .
(.ps1 script)
$myqbxmrlp = New-Object -com QBXMLRP.RequestProcessor
$myqbxmrlp.OpenConnection(...)
$ticket = $myqbxmrlp.BeginSession(....)
$ticket | Export-CliXml $ticket (or set-content)
?? preserve the live $myqbxmrlp com object ??我的应用程序发出命令行调用来打开PS会话2,向qb发送请求.
(.ps1 script)
$myqbxmrlp = ?? get the live com object back ??
$ticket = Import-CliXml $ticket (or get-content)
$myqbxmrlp.ProcessRequest($ticket,....) 命令行调用,用另一个请求打开PS会话3.
命令行调用,用另一个请求打开PS会话4.
命令行调用打开PS会话5,结束qb会话并关闭qb连接.
(.ps1 script)
$myqbxmrlp = ?? get the com object back ??
$ticket = Import-CliXml $ticket (or get-content)
myqbxmrlp.EndSession($ticket,....)
$myqbxmrlp.CloseConnection还有其他方法可以使用powershell来处理这个问题吗?
发布于 2015-04-20 16:26:15
我无法验证这是否适用于QuickBooks,但对于Excel和其他COM对象来说是可能的。您必须使用Marshal.GetActiveObject方法:
# Name of the QuickBooks COM object
$QbComObject = 'QBXMLRP.RequestProcessor'
# Try to get active instance of the QuickBooks COM object
if(-not ($myqbxmrlp = [Runtime.InteropServices.Marshal]::GetActiveObject($QbComObject)))
{
# If we can't, then create new instance
$myqbxmrlp = New-Object -ComObject $QbComObject
$myqbxmrlp.OpenConnection(<#...your code...#>)
}
# Some code to process tickets...
$ticket = $myqbxmrlp.BeginSession(<#...your code...#>)
$ticket | Export-CliXml $ticket实题:如何从PowerShell连接到现有的Excel实例?
更新#1:
如何使Marshal.GetActiveObject可用。我得到以下带有"1“参数的error...Exception调用"GetActiveObject”:“操作不可用( HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)例外)”
这可能意味着第三方应用程序没有注册为自动化服务器。无法获得对正在运行的实例的引用。。您可以尝试将公开QBXMLRP.RequestProcessor (可能是dll\tlb\ocx\exe)的文件注册到regsvr32.exe,但鉴于我对QuickBooks的零知识,我无法给您提供任何具体的指示。尝试在QuickBooks安装目录中搜索包含字符串RequestProcessor的文件。
更新:#2
虽然您似乎无法获得QuickBooks对象的活动实例,但可以通过进程间通信(IPC)来缓解这种情况:
IPC可以通过命名管道来完成,下面是一些示例:
https://stackoverflow.com/questions/29735611
复制相似问题