سؤال

قمت بتنفيذ خادم Python Com وإنشاء ملف قابل للتنفيذ باستخدام أداة PY2EXE. ثم استخدمت Regsvr32.exe لتسجيل DLL.I حصلت على رسالة مفادها أن التسجيل كان ناجحا. ثم حاولت إضافة مرجع إلى تلك dll في .NET. لقد استعرضت في موقع DLL وحددها، لكنني تلقيت مربع رسالة خطأ يقول: تعذر إضافة مرجع إلى DLL، يرجى التأكد من أن الملف يمكن الوصول إليه وأنه مكونا صالحا للتجميع أو COM. يضاف رمز البرنامج النصي للخادم والإعداد أدناه. أريد أن أذكر أنه يمكنني تشغيل الخادم كبرنامج نصي ثعبان ويستهلكه من .NET باستخدام التوصيل المتأخر. هل هناك شيء أفتقده أو فعله خطأ؟ وسأكون ممتنا أي مساعدة.

شكرا، سارة

hello.py.

import pythoncom

import sys

class HelloWorld:

    #pythoncom.frozen = 1
    if hasattr(sys, 'importers'):
        _reg_class_spec_ = "__main__.HelloWorld" 
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
    _reg_clsid_ = pythoncom.CreateGuid()
    _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
        print "Hello" + " " * self.softspace + str(who)
        return "Hello" + " " * self.softspace + str(who)


if __name__=='__main__':
    import sys
    if hasattr(sys, 'importers'):

        # running as packed executable.

        if '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]:

            # --register and --unregister work as usual
            import win32com.server.register
            win32com.server.register.UseCommandLine(HelloWorld)
        else:

            # start the server.
            from win32com.server import localserver
            localserver.main()
    else:

        import win32com.server.register
        win32com.server.register.UseCommandLine(HelloWorld) 

setup.py.

from distutils.core import setup
import py2exe

setup(com_server = ["hello"])
هل كانت مفيدة؟

المحلول 2

سأجيب على سؤالي لمساعدة أي شخص قد يكون له أسئلة مماثلة. آمل أن تساعد ذلك. لا أستطيع أن أجد الخادم الخاص بي على علامة التبويب COM لأنه، تحتاج .NET (و Visual-Studio) إلى خوادم COM مع TLB. لكن خوادم COM Python ليس لها TLB. لذلك لاستخدام الخادم من .NET عن طريق (C # والتغليف المتأخر). يوضح التعليمات البرمجية التالية كيفية جعل هذا:

// رمز C #

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);

        }
    }
}   `

نصائح أخرى

الخط:

_reg_clsid_ = pythoncom.CreateGuid()

يخلق GUID جديد في كل مرة يسمى هذا الملف. يمكنك إنشاء GUID على سطر الأوامر:

C:\>python -c "import pythoncom; print pythoncom.CreateGuid()"
{C86B66C2-408E-46EA-845E-71626F94D965}

ثم قم بتغيير خطك:

_reg_clsid_ = "{C86B66C2-408E-46EA-845E-71626F94D965}"

بعد إجراء هذا التغيير، كنت قادرا على تشغيل التعليمات البرمجية واختبارها مع VBScript التالية:

Set obj = CreateObject("Python.TestServer")   
MsgBox obj.Hello("foo")

ليس لدي MSVC مفيد لمعرفة ما إذا كان هذا يعمل مشكلة "إضافة مرجع".

إذا كنت ترغب في استخدام مسجلة كوم كائن، تحتاج إلى العثور عليه في علامة تبويب COM في يضيف مرجعا صندوق المحادثة. أنت لا تنقل إلى DLL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top