#1
  1. No Profile Picture
    Contributing User
    Devshed Novice (500 - 999 posts)

    Join Date
    Jan 2002
    Location
    Seattle WA
    Posts
    863
    Rep Power
    14

    What is a (void**)?


    The title says pretty much everything I want to know. I'm trying to wrap my brain around COM, and I've never seen a cast like (void**) before. It appears in the QueryInterface method of COM objects:

    HRESULT QueryInterface( REFIID iid, void** ppvObject );

    I know what a void pointer is, I guess I'm just confused with the ** part. Is it just a pointer to a pointer?
  2. #2
  3. Big Endian
    Devshed Beginner (1000 - 1499 posts)

    Join Date
    May 2001
    Location
    Fly-over country
    Posts
    1,172
    Rep Power
    30
    I don't know anything about this type of programming but I believe you are correct when you say it is a pointer to a pointer. The following link states:

    ppvObject - An [out] pointer to the interface pointer identified by iid.

    http://www.isd.mel.nist.gov/projects.../IUnknown.html
  4. #3
  5. No Profile Picture
    Contributing User
    Devshed God 1st Plane (5500 - 5999 posts)

    Join Date
    Oct 2000
    Location
    Back in the real world.
    Posts
    5,966
    Rep Power
    190
    imagine a list of strings that you want to pass to a function.

    each string is a char*, a list is passed via its address, so the "list of strings" is a char**

    the void** is just more general.
  6. #4
  7. No Profile Picture
    Contributing User
    Devshed Novice (500 - 999 posts)

    Join Date
    Jan 2002
    Location
    Seattle WA
    Posts
    863
    Rep Power
    14
    Thanks. Its good to be able to confirm things. I hate "going on faith," for things like this, because eventually, assuming things catches up with you-- especially if your assumption was wrong.

    Now if I could just figure out how to use these darn COM interfaces... :confused:. I didn't want to learn the COM, but the project I've started pretty much demands it if I'm gonna see it to completion. I guess I'm off to the bookstore this weekend.

    It was supposed to be one of those 'simple' project. *cough* The amount of times I've heard that...
  8. #5
  9. No Profile Picture
    Contributing User
    Devshed Novice (500 - 999 posts)

    Join Date
    Jan 2002
    Location
    Seattle WA
    Posts
    863
    Rep Power
    14
    Ok, I'm out of ideas I guess. I'm hoping someone can offer some advice. Its a pretty specific problem. I have a view derived from CHTMLView. Its pretty basic, I use a template to put an 'empty' (html) document in the view, then I'm supposed to browse the DOM and populate/retrieve the form elements with data from the actual application's document (ie: the doc data from the doc/view architecture).

    Here's the catch though, I'm able to browse the dom, but I can't for the life of me figure out how to access/modify any of its attributes. Here's what I got so far.

    Code:
    // Get the document's IDispatch pointer.
    IDispatch* pHtmlDoc = GetHtmlDocument();
    
    // Obtain a pointer to the IHTMLDocument2 interface.
    IHTMLDocument2* pIDocument = NULL;
    HRESULT hr;
    hr = pHtmlDoc->QueryInterface(IID_IHTMLDocument2, (void**) &pIDocument);
    if (SUCCEEDED(hr))
    {
    
        // Obtain a pointer to the HTMLElements interface.
        IHTMLElementCollection* pIElements = NULL;
        hr = pIDocument->get_all(&pIElements);
        if (SUCCEEDED(hr))
        {
    
            // Obtain a pointer to all the Input elements from the collection
            IHTMLElementCollection* pInputs = NULL;
            hr = pIElements->tags(_variant_t("input"), (IDispatch**) &pInputs);
            if (SUCCEEDED(hr))
            {
    
                // For now, try to get element 0.
                // Eventually will need to try to iterate over all elements.
                IHTMLInputTextElement* pIThisElement = NULL;
                hr = pInputs->item(_variant_t((long) 0), _variant_t((long) 0),
                    (IDispatch**) &pIThisElement);
                if (SUCCEEDED(hr))
                {
    
                    // How do I get element name/value?
                    pIThisElement->Release();
                }
                else
                    ErrorMessage(_T("Failed at pIThisElement"));
            
                pInputs->Release();
            }
            else
                ErrorMessage(_T("Failed at pInputs"));
    
            pIElements->Release();
        }
        else
            ErrorMessage(_T("Failed at pIForms"));
    
        pIDocument->Release();
    }
    else
        ErrorMessage(_T("Failed at pIDocument"));
    
    pHtmlDoc->Release();
    The ErrorMessage() function is just a little shortcut to a message box to tell me exactly where the browsing failed.

    How do I use the pIThisElement interface to edit (if the app is in a load procedure), or read (if the app is in a save procedure)? I can't seem to figure out the pIThisElement->get_value() or similar functions.
  10. #6
  11. Banned ;)
    Devshed Supreme Being (6500+ posts)

    Join Date
    Nov 2001
    Location
    Woodland Hills, Los Angeles County, California, USA
    Posts
    9,616
    Rep Power
    4247
    Have you tried this:

    Code:
    CComBSTR bstr;
    
    ...
    ....
    pIThisElement->get_name(&bstr); // To get the name
    CString strTag = bstr;
    
    pIThisElement->get_value(&bstr); // To get the value
    pIThisElement->set_value(bstr); // To set the value
  12. #7
  13. No Profile Picture
    Contributing User
    Devshed Novice (500 - 999 posts)

    Join Date
    Jan 2002
    Location
    Seattle WA
    Posts
    863
    Rep Power
    14
    Unfortunately, yes. I get an assertion error.


    File: i386\chkesp.c
    Line: 42

    The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.


    Funny thing is, I get this error even if I pass a plain old &BSTR to the get/put functions. Its got me stumped.

IMN logo majestic logo threadwatch logo seochat tools logo