首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在PowerShell会话之间传递com对象的活动实例?

是否可以在PowerShell会话之间传递com对象的活动实例?
EN

Stack Overflow用户
提问于 2015-04-19 20:43:00
回答 1查看 501关注 0票数 5

我有一个第三方应用程序,到现在为止,使用插件与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 .

代码语言:javascript
复制
(.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发送请求.

代码语言:javascript
复制
(.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连接.

代码语言:javascript
复制
(.ps1 script)    
$myqbxmrlp = ?? get the com object back ??
$ticket = Import-CliXml $ticket (or get-content)
myqbxmrlp.EndSession($ticket,....)
$myqbxmrlp.CloseConnection

还有其他方法可以使用powershell来处理这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-20 16:26:15

我无法验证这是否适用于QuickBooks,但对于Excel和其他COM对象来说是可能的。您必须使用Marshal.GetActiveObject方法:

代码语言:javascript
复制
# 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)来缓解这种情况:

  1. 一个脚本应该创建一个QuickBooks对象,然后等待输入
  2. 所有QuickBooks交互都是通过对另一个脚本的后续调用来完成的,该脚本将通过IPC将请求传递给第一个脚本。

IPC可以通过命名管道来完成,下面是一些示例:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29735611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档