|
|
I am working on an application that needs to be able to archive data to CDR with the minimum of operator intervention (ideally just put in the disc).
It will run on XP and I want to use the IMAPI interface. That doesn't seem to be too difficult except that there's an AddData function that needs an IStorage pointer.
I need a pointer ( ) to how to get an IStorage filled with chosen directories and files from hard disc. I thought there must be an easy way but I can't find any documentation anywhere.
Please can someone tell me at least where to look?
Thanks.
The opinions expressed in this communication do not necessarily represent those of the author (especially if you find them impolite, discourteous or inflammatory).
|
|
|
|
|
Phil J Pearson wrote:
Please can someone tell me at least where to look?
MSDN[^].
HRESULT hr;
IStorage *pIst = NULL;
hr = pIst->CreateStorage(L"SomeName", STGM_READWRITE|
STGM_SHARE_EXCLUSIVE|STGM_CREATE,
0, 0, &pIst);
if(SUCCEEDED(hr))
{
}
- Nick Parker My Blog | My Articles
|
|
|
|
|
Thanks, but I know how to create a storage. The question is how to fill it with a set of directories and files.
The opinions expressed in this communication do not necessarily represent those of the author (especially if you find them impolite, discourteous or inflammatory).
|
|
|
|
|
Sorry Phil, it appears that the StgCreatePropSetStg Sample[^] example might be helpful in using a IPropertyStorage to invoke the WriteMultiple function which uses a IStorage object to tie them together. HTH.
- Nick Parker My Blog | My Articles
|
|
|
|
|
I know this View is derived from typical MFC classes like CFormView, etc...but does it also then inherit from IWebBrowser2 somehow?
Is it even possible to derive a class like CHtmlView from Interfaces...?
The reason I ask is...I wish to derive a single class from multiple interfaces (namely IWebBrowser2, IDocHostUIHandler, IHTMLEditDesigner and so on).
Can I do this? Every article I have read addresses each interface seperately and usually derive the interface from a new class...
I would like to preferably derive CHtmlView from each of these interfaces as well...
By default I have noticed CHtmlView allows you to call Navigate() and so on which are functions of IWebBrowser2 so I imagine it's already derived from IWebBrowser2???
If you could fill me in a little I would appreciate any help...
Thanks
How do I print my voice mail?
|
|
|
|
|
I took a look at the class definition. The class creates an instance of the WebBrowser and then does a QueryInterface() through that instance to get the IWebBrowser2 interface which is wrapped in a CComPtr<IWebBrowser2> m_pBrowserApp; member. It's safe to keep that interface pointer around - it ain't going to change unless the WebBrowser itself is closed. You can get all the other interfaces from that one (either directly or indirectly).
I'd suggest not trying to do multiple inheritance. Use the m_pBrowser member to QueryInterface() to get the IHTMLDocument2 interface and go from there (edit - or just call GetHTMLDocument ). Don't forget that the document can change if you do a navigate so caching that interface pointer could cause problems.
Rob Manderson
Colin Davies wrote: I'm sure Americans could use more of it, and thus reduce the world supply faster. This of course would be good, because the faster we run out globally, the less chance of pollution there will be. (Talking about the price of petrol) The Soapbox, March 5 2004
|
|
|
|
|
My biggest concern is handling the events from the IHTMLEditDesigner interface...i'm not sure yet how I should handle that...an event sink I think?
Thanks
How do I print my voice mail?
|
|
|
|
|
The IHTMLEditDesigner doesn't fire events in that sense. It's just an interface with 4 methods (in addition to the standard IUnknown methods). Each of the 4 methods gets called directly by MSHTML - no event sink needed. Think of em as being CALLBACK s implemented in a COM object.
I've been doing some work just this week with IHTMLEditDesigner s - maybe I'll write an article about em
Rob Manderson
Colin Davies wrote: I'm sure Americans could use more of it, and thus reduce the world supply faster. This of course would be good, because the faster we run out globally, the less chance of pollution there will be. (Talking about the price of petrol) The Soapbox, March 5 2004
|
|
|
|
|
Rob Manderson wrote:
I've been doing some work just this week with IHTMLEditDesigners - maybe I'll write an article about em
I most certainly think you should
I have read up a little more and I think I understand more about how COM and interfaces work, but the problem I face now is (Takeing the CHtmlView as an example but using a CView) When I embed a IWebBrowser2, IHTMLDocument2 inside my CView class everything works fine...however when I attempt to embed a IHTMLEditDesigner I get a compile error:
error C2143: syntax error : missing ';' before '*'
error C2501: 'IHTMLEditDesigner' : missing storage-class or type specifiers
error C2501: 'm_pDesigner' : missing storage-class or type specifiers
Any idea why this would be happening?
I am using Visual C++ 6 and I have downloaded the IE55 Sdk and windows core sdk and included them inside my Tools->Options->Directories???
I can't figure out the steps required to allow me to even start playing with interfaces...other then IWebBrowser2???
Thanks again
Cheers
How do I print my voice mail?
|
|
|
|
|
It looks very much like you're not including the header that defines the IHTMLEditDesigner interface. It's in mshtmlc.h . But don't forget that you need to derive your own class from IHTMLEditDesigner . Mine looks like this:
class CMSHTMLDisableDragHTMLEditDesigner : public IHTMLEditDesigner
{
public:
virtual HRESULT STDMETHODCALLTYPE
QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
virtual ULONG STDMETHODCALLTYPE
AddRef(void);
virtual ULONG STDMETHODCALLTYPE
Release(void);
virtual HRESULT STDMETHODCALLTYPE
PreHandleEvent(DISPID inEvtDispId, IHTMLEventObj *pIEventObj);
virtual HRESULT STDMETHODCALLTYPE
PostHandleEvent(DISPID inEvtDispId, IHTMLEventObj *pIEventObj);
virtual HRESULT STDMETHODCALLTYPE
TranslateAccelerator(DISPID inEvtDispId, IHTMLEventObj *pIEventObj);
virtual HRESULT STDMETHODCALLTYPE
PostEditorEventNotify(DISPID inEvtDispId, IHTMLEventObj *pIEventObj);
CMSHTMLDisableDragHTMLEditDesigner();
BOOL Attach(IHTMLDocument2 *pDoc);
void Detach();
private:
IHTMLEditServices *m_pServices;
UINT m_uRefCount;
CMSHTMLDisableDragIDispatch m_dp;
};
And with appropriate code in each of the members.
Rob Manderson
Colin Davies wrote: I'm sure Americans could use more of it, and thus reduce the world supply faster. This of course would be good, because the faster we run out globally, the less chance of pollution there will be. (Talking about the price of petrol) The Soapbox, March 5 2004
|
|
|
|
|
Hi Rob, It was being caused by improper inclusion. I jumped the gun while reading the article and didn't bother to read the fine print when adding the includes directories...
I'm really good at that
I have another quick question if don't mind...
I have that CView which has an embedded IWebBrowser2 (copying CHtmlView) and I would like to embed a IHTMLEditDesign as well.
Can I not use a BEGIN_EVENTSINK_MAP approach like CHtmlView does to just wrap IWebBrowser2 events but for IHTMLEditDesign as well...?
Thanks again
How do I print my voice mail?
|
|
|
|
|
Hockey wrote:
Can I not use a BEGIN_EVENTSINK_MAP approach like CHtmlView does to just wrap IWebBrowser2 events but for IHTMLEditDesign as well...?
Nope. I did it like this.
My view class has an embedded variable of type CMSHTMLDisableDragHTMLEditDesigner (see previous reply) called m_designer . In the OnDocumentComplete() handler for the view I do this.
.
.
.
CHtmlEditView::OnDocumentComplete(lpszURL);
m_pDoc = (IHTMLDocument2 *) GetHtmlDocument();
m_designer.Detach();
m_designer.Attach(m_pDoc);
.
.
.
The Attach() looks like this.
BOOL CMSHTMLDisableDragHTMLEditDesigner::Attach(IHTMLDocument2 *pDoc)
{
if (m_pServices != (IHTMLEditServices *) NULL)
m_pServices->Release();
IServiceProvider *pTemp;
if (pDoc == (IHTMLDocument2 *) NULL)
return FALSE;
pDoc->QueryInterface(IID_IServiceProvider, (void **) &pTemp);
if (pTemp != (IServiceProvider *) NULL)
{
if (pTemp->QueryService(SID_SHTMLEditServices, IID_IHTMLEditServices, (void **) &m_pServices) == S_OK)
{
if (m_pServices != (IHTMLEditServices *) NULL)
{
m_pServices->AddDesigner(this);
return TRUE;
}
}
}
return FALSE;
}
and the Detach() looks like this.
void CMSHTMLDisableDragHTMLEditDesigner::Detach()
{
if (m_pServices != (IHTMLEditServices *) NULL)
m_pServices->RemoveDesigner(this);
}
What this does is attach your edit designer to the document. MSHTML then calls the various member functions of the edit designer at the appropriate times. No eventsink involved.
I hope this helps
Rob Manderson
Colin Davies wrote: I'm sure Americans could use more of it, and thus reduce the world supply faster. This of course would be good, because the faster we run out globally, the less chance of pollution there will be. (Talking about the price of petrol) The Soapbox, March 5 2004
|
|
|
|
|
Rob Manderson wrote:
Nope. I did it like this.
I just spent the last several hour trying to figure out why this approach wouldn't work and still haven't figured out why...
Why is it that approach will work for IWebBrowser2 and not IHTMLEditDesign ...
How are either interfaces different? They both fire events when appropriate...
Can you shed some light on this subject for me?
Thanks again, you've been a big help
How do I print my voice mail?
|
|
|
|
|
Hockey wrote:
you've been a big help
My pleasure
Nope, the IHTMLEditDesign interface doesn't fire events. It 'sinks' them if you want to think of it that way. But I find it better to think of it as a set of callbacks similar to, for example, the callbacks you get from something like EnumFonts . Don't let the fact that the interface is derived from IUnknown sidetrack you into thinking of the entire COM event source/sink plumbing.
Rob Manderson
Colin Davies wrote: I'm sure Americans could use more of it, and thus reduce the world supply faster. This of course would be good, because the faster we run out globally, the less chance of pollution there will be. (Talking about the price of petrol) The Soapbox, March 5 2004
|
|
|
|
|
Thanks again
Cheers
How do I print my voice mail?
|
|
|
|
|
Hi again Rob, I hope you don't mind me asking you this directly rather than first posting my question, but...
The IHTMLEditDesign doesn't fire events....that I kind of understand I think...As far as I can tell (now that i've read a little more on the subject) It doesn't have support for IConnectionPoint for outgoing sinks either. Thats why an IHTMLEditDesign requires an edit designer to be a COM object and instead of using sinks you notify the IHTMLEditDesign of a designers existence using AddDesigner() and remove designer so you can dynamically add or remove addon functionality from any IWebBrowser2 ...like if you used a sink you would use the Advise() function instead?
Am I correct in thinking this way?
The single example from MSDN i've been playing with had me confused for a while because I believe (inless I seen or understood wrong) it registers itself/application as a COM server...and the code snippet you provided previosuly doesn't suggest this is nessecary...
Thanks alot
How do I print my voice mail?
|
|
|
|
|
It's the other way around. You create an IHTMLEditDesigner object somehow (it need not be a COM object in the sense of being createable via CoCreateInstance ). You then notify the document object (via the AddDesigner() method) that it should pass editor events to your object. It's just a souped up way of setting a callback.
In my code I implemented the designer as a c++ class derived from IHTMLEditDesigner because those are the rules (AddDesigner() wants to see something derived from IHTMLEditDesigner ). But the instance of the class that I pass to the document object (incidentally I use IHTMLDocument2 rather than IWebBrowser2 ) is statically created as a member variable in my view class.
For what it's worth, I think the MSDN samples are needlessly complex.
Rob Manderson
Colin Davies wrote: I'm sure Americans could use more of it, and thus reduce the world supply faster. This of course would be good, because the faster we run out globally, the less chance of pollution there will be. (Talking about the price of petrol) The Soapbox, March 5 2004
|
|
|
|
|
Hi all
This whole day i suffer to catch bug in my program and still
hadn't solution.
I had some method which turn out array of bytes in VARIANT
VARIANT GetVTFromByteArray(LPBYTE pBuf,long bufSize)
{
/*
First i create SAFEARRAY and sometimes it failed (not all time )
*/
SAFEARRAY* pSA = NULL;
SAFEARRAYBOUND saBound = {bufSize,0};
pSA = SafeArrayCreate(VT_UI1,1,&saBound);
ASSERT(pSA);
//pSA return not NULL ;go forth
long z;
HRESULT hr = SafeArrayGetUBound(pSA,1,&z);
/*
String above its just a test whats all fine BUT
this routine sometime return mee 0x80070057 'The parameter not incorect' what very weired to me.
Anytime this workout fine its weired too much .
*/
....
....
}
Where trouble here???Please give me opinion if you got one.
Thanks a lot.
|
|
|
|
|
I am working with an InProc OLE Server that was created in Visual C++ v6.0 with the ATL COM Appwizard.
I created a new Composite Control and simply tried to add the MSFlexGrid ActiveX control. The Flex Grid is added and displays fine when the Composite Control is instantiated through the ActiveX Control Test Container (or other application).
The problem comes when trying to access the members of the Flex Grid. The CWnd::InvokeHelper method ASSERTs at the following line:
ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least)
Here's the body of the InitInstance method of my DLLs App class:
{<br />
AFX_MANAGE_STATE(AfxGetStaticModuleState());<br />
AfxEnableControlContainer();<br />
_Module.Init(ObjectMap, m_hInstance, &LIBID_TESTCOMASCONTAINERLib);<br />
return CWinApp::InitInstance();<br />
}<br />
Here's the body of the Composite Control's Message Handler for WM_INITDIALOG:
{<br />
AFX_MANAGE_STATE(AfxGetStaticModuleState());<br />
m_wThis.Attach(*m_phWndCD);<br />
m_ctlFlexGrid.SubclassDlgItem(IDC_MSFLEXGRID1, &m_wThis);<br />
<br />
m_ctlFlexGrid.SetRows(5);<br />
<br />
return 0;<br />
}<br />
The SetRows method is what calls InvokeHelper. According to the MSDN documentation (e.g "...These types of controls are called composite controls because they are able to host other controls (native Windows controls and ActiveX controls)....") a composite control should be able to contain an ActiveX control.
What am I missing here? Do I need an additional AfxEnableControlContainer() call somewhere in my Composite Control's implementation? Do I simply have the style settings wrong in the Dialog Resource?
Any help or guidance is appreciated... Thanks.
|
|
|
|
|
I'm developing an ActiveX component, which is used on web pages. When user enters a page page, the ActiveX is loaded and when the user moves to another page, the activeX component terminates.
However when user goes to another page, I must be able to transfer some data from the current instance of the ActiveX component to the next instance of it.
I'm currently using cookies for this, but that is not a good solution for various reasons. What other ways are there to transfer the data? Is there some windows interface (servic) which I can use to temporarly store data, so that the data can then later be picked up by another ActiveX instance.
|
|
|
|
|
Why can't you use local file? Temporary folder maybe good place...
You can also overload OnFinalRelease or add extra LoadLibrary, so instance of your control or module will continue to stay in memory, even after IE Document Releases it...
Also, as I recall CoFreeUnusedLibraries implemented by MSFT has a delay unload time of about 10 minutes -- so you can just use that -- your module stays in memory for 10 minutes, even after last instance of your control is realeased. So, you can use that by storing shared data as a static data or member of CWinApp class...
Also, you can implement your own DllCanUnloadNow(void) -- just return S_FALSE -- that will guarantee that your module will stay in memory forever...
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
The static member idea seems like a good choice (tested, and seems to work). I'll still have to test the other ideas.
But, thank you...
|
|
|
|
|
i tried by typing comtool in matlab command window, but the matlab com builder window did not appear. the version of matlab which i m using is 5.3. can someone help me about this problem.
bhavsar vishal
pgdem, be
iiem-india
|
|
|
|
|
Hi there,
I have created a COM component using C++ which is already installed on my system and is being used by few applications.
I want to know what issues i'll have to consider if I wish to have this same DLL with a different name on my system.
I mean if I rename this DLL and install it , apart from changing the CLSID , ProgId what all things I'll need to change in this DLL if I wish to have both my DLL's to be registered on my system.
Any thoughts?
Thank You.
Have a nice day!
modified 21-Apr-21 21:01pm.
|
|
|
|