سؤال

أريد اختبار ocx بسرعة.كيف يمكنني إسقاط ocx في تطبيق وحدة التحكم.لقد وجدت بعض البرامج التعليمية في CodeProject ولكنها غير مكتملة.

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

المحلول

بالتأكيد .. الأمر سهل جدًا.إليك تطبيقًا ممتعًا جمعته معًا.أفترض أن لديك Visual C++.

احفظه في test.cpp وقم بتجميعه:cl.exe /EHsc test.cpp

للاختبار باستخدام OCX، ستحتاج إما إلى #import typelib واستخدام CLSID الخاص به (أو فقط ترميز CLSID) في استدعاء CoCreateInstance.سيساعد استخدام #import أيضًا في تحديد أي واجهات مخصصة قد تحتاجها.

#include "windows.h"
#include "shobjidl.h"
#include "atlbase.h"

//
// compile with:  cl /EHsc test.cpp
//

// A fun little program to demonstrate creating an OCX.
// (CLSID_TaskbarList in this case)
//

BOOL CALLBACK RemoveFromTaskbarProc( HWND hwnd, LPARAM lParam )
{
    ITaskbarList* ptbl = (ITaskbarList*)lParam;
    ptbl->DeleteTab(hwnd);  
    return TRUE;
}

void HideTaskWindows(ITaskbarList* ptbl)
{
    EnumWindows( RemoveFromTaskbarProc, (LPARAM) ptbl);
}

// ============

BOOL CALLBACK AddToTaskbarProc( HWND hwnd, LPARAM lParam )
{
    ITaskbarList* ptbl = (ITaskbarList*)lParam;
    ptbl->AddTab(hwnd); 

    return TRUE;// continue enumerating
}

void ShowTaskWindows(ITaskbarList* ptbl)
{
    if (!EnumWindows( AddToTaskbarProc, (LPARAM) ptbl))
        throw "Unable to enum windows in ShowTaskWindows";
}

// ============

int main(int, char**)
{
    CoInitialize(0);

    try {
        CComPtr<IUnknown> pUnk;

        if (FAILED(CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**) &pUnk)))
            throw "Unabled to create CLSID_TaskbarList";


        // Do something with the object...

        CComQIPtr<ITaskbarList> ptbl = pUnk;
        if (ptbl)
            ptbl->HrInit();

        HideTaskWindows(ptbl);
        MessageBox( GetDesktopWindow(), _T("Check out the task bar!"), _T("StackOverflow FTW"), MB_OK);
        ShowTaskWindows(ptbl);
    }
    catch( TCHAR * msg ) {
        MessageBox( GetDesktopWindow(), msg, _T("Error"), MB_OK);
    }       

    CoUninitialize();

    return 0;
}

نصائح أخرى

أليس OCX هو عنصر تحكم مستخدم ActiveX؟(شيء تضعه في نموذج ليتفاعل معه المستخدم)؟

أسهل طريقة أعرفها لاختبار عناصر COM/ActiveX هي استخدام برنامج Excel.(نعم أعلم أن الأمر يبدو غبيًا، تحملني)

  1. قم بتشغيل Excel، وقم بإنشاء ملف جديد إذا لم يقم بذلك نيابةً عنك
  2. يضعط Alt+F11 لتشغيل محرر Visual Basic (إذا كان لديك Excel 2007، فهو موجود في علامة تبويب الشريط "المطور"

الآن بعد أن أصبحت في أرض Visual Basic السعيدة...

  1. من Tools القائمة، حدد References
  2. حدد كائن OCX/COM من القائمة، أو انقر فوقه Browse... للعثور على الملف إذا لم يكن مسجلاً لدى COM - قد تتمكن من تخطي هذه الخطوة إذا كان OCX الخاص بك مسجلاً بالفعل.
  3. من Insert القائمة، حدد UserForm
  4. في العائمة Toolbox النافذة، انقر بزر الماوس الأيمن واختر Additional Controls
  5. ابحث عن OCX الخاص بك في القائمة وقم بوضع علامة عليه
  6. يمكنك بعد ذلك سحب OCX الخاص بك من مربع الأدوات إلى نموذج المستخدم
  7. من Run القائمة، تشغيله.
  8. اختبر OCX الخاص بك والعب به.

  9. احفظ ملف EXCEL حتى لا تضطر إلى تكرار هذه الخطوات في كل مرة.

@orion هذا رائع جدًا.لم افكر بها ابدا بهذه الطريقة.

حسنًا @jschroedl كان ذلك ممتعًا بالفعل.

يعد اختبار activex في تطبيق وحدة التحكم أمرًا ممتعًا.لكنني أعتقد أن الأمر يستحق عدم محاولة السير في هذا الطريق.يمكنك استدعاء الأساليب أو تعيين الخصائص والحصول عليها إما من خلال الطريقة التي أوضحها @jschroedl أو يمكنك استدعاء كائن IDIspatch من خلال وظيفة الاستدعاء.

الخطوة الأولى هي GetIDsByName واستدعاء الدالة من خلال الاستدعاء ويجب أن تكون معلمات الدالة عبارة عن صفيف من المتغيرات في قائمة المعلمات الرسمية لاستدعاء.

كل شيء على ما يرام ومدهش.ولكن بمجرد وصولك إلى الأحداث، ستجدها تنحدر من هناك.يتطلب تطبيق Windows مضخة رسائل لإطلاق الأحداث.على وحدة التحكم ليس لديك واحدة.لقد سلكت الطريق لتنفيذ EventNotifier للأحداث تمامًا مثلما تقوم بتنفيذ واجهة CallBack بطريقة C++ الكلاسيكية.لكن الأحداث لا تصل إلى الواجهة المنفذة.

أنا متأكد تمامًا من أنه لا يمكن القيام بذلك على تطبيق وحدة التحكم.لكنني آمل حقًا أن يكون لدى شخص ما رأي مختلف في الأحداث في تطبيق وحدة التحكم

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