我正在使用
[DllImport("Oleacc.dll")]
static extern int AccessibleObjectFromWindow(
int hwnd,
uint dwObjectID,
byte[] riid,
ref Excel.Window ptr);Run Code Online (Sandbox Code Playgroud)
使用他的句柄获取Excel实例,我从excel实例的进程ID获取.
这就是我使用这些功能时的样子
const uint OBJID_NATIVEOM = 0xFFFFFFF0;
Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
Excel.Window ptr = null;
int hr = AccessibleObjectFromWindow(hwndChild, OBJID_NATIVEOM,
IID_IDispatch.ToByteArray(), ref ptr);
Object objApp = ptr.Application;Run Code Online (Sandbox Code Playgroud)
这种代码安静很有效,但唯一的问题是我必须添加对Office 2003主互操作程序集的引用.
正如你所看到的,函数中的最后一个参数是我需要添加对Pias的引用的原因,所以我的问题是如果有一种方法可以避免使用Interop程序集,我尝试过后期绑定但是也许我一直在做错,因为我无法让它发挥作用.
我有一个第三方应用程序,到目前为止使用插件与quickbooks交谈.该插件不再适用于最新版本的Windows操作系统,因此我将使用PowerShell脚本替换它.插件将实现QBXMLRP.RequestProcessor com对象,然后打开连接并开始与QuickBooks的会话,处理来自我的应用程序的各种请求,然后关闭并断开与quickbooks的连接.连接打开时,QuickBooks提供的票证用于处理来自我的应用程序的任意数量的请求.
使用PowerShell,我执行命令行提示以"PowerShell"启动PowerShell,并运行PowerShell .ps1脚本文件.正如插件所做的那样,PS脚本实例化com对象,打开qb连接,开始qb会话,发送qb请求,结束qb会话,关闭qb连接.
这很好用,除了与插件不同,我在使用QuickBooks的单个打开会话期间无法从我的应用程序发送多个请求.一旦我发出命令行提示符,PS脚本会执行此操作并且PS退出并且com对象丢失.无论如何,它们是保留qb com对象的实时实例并在后续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 ??
Run Code Online (Sandbox Code Playgroud)
我的应用程序发出命令行调用打开PS Session 2发送请求到qb ...
(.ps1 script)
$myqbxmrlp = ?? get the live com object back ??
$ticket = Import-CliXml $ticket (or get-content)
$myqbxmrlp.ProcessRequest($ticket,....)
Run Code Online (Sandbox Code Playgroud)
用另一个请求打开PS Session 3的命令行调用...
用另一个请求打开PS Session 4的命令行调用...
命令行调用打开PS Session 5并结束qb会话并关闭qb连接...
(.ps1 script)
$myqbxmrlp = ?? get the com object back ??
$ticket = Import-CliXml $ticket …Run Code Online (Sandbox Code Playgroud)