سؤال

أحاول أتمتة عملية باستخدام كائن COM من Python (Win32COM) ، لكنني لا أحصل على النتائج المتوقعة ... هل هناك أداة لاستكشاف/اختبار كائنات COM دون الحاجة إلى كتابة برنامج معين؟ أعني ، هل هناك شيء يسمح لـ EG بتثبيت كائن COM واستدعاء أساليبه؟

(في الأساس أحاول معرفة ما إذا كانت نتائجي غير المتوقعة هي خطأ Win32Com ، وأرغب في تجنب تثبيت Visual Studio لكتابة تطبيق C#)

هل كانت مفيدة؟

المحلول 4

للسجل ، انتهى بي الأمر إلى كتابة نص صغير جدًا باستخدام Scite4autohotkey و Autohotkey com jackers, ، لا .NET مطلوب.
(ونتائجي غير المتوقعة لم تكن خطأ بيثون :))

نصائح أخرى

لقد كتبت بالفعل بديلًا لأداة SDK Oleview (AFAIK لا تدعم أساليب الاتصال فقط) التي تسمى OleviewDotnet غير المتصور. يمكنك الحصول على رمز المصدر هنا ولكن نظرًا لأنك تحتاج إلى تجميع ، فمن المحتمل أن يكون من الأسرع كتابة برنامج C# البسيط أو استخدام PowerShell.

ما تفعله هو كشف طرق Idispatch (وبعض الواجهات الأصلية) عبر واجهة المستخدم الرسومية حتى تتمكن من الاتصال بها وتوفر أيضًا نافذة نصية من IronPython. ستحتاج إلى العثور على كائن COM الخاص بك من خلال البحث ضمن "سجل -> clsid حسب الاسم" ، ابحث عن الإدخال (يمكن استخدام المرشح لتحديد جزءه بالاسم) انقر بزر الماوس الأيمن وحدد "إنشاء مثيل" يجب أن يظهر نافذة مشابه ل:

object information

ثم حدد قائمة "العمليات" في الأسفل واختر "Open Dispatch" للحصول على نافذة الطريقة/الخاصية.

enter image description here

هناك الكثير مما يمكنك فعله بهذا ولكن هذه نظرة عامة بسيطة.

إذا قمت بتنزيل Windows SDK عبر websetup ، يجب أن تكون قادرًا على اختيار تنزيل أدوات SDK فقط. وهي تشمل برنامجًا يسمى OLE/COM Viewer (Oleview.exe) يمكن استخدامه لتصفح جميع كائنات COM المسجلة ، والكائنات التي تدعم أتمتة OLE وفتحها واستدعاء الأساليب.

أنا أستكشف كائنات كوم في PowerShell. وجدت هذا عظيم وصفة, ، التي توفرها Jaap Brasser ، والتي من السهل تشغيلها والإجابة على سؤالي.

احصل على قائمة بجميع كائنات com المتاحة أرسلت بواسطة Jaap Brasser في 27 يونيو 2013

ملاحظة: تتطلب هذه النصيحة PowerShell 2.0 أو أعلى.

تم نشر سؤال مؤخرًا على منتديات PowerShell.com: كيفية الحصول على قائمة كاملة من comobjects المتاحة؟ ستوضح هذه النصيحة كيف جلب كل منهم من السجل.

فيما يلي الرمز الذي يمكننا استخدامه لإنشاء هذه القائمة:

Get-ChildItem HKLM:\Software\Classes -ErrorAction SilentlyContinue | Where-Object {
   $_.PSChildName -match '^\w+\.\w+$' -and (Test-Path -Path "$($_.PSPath)\CLSID")
} | Select-Object -ExpandProperty PSChildName

يقرأ CMDlet الأول قائمة كاملة من القيم من HKLM: Software Classes ثم يتحقق مما إذا كانت الشرطين التاليين صحيحة:

  • هل يتطابق الكائن مع اتفاقية التسمية للحصول على comobject؟
  • هل يحتوي مفتاح التسجيل على مجلد CLSID؟ يجب أن يكون لكل comObject المسجل CLSID كمعرف فريد. مثال على الإخراج الناتج عن هذا الأمر هو كما يلي:

    AccclientDocmgr.AccclientDocmgr
    accdictionary.Accdictionary
    Access.Accdaextension
    Access.ACCDCFILE
    Access.accdefile
    Access.Accdtfile
    Access.accftfile
    Access.adefile

لجعل عملية اكتشاف comObject أسهل يمكن استخدام الوظيفة التالية.

function Get-ComObject {

    param(
        [Parameter(Mandatory=$true,
        ParameterSetName='FilterByName')]
        [string]$Filter,

        [Parameter(Mandatory=$true,
        ParameterSetName='ListAllComObjects')]
        [switch]$ListAll
    )

    $ListofObjects = Get-ChildItem HKLM:\Software\Classes -ErrorAction SilentlyContinue | Where-Object {
        $_.PSChildName -match '^\w+\.\w+$' -and (Test-Path -Path "$($_.PSPath)\CLSID")
    } | Select-Object -ExpandProperty PSChildName

    if ($Filter) {
        $ListofObjects | Where-Object {$_ -like $Filter}
    } else {
        $ListofObjects
    }
}

هذه الوظيفة متوفرة في معرض Technet Script:

http://gallery.technet.microsoft.com/get-comobject-function-to-50a92047

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