2015-04-19 13 views
5

Tôi có một ứng dụng của bên thứ ba đến nay đã nói chuyện với các sách nhanh bằng cách sử dụng một trình cắm thêm. Plugin đó không còn hoạt động với các phiên bản mới nhất của hệ điều hành windows, vì vậy tôi sẽ thay thế nó bằng các kịch bản PowerShell. Trình cắm thêm sẽ instanstiate đối tượng com QBXMLRP.RequestProcessor sau đó mở một kết nối và bắt đầu một phiên làm việc với QuickBooks, xử lý các yêu cầu khác nhau từ ứng dụng của tôi rồi đóng và ngắt kết nối với các sách nhanh. Trong khi kết nối được mở, một vé do QuickBooks cung cấp được sử dụng để xử lý bất kỳ số lượng yêu cầu nào từ ứng dụng của tôi.Có thể truyền một thể hiện trực tiếp của một đối tượng com giữa các phiên PowerShell

Sử dụng PowerShell, tôi thực hiện lời nhắc dòng lệnh để "khởi chạy" PowerShell bằng tệp kịch bản PowerShell .ps1 để chạy. Khi trình cắm thêm đã làm, tập lệnh PS khởi tạo đối tượng com, mở một kết nối qb, bắt đầu một phiên qb, gửi một yêu cầu qb, kết thúc phiên qb, đóng kết nối qb.

Điều này làm việc tốt ngoại trừ việc không giống như trình cắm, tôi không thể gửi nhiều yêu cầu từ ứng dụng của tôi trong một phiên mở duy nhất với QuickBooks. Khi tôi đưa ra dòng lệnh, tập lệnh PS thực hiện điều đó và thoát PS và đối tượng com bị mất. Là anyway của họ để bảo vệ dụ sống của đối tượng com qb và tái sử dụng nó trong phiên PowerShell tiếp theo ...

Ứng dụng của tôi đưa ra một dấu nhắc dòng lệnh để chạy PowerShell bắt đầu một phiên qb ...

(.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 ?? 

ứng dụng của tôi issuse một cuộc gọi dòng lệnh để mở PS Phần 2 gửi yêu cầu đến QB ...

(.ps1 script)  
$myqbxmrlp = ?? get the live com object back ?? 
$ticket = Import-CliXml $ticket (or get-content) 
$myqbxmrlp.ProcessRequest($ticket,....)  

gọi dòng lệnh để mở PS phiên 3 với yêu cầu khác ...

dòng lệnh gọi để mở PS Phần 4 với một yêu cầu khác ...

gọi dòng lệnh để mở PS Phần 5 và kết thúc phiên qb và đóng kết nối qb ...

(.ps1 script)  
$myqbxmrlp = ?? get the com object back ?? 
$ticket = Import-CliXml $ticket (or get-content) 
myqbxmrlp.EndSession($ticket,....) 
$myqbxmrlp.CloseConnection 

Có khác cách để tiếp cận này bằng cách sử dụng PowerShell?

Trả lời

3

Tôi không thể xác minh rằng điều này sẽ hoạt động cho QuickBooks, nhưng có thể cho Excel và các đối tượng COM khác. Bạn phải sử dụng phương pháp 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 

realated câu hỏi: How to connect to existing instance of Excel from PowerShell?

CẬP NHẬT # 1:

Làm thế nào để làm cho Marshal.GetActiveObject sẵn. Tôi nhận được sau lỗi ... ngoại lệ gọi là "GetActiveObject" với "1" luận (s): "Chiến dịch không có sẵn (ngoại lệ từ HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))"

Có lẽ điều này có nghĩa rằng the 3rd party app is not registered as an automation server. It is not possible to get a reference to the running instance.. Bạn có thể thử đăng ký tập tin hiển thị QBXMLRP.RequestProcessor (nó có thể là dll \ tlb \ ocx \ exe) với regsvr32.exe, nhưng với kiến ​​thức của tôi về QuickBooks, tôi không thể cung cấp cho bạn bất kỳ hướng dẫn cụ thể nào. Hãy thử tìm kiếm thư mục cài đặt QuickBooks cho các tệp có chứa chuỗi RequestProcessor.

UPDATE: # 2

Trong khi có vẻ như là bạn không thể có được một ví dụ sống của đối tượng QuickBooks, điều này có thể được giảm nhẹ thông qua interprocess communication (IPC):

  1. Một kịch bản nên tạo đối tượng QuickBooks và sau đó đợi nhập
  2. Tất cả tương tác QuickBooks được thực hiện thông qua các cuộc gọi tiếp theo đến tập lệnh khác, sẽ chỉ chuyển yêu cầu đến tập lệnh đầu tiên qua IPC.

IPC có thể được thực hiện thông qua Named Pipes, đây là một số ví dụ:

+0

Làm thế nào để làm cho Marshal.GetActiveObject sẵn. Tôi nhận được lỗi sau đây ... Ngoại lệ gọi "GetActiveObject" với "1" đối số (s): "Hoạt động không có sẵn (Ngoại lệ từ HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))" – user278859

+0

@ user278859 Xem cập nhật, không chắc chắn nếu nó giúp, nhưng đó là điều tốt nhất tôi có thể làm. – beatcracker

+0

Cảm ơn sự giúp đỡ của bạn về điều này. Tôi nghĩ rằng đó là thời gian để tiếp tục và chỉ chấp nhận rằng tôi sẽ phải mở và đóng kết nối cho mỗi truy vấn. Nó sẽ làm việc, nó chỉ là nó có thể có vẻ hơi chậm nếu tôi có yêu cầu multipble để thực hiện. Tôi tự hỏi mình nên làm gì với câu hỏi này. Đánh dấu nó là đã trả lời, đánh dấu nó chưa được trả lời, hoặc xóa nó? – user278859

Các vấn đề liên quan