|
|
|||||||||
|
|||||||||
| |||||||||
|
|
|
| |||||||||
![]() |
|
|
«
Previous Thread
|
Next Thread
»
|
Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
|
|
Stay one step ahead of the competition. Evaluate and give feedback
on some of the hottest web development tools on the market today.
Make your opinion heard! Click
Here
|
|
#1
|
|||
|
|||
|
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
|
||||
|
||||
|
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/project...n/IUnknown.html |
|
#3
|
|||
|
|||
|
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.
__________________
-- Manuel Hirsch - Linux, FreeBSD, programming, administration articles, tutorials and more. |
|
#4
|
|||
|
|||
|
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... . 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... |
|
#5
|
|||
|
|||
|
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. |
|
#6
|
||||
|
||||
|
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 |
|
#7
|
|||
|
|||
|
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. |
![]() |
| Viewing: Dev Shed Forums > Programming Languages > C Programming > What is a (void**)? |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|
|
|
|