2008-08-20 13 views

Antwort

2

Sicher..es ist ziemlich einfach. Hier ist eine lustige App, die ich zusammen geworfen habe. Ich nehme an, dass Sie Visual C++ haben.

Speichern test.cpp und kompilieren: cl.exe/EHsc test.cpp

Um mit OCX zu testen Sie benötigen entweder # Import der typelib und verwenden es ist CLSID (oder nur schwer Code der CLSID) im CoCreateInstance-Aufruf. Mit #import können Sie auch benutzerdefinierte Schnittstellen definieren, die Sie möglicherweise benötigen.

 
#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; 
} 
3

Ist ein OCX kein ActiveX-Benutzersteuerelement? (etwas, das Sie auf ein Formular setzen, mit dem der Benutzer interagieren kann)?

Der einfachste Weg, um COM/ActiveX-Zeug zu testen, ist die Verwendung von Excel. (Ja, ich weiß, es ist dumm klingt, mit mir tragen)

  1. Führen Sie Excel, um eine neue Datei erstellen, wenn es dies für Sie
  2. Press nicht getan hat Alt+F11 das Visual Basic-Editor zu starten (wenn Sie Excel haben 2007 ist es auf der 'Entwickler' Band Registerkarte Sache

Nun, da Sie in der glücklichen Visual Basic Land sind ...

  1. Vom Tools Menü wählen References
  2. Wählen Sie Ihr OCX/COM-Objekt aus der Liste oder klicken Sie auf , um die Datei zu finden, wenn sie nicht bei COM registriert ist. Sie können diesen Schritt möglicherweise überspringen, wenn Ihr OCX bereits registriert ist.
  3. Vom Insert Menü wählen UserForm
  4. Im Floating Toolbox Fenster mit der rechten Maustaste und wählen Sie Ihre OCX aus der Toolbox auf die Additional Controls
  5. Finden Sie Ihr OCX in der Liste und markieren es
  6. Sie dann ziehen userform
  7. Führen Sie es aus dem Run Menü aus.
  8. Testen Sie Ihr OCX und spielen Sie damit herum.

  9. SPEICHERN SIE DIE EXCEL-DATEI, damit Sie diese Schritte nicht jedes Mal wiederholen müssen.

+0

Es gibt fensterlose OCX-Module, für die diese Methode jedoch nicht funktioniert. –

1

@orion das ist so cool. Ich habe es nie so gedacht.

Gut @jschroedl das war in der Tat Spaß.

Testen eines ActiveX in der Konsole App macht Spaß. Aber ich denke, es lohnt sich, diesen Weg nicht zu versuchen. Sie können die Methoden aufrufen oder festlegen und die Eigenschaften entweder über die Art und Weise abrufen, wie @jschroedl dies erläutert hat, oder Sie können das IDIspatch-Objekt über die Invoke-Funktion aufrufen.

Der erste Schritt ist, GetIDsByName und rufen Sie die Funktion über Invoke und Parameter auf die Funktion sollte ein Array von VARIANTS in der Liste formale Formalparameter sein.

Alles ist gut und dandy. Aber sobald man zu den Veranstaltungen kommt, ist es bergab von dort. Windows-Anwendungen erfordern eine Nachrichtenpumpe, um Ereignisse auszulösen. Auf einer Konsole hast du keine. Ich ging den Weg, um einen EventNotifier für die Ereignisse zu implementieren, so wie Sie eine CallBack-Schnittstelle in klassischer C++ - Art implementieren. Aber die Ereignisse gelangen nicht zu Ihrer implementierten Schnittstelle.

Ich bin mir ziemlich sicher, dass dies nicht auf einer Konsolenanwendung durchgeführt werden kann. Aber ich hoffe wirklich, dass jemand da draußen eine andere Art von Ereignissen in einer Konsolenanwendung hat.

Verwandte Themen