The Shed is going Social! Join us on FaceBook and Twitter and chime in on the conversation.
|
 |
|
Dev Shed Forums
> Programming Languages
> C Programming
|
What is a (void**)?
Discuss What is a (void**)? in the C Programming forum on Dev Shed. What is a (void**)? C programming forum discussing all C derivatives, including C#, C++, Object-C, and even plain old vanilla C. These languages are low level languages, and used on projects such as device drivers, compilers, and even whole computer operating systems.
|
|
 |
|
|
|
|

Dev Shed Forums Sponsor:
|
|
|

March 22nd, 2002, 05:37 PM
|
|
Contributing User
|
|
Join Date: Jan 2002
Location: Seattle WA
Posts: 863
  
Time spent in forums: 22 sec
Reputation Power: 13
|
|
|
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?
|

March 23rd, 2002, 09:46 AM
|
 |
Big Endian
|
|
Join Date: May 2001
Location: Fly-over country
|
|
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
|

March 23rd, 2002, 09:52 AM
|
|
Contributing User
|
|
Join Date: Oct 2000
Location: Back in the real world.
|
|
|
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.
|

March 23rd, 2002, 04:04 PM
|
|
Contributing User
|
|
Join Date: Jan 2002
Location: Seattle WA
Posts: 863
  
Time spent in forums: 22 sec
Reputation Power: 13
|
|
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...
|

March 23rd, 2002, 07:44 PM
|
|
Contributing User
|
|
Join Date: Jan 2002
Location: Seattle WA
Posts: 863
  
Time spent in forums: 22 sec
Reputation Power: 13
|
|
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.
|

March 25th, 2002, 05:42 PM
|
 |
Banned ;)
|
|
Join Date: Nov 2001
Location: Woodland Hills, Los Angeles County, California, USA
|
|
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
|

March 26th, 2002, 01:38 AM
|
|
Contributing User
|
|
Join Date: Jan 2002
Location: Seattle WA
Posts: 863
  
Time spent in forums: 22 sec
Reputation Power: 13
|
|
|
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.
|
Developer Shed Advertisers and Affiliates
| Thread Tools |
Search this Thread |
|
|
|
| Display Modes |
Rate This Thread |
Linear Mode
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
|
|