2009-06-28 37 views
5

Tôi muốn triển khai máy chủ python com bằng cách sử dụng phần mở rộng win32com. Sau đó, sử dụng máy chủ từ bên trong .NET. Tôi đã sử dụng ví dụ sau để triển khai máy chủ com và chạy mà không gặp sự cố nhưng khi tôi cố gắng sử dụng nó bằng C#, tôi đã nhận được FileNotFoundException với thông báo sau "Truy xuất nhà máy của lớp COM cho thành phần với CLSID {676E38A6-7FA7-4BFF- 9179-AE959734DEBB} không thành công do lỗi sau: 8007007e. " . Tôi đăng các mã C# là tốt. Tôi tự hỏi nếu tôi thiếu một cái gì đó tôi sẽ đánh giá cao sự giúp đỡ nào.Tiêu thụ Máy chủ Python COM từ .NET

Cảm ơn, Sarah

#PythonCOMServer.py 

import pythoncom 
class PythonUtilities: 
    _public_methods_ = [ 'SplitString' ] 
    _reg_progid_ = "PythonDemos.Utilities" 
    # NEVER copy the following ID 

    # Use"print pythoncom.CreateGuid()" to make a new one. 
    _reg_clsid_ = pythoncom.CreateGuid() 
    print _reg_clsid_ 
    def SplitString(self, val, item=None): 
     import string 
     if item != None: item = str(item) 
     return string.split(str(val), item) 

# Add code so that when this script is run by 
# Python.exe,.it self-registers. 

if __name__=='__main__':   
    print 'Registering Com Server' 
    import win32com.server.register 
    win32com.server.register.UseCommandLine(PythonUtilities) 


// the C# code 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

       Type pythonServer; 
       object pythonObject; 
       pythonServer = Type.GetTypeFromProgID("PythonDemos.Utilities"); 
       pythonObject = Activator.CreateInstance(pythonServer); 

     } 
    } 
} 
+1

Lưu ý cảnh báo trong mã python, không sử dụng GUID mới trên mọi cuộc gọi. Chỉ tạo GUID một lần. – gimel

+0

Mã bạn đăng là để đăng ký máy chủ COM; bạn cũng đã triển khai (và chạy) máy chủ thực sự chưa? –

+0

Tôi nghĩ rằng việc đăng ký máy chủ có nghĩa là nó đang chạy. Bạn có thể cho tôi thêm hướng dẫn không. cảm ơn – Sarah

Trả lời

10

Máy chủ COM chỉ là một phần mềm (một tệp DLL hoặc một tệp thực thi) sẽ chấp nhận các cuộc gọi thủ tục từ xa (RPC) thông qua một giao thức được xác định. Một phần của giao thức nói rằng máy chủ phải có một ID duy nhất, được lưu trữ trong sổ đăng ký của Windows. Trong trường hợp của chúng tôi, điều này có nghĩa là bạn đã "đăng ký" một máy chủ không tồn tại. Vì vậy, lỗi (thành phần không tìm thấy).

Vì vậy, nó phải là một cái gì đó như thế này (như thường lệ, đây là mã chưa được kiểm tra!):

import pythoncom 

class HelloWorld: 
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER 
    _reg_clsid_ = "{B83DD222-7750-413D-A9AD-01B37021B24B}" 
    _reg_desc_ = "Python Test COM Server" 
    _reg_progid_ = "Python.TestServer" 
    _public_methods_ = ['Hello'] 
    _public_attrs_ = ['softspace', 'noCalls'] 
    _readonly_attrs_ = ['noCalls'] 

    def __init__(self): 
     self.softspace = 1 
     self.noCalls = 0 

    def Hello(self, who): 
     self.noCalls = self.noCalls + 1 
     # insert "softspace" number of spaces 
     return "Hello" + " " * self.softspace + str(who) 

if __name__ == '__main__': 
    if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]: 
     import win32com.server.register 
     win32com.server.register.UseCommandLine(HelloWorld) 
    else: 
     # start the server. 
     from win32com.server import localserver 
     localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B') 

Sau đó, bạn nên chạy từ dòng lệnh (giả sử các kịch bản được gọi là HelloWorldCOM.py):

HelloWorldCOM.py --register 
HelloWorldCOM.py

Lớp HelloWorld là triển khai thực tế của máy chủ. Nó phơi bày một phương thức (Hello) và một vài thuộc tính, một trong hai phương thức này là chỉ đọc. Với lệnh đầu tiên, bạn đăng ký máy chủ; với thứ hai, bạn chạy nó và sau đó nó trở nên có sẵn để sử dụng từ các ứng dụng khác.

+0

để chạy mã trước đó mà không có lỗi, tôi đã gọi phương thức localserver.main() thay vì localserver.serve ('B83DD222-7750-413D-A9AD-01B37021B24B'). Tôi đã khởi động máy chủ và đặt nó là _reg_progid_ làm đối số. – Sarah

+1

'localserver.serve ('B83DD222-7750-413D-A9AD-01B37021B24B')' gần như chính xác. Bạn cần phải bao gồm các dấu ngoặc và đặt nó trong một danh sách: 'localserver.serve (['{B83DD222-7750-413D-A9AD-01B37021B24B}'])'. Hoạt động hoàn hảo nếu không. –

+0

Có thể chạy nó mà không cần đăng ký không? xem câu hỏi của tôi.:http://stackoverflow.com/questions/41975659/portable-python-com-server-using-pywin32 – Rahul

0

Bạn cần chạy Process Monitor trên C# thực thi để theo dõi các tập tin mà không được tìm thấy.

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