Frage

Ich will schnell zu testen, ist ein ocx.Wie kann ich drop das ocx in einer Konsolenanwendung.Ich habe einige tutorials in CodeProject und aber unvollständig sind.

War es hilfreich?

Lösung

Sicher..es ist ziemlich einfach.Hier ist ein Spaß-app, die ich warf zusammen.Ich gehe davon aus, dass Sie Visual C++.

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

Testen Sie mit Ihrem OCX, die Sie benötigen, um entweder #importieren der Typbibliothek und verwenden Sie die CLSID (oder nur schwer-code der CLSID) in der CoCreateInstance-rufen.Verwendung von #import wird auch helfen, definieren von benutzerdefinierten Schnittstellen, die Sie 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;
}

Andere Tipps

Ist das nicht eine OCX ActiveX-Steuerelement?(etwas, das Sie auf ein Formular, mit dem Benutzer zu interagieren)?

Der einfachste Weg den ich kenne um zu testen, COM/ActiveX Sachen ist die Verwendung von excel.(Ja, ich weiß, es klingt dumm, mit mir tragen)

  1. Excel ausführen, erstellen Sie eine neue Datei, wenn es noch nicht erledigt dies für Sie
  2. Drücken Sie Alt+F11 starten Sie den Visual Basic-Editor (wenn Sie excel 2007 ist es auf der 'Developer' Registerkarte des Menübands Sache

Jetzt, dass Sie sind glücklich visual basic land...

  1. Aus der Tools Menü References
  2. Wählen Sie Ihre OCX - /COM-Objekt aus der Liste aus, oder klicken Sie auf Browse... um die Datei zu suchen, wenn es nicht registriert COM - Sie können diesen Schritt überspringen, wenn Ihre OCX ist bereits registriert.
  3. Aus der Insert Menü UserForm
  4. In der Schwebe Toolbox - Fenster mit der rechten Maustaste und wählen Sie Additional Controls
  5. Finden Sie Ihre OCX-in der Liste aus und setzen Sie ein Häkchen
  6. Sie können dann ziehen Sie Ihre OCX aus der toolbox auf der userform
  7. Aus der Run Menü, führen Sie es aus.
  8. Testen Sie Ihre OCX-und spielen, um mit es.

  9. SPEICHERN Sie DIE EXCEL-DATEI, so dass Sie nicht haben, wiederholen Sie diese Schritte jedes mal.

@orion das ist so cool.Nie gedacht, es auf diese Weise.

Gut @jschroedl das war lustig, in der Tat.

Testen der activex-in-Konsole app ist Spaß.Aber ich denke, es lohnt sich nicht, die versuchen auf diesem Weg.Sie können Methoden aufrufen, oder Satz und erhalten die Eigenschaften durch die Art und Weise @jschroedl erklärt hatte, oder Sie können rufen Sie die IDIspatch-Objekt durch Aufrufen der Funktion.

Der erste Schritt ist GetIDsByName und rufen Sie die Funktion durch Aufrufen und Parameter an die Funktion soll ein array von VARIANTEN in der Invoke-formale parameter Liste.

Alles ist in Ordnung und dandy.Aber sobald man sich an die Ereignisse seiner Abfahrt von dort.Windows-Anwendung erfordert eine Nachricht Pumpe, um Ereignisse auszulösen.Auf einer Konsole, die Sie nicht haben.Ich ging den Weg hinunter zu implementieren EventNotifier für events, die genauso wie implementieren Sie eine CallBack-Schnittstelle im klassischen C++ - Weg.Aber die Ereignisse nicht erhalten, um Ihre Schnittstelle implementiert.

Ich bin mir ziemlich sicher, dass dies nicht getan werden, auf einer Konsole-Anwendung.Aber ich hoffe wirklich jemand gibt, haben eine andere Sicht auf die Ereignisse in einer Konsolenanwendung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top