ActiveX



  • ok gibts zu ATL ein Tutorial oder irgendwas, was kein Geld kostet images/smiles/icon_wink.gif

    naja und was Com angeht: naja also ein paar grobe grundlagen kenn ich ja... (ich hab mal ein DX ANGEFANGEN... naja da stand ein bischen was)

    aber das mit ATL hört sich seeeeeehr interessant an... images/smiles/icon_biggrin.gif
    hast du ein BSP? (ich glaube damit werde ich schon zurecjt kommen)

    Ein Großes Problem in Bezug auf Active und ATL und dergleichen is, das in der MSDN eigendlich nur sachen zu MFC beschrieben sind images/smiles/icon_sad.gif und nix von WinAPI... images/smiles/icon_sad.gif
    thx

    > Endy <<

    @King: *jipi* endlich antwortet jemand *juhu*froi*



  • Tja, Tutorials zum Thema kenn ich leider nicht. Ich hab hier das Buch Inside ATL von MSPRESS, damit bin ich eigentlich ganz zufrieden.

    Ein Beispiel hab ich mal zusammengestellt. Es lädt Dir ganz einfach ein .pdf und zeigt es Dir an (wenn die Datei gefunden wird, versteht sich). Hoffentlich nimmt mir keiner übel, daß ich hier sowas langes poste.

    #include <windows.h>
    #include <tchar.h>
    
    // link in AltAxWinInit() & containment code statically
    // this require a instance (_Module) of CComModule
    #include <atlbase.h>
    
    CComModule _Module;
    
    #include <atlcom.h>
    #include <atlhost.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    static const OLECHAR* pszFileName = OLESTR("d:\\acrobat.pdf");
    static const LPTSTR   pszAppName  = TEXT("AcrobatReaderTest");
    
    int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow)
    {
      WNDCLASSEX wc;
      HWND       hWnd;
      MSG        msg;
    
        // ATL initialisieren
        _Module.Init(NULL, hInstance);
        AtlAxWinInit();
    
        wc.cbSize        = sizeof(wc);
        wc.style         = 0;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1);
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = pszAppName;
        wc.hIconSm       = wc.hIcon;
    
        RegisterClassEx(&wc);
    
        hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, wc.lpszClassName,
                              wc.lpszClassName, WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    
        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
    
        while(GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage (&msg);
        }
    
        // ATL deinitialisieren
        AtlAxWinTerm();
        _Module.Term();
    
      return(msg.wParam);
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
      PAINTSTRUCT ps;
      OLECHAR     szCLSID[64];
      CLSID       clsid;
      HWND        hWndPdf;
    
        switch(uMsg)
        {
            case WM_CREATE:
                 StringFromGUID2(clsid, szCLSID, 64);
                 hWndPdf = CreateWindowEx(0, TEXT("AtlAxWin"),
                                    TEXT("{CA8A9780-280D-11CF-A24D-444553540000}"),
                                    WS_CHILD | WS_VISIBLE, 0, 0, 0,
                                    0, hWnd, NULL, 
                                    ((CREATESTRUCT*)lParam)->hInstance, NULL);
    
                 if(IsWindow(hWndPdf))
                 {
                     IUnknown* pUnk = NULL;
                     AtlAxGetControl(hWndPdf, &pUnk);
    
                     BSTR bstrFile = SysAllocString(pszFileName);
    
                     VARIANTARG var;
                     VariantInit(&var);
                     var.vt      = VT_BSTR;
                     var.bstrVal = bstrFile;
    
                     CComDispatchDriver pDisp(pUnk);
                     pDisp.PutPropertyByName(OLESTR("src"), &var);
    
                     VariantClear(&var);
                     pUnk->Release();
                 }
                 return(0);
            case WM_PAINT:
                 BeginPaint(hWnd, &ps);
                 EndPaint(hWnd, &ps);
                 return(0);
            case WM_ERASEBKGND:
                 return(1);
            case WM_SIZE:
                 if(NULL != (hWndPdf = GetWindow(hWnd, GW_CHILD)))             
                     MoveWindow(hWndPdf, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
                 return(0);
            case WM_CLOSE:
                 DestroyWindow(hWnd);
                 return(0);
            case WM_NCDESTROY:     
                 PostQuitMessage(0);
                 return(0);
        }
      return(DefWindowProc(hWnd, uMsg, wParam, lParam));
    }
    

    [ Dieser Beitrag wurde am 08.01.2002 um 21:29 Uhr von CMatt editiert. ]



  • neeeeeeein das nimmt dir keine übel!!! images/smiles/icon_biggrin.gif
    cool images/smiles/icon_biggrin.gif
    ich muss aber nehme ich an ein ATL-Projekt erstellen oder?
    jajaja... genau sowas hab ich gesucht
    thx thx thx
    King: du bist der King!!!
    *jipi* images/smiles/icon_smile.gif images/smiles/icon_smile.gif images/smiles/icon_biggrin.gif images/smiles/icon_biggrin.gif images/smiles/icon_smile.gif images/smiles/icon_smile.gif
    *strahl*
    ciaoy

    > Endy <<



  • Also ich hab das ganze mal compiliert(er funzt natürlich auch... obwohl das längst nich selbstverständlich is: ich bin schon auf Codes gestoßen, die nich gefunzt haben!) und mir den code genauer angeschaut... bin auf zwei dinge gestoßen:

    case WM_CREATE:
            StringFromGUID2(clsid, szCLSID, 64);
    

    da hab ich mir gefragt wie du die GUID in nen string convertieren kannst, wenn beide vars doch noch NULL sind?
    und welchen sinn hat die zeile eigendlich? du übergibst die GUID doch bei CreateWindowEx sowieso direkt als string????

    VARIANTARG var;
    VariantInit(&var);
    var.vt = VT_BSTR;
    var.bstrVal = bstrFile;
    
    CComDispatchDriver pDisp(pUnk);
    pDisp.PutPropertyByName(OLESTR("src"), &var);
    
    VariantClear(&var);
    

    Naja ich weiß, was die Zeilen machen(also die pdf datei laden)
    aber wie kommst du darauf?
    bzw. Ich versteh es so(mit hilfe der MSDN) das du das properitiy src neu setzt aber woher weiß ich, welche properities ein Control hat bzw. WIE ich die zu setzen hab... du benutzt:
    var.vt = VT_BSTR;
    var.bstrVal = bstrFile;
    (wie du auf den Variablentyp kommst und was VariantInit macht is mir ja klar)
    Kann man das irgendwo nachlesen?

    Man hat mir gesagt das jedes ActiveX element anders bedient wird...
    ok... aber woher weiß man dann wie?
    thx
    ciaoy

    > Endy <<

    PS: *jipi* und nochmal thx thx thx!!!!



    case WM_CREATE:
            StringFromGUID2(clsid, szCLSID, 64);
    

    Das ist natürlich Blödsinn. Eigentlich wollte ich beim Zusammenstellen des Samples ganz was anderes machen. Diese Zeile ist als Leiche geblieben und völlig sinnlos.

    du übergibst die GUID doch bei CreateWindowEx sowieso direkt als string????

    Eben.

    VARIANTARG var;
    VariantInit(&var);
    var.vt = VT_BSTR;
    var.bstrVal = bstrFile;
    
    CComDispatchDriver pDisp(pUnk);
    pDisp.PutPropertyByName(OLESTR("src"), &var);
    
    VariantClear(&var);
    

    Den Namen der Eigenschaft habe ich aus der TypeLib (mit der OLE-Ansicht auf File/ViewTypeLib und dann auf das .ocx).

    Man hat mir gesagt das jedes ActiveX element anders bedient wird...
    ok... aber woher weiß man dann wie?

    Da mußt Du dann halt in die Doku zum Control schauen. Allerdings bieten die Controls auch einen Standard-Satz an Eigenschaften. Schau mal in der MSDN nach:

    MSDN Library - July 2001
    -> Platform SDK Documentation
    -> Component Services
    -> COM
    -> Controls and Property Pages
    -> Guide
    -> ActiveX Controls
    -> Properties and Methods
    -> Control Properties
    -> Standard Properties

    Übrigens: Ein ATL-Project brauchst Du auch nicht zu erstellen. Ich habe auch nur eine 'Leere Win32-Anwendung' erstellt. Das mußt Du nur dann, wenn Du den Wizzard benutzen willst.



  • Übrigens: Ein ATL-Project brauchst Du auch nicht zu erstellen. Ich
    habe auch nur eine 'Leere Win32-Anwendung' erstellt. Das mußt Du nur
    dann, wenn Du den Wizzard benutzen willst.
    Ja ich habs auch gemerkt images/smiles/icon_wink.gif

    Tja, Tutorials zum Thema kenn ich leider nicht
    das wird sich bald ändern images/smiles/icon_wink.gif Denn sowas wichtiges: da muss es auch ein Tutorial zu geben!!! Sobald ich da einigermaßen den überblick hab... ne... sobald sich mein wissen etwas gesetzt hat und ich ein bischen übung darin hab wird zu meinem Tut ergänzt...

    ach ja: kann ich dein Beipsiel vieleicht mit einbauen?
    (als Codebeispiel halt)
    Ich finde es nämlich recht einfach aufgebaut...
    Überhaupt diese Post hier war mehr als Informatif, denn eigendlich ist alles gesagt was zu sagen ist, damit man sich das selber beibringen kann(naja gut ich wusste ja auch grob schon über die interfaces bescheid aber das ist meiner meinung nach eh recht einfach.) Danke!!!
    ciaoy

    > Endy <<



  • mist...
    eine Frage hab ich doch noch: Wie kann ich die Methods der Elemente benutzen... z.b. bei deinem PDF-element gibts ne funktion:
    setZoom(int perzent);
    ...
    wie komm ich da ran?
    thx

    > Endy <<

    PS: hoffentlich is das jetze endlich die letze frage... *G*



  • Original erstellt von Endy:
    **mist...
    eine Frage hab ich doch noch: Wie kann ich die Methods der Elemente benutzen... z.b. bei deinem PDF-element gibts ne funktion:
    setZoom(int perzent);
    **

    Methoden rufst Du mit InvokeX() auf. Da die Methode einen Parameter übernimmt, nimmst Du Invoke1(). Da der Datentyp Integer bei VB 16 Bit breit ist, nehme ich hier VT_I2:

    VARIANTARG varZoom;
      VariantInit(&varZoom);
      varZoom.vt    = VT_I2;
      varZoom.iVal  = 150;
      pDisp.Invoke1(OLESTR("setZoom"), &varZoom);
      VariantClear(&varZoom);
    

    Ganz einfach, gell?



  • d.h. wenn ich ne funktion mit 2 parametern hab mach ich das so:

    pDisp.Invoke2(OLESTR("funktionsname"), &var1, var2);

    ok thx images/smiles/icon_wink.gif
    ciao

    > Endy <<



  • Genau so! Und wenn Du keine Parameter übergibst, nimmst Du Invoke0(). Wenn Du aber mehr als zwei Parameter übergeben willst, mußt Du InvokeN() verwenden. InvokeN() kann die anderen Methoden dann natürlich auch ersetzen. Schau einfach mal in atlcom.h, das siehst Du die Klasse CComDispatchDriver und auch gleich die Implementation. Da kannst Du bestimmt noch einiges an Informationen bekommen.

    Bis dann also!



  • hmm... ok
    d.h. bei 4 parametern:
    InvokeN(OLESTR("funktion"), param1,param2,param3,param4);

    ach ja und bei VARIANTARG ... gibts da nen text, was vt sein muss, für welche variable, die ich übergeben will und wie heist bei anderen variablen der parameter? also du hattest in den bsps einmal bstrVal und einmal iVal ??? ungarische notation? also für long: lVal?

    sag mal kannst du mir ne mail schreiben, fals ich noch fragen hab?
    Endye@gmx.de

    [ 09.10.2001: Beitrag editiert von: Endy ]



  • [ 09.10.2001: Beitrag editiert von: Endy ]


Anmelden zum Antworten