|
Thank you all.
|
|
|
|
|
Is ODL an alternative to IDL to provide interfce definitions
Also can I compile it with MIDL and get the necessary header for the interfave
|
|
|
|
|
I would like to take an existing application that I created and create and object so I can embed into other documents. For example in Microsoft Word. I can insert a Excel worksheet object into word (Insert>Object) and toggle between the two applications. Any ideas on how I can achieve this.
Thanks
|
|
|
|
|
In the most generic way, the answer is you have to implement the object container. As a start-up code I would like to recommend you the ActiveX Control Test Container sources (I guess available somewhere on microsoft msdn site) or sample called I guess VBLite (described in article Extending ATL 3.0 Control Containment to Help You Write Real-world Containers)
hope this helps
|
|
|
|
|
Hi all,
Can anyone point me in the right direction of information about using the Excel grid in a VC++/MFC app? I'm just looking to get the grid on a view / dialog, maybe manipulate some rows / columns (via code), etc.
Is this even doable?
Dylan
"In meetings, the person who is least competent usually does the most talking. Talking is a direct substitute for competence, at least in the minds of other people. Five minutes after you leave a meeting, you won't remember what anyone said but you will remember who did most of the talking. Withing a day your mind will translate that into a notion that the talker was unusually knowledgeable" - Scott Adams, Dilbert and the way of the weasel
|
|
|
|
|
Not sure you could get just the grid part. What I've done in the past is use the ability to embed an OLE object into a view. You can use the component in-place, and also get it's IUnknown interface. From there, you can get a dispatch interface and navigate Excel's object model to pretty much do what you want.
If all you want is a grid, on the other hand, then look no further than this site, as Chris' excellent control. I believe others have produced various flavours such as an ATL implementation, although I haven't used those.
I have used the original quite extensively in some form filling apps, as my about boxes testify... "Portions (C) Chris Maunder" etc.
Steve S
[This signature space available for rent]
|
|
|
|
|
I created an OCX control in a dialog box, using the class wizard, created a member variable etc. and it's all working fine. However, I need to (dynamically) set some of the parameters that are initialised when the object is created, so I'll need to control the creation of the OCX object directly from my program, rather than let the class wizard handle it all for me.
Does anyone know how I can hook into this?
Ta,
Debbie
|
|
|
|
|
You can use ATL's CreateControl() API to create OCX in a container app.
|
|
|
|
|
Reasonable Developer
i wanted to download the SDK of Microsoft Project, i try my best but fail(it give overview of MS Project 2002) pls help me. So nice of u
Note
i have already test it but it was just an overview of sdk whereas i have to integrate the MS Project & therefore i need to download the complete sdk, now pls try for it & if u find any solution inform me
So nice of u OK
|
|
|
|
|
Go to msdn.microsoft.com and follow the links to the download page.
Christian
No offense, but I don't really want to encourage the creation of another VB developer. - Larry Antram 22 Oct 2002
Hey, at least Logo had, at it's inception, a mechanical turtle. VB has always lacked even that... - Shog9 04-09-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
Appologies for not posting this on VC++ message board ( the link was timing out)
I am trying to call a DLL written in Fortran from my VC++ application. Everything works fine, but when the Fortran DLL runs into trouble (some exception occurs in the FOrtran DLL) I see a dangerous looking Dialog Box, given the stack trace and the VC application simply exits. I have tried enclosing Fortran DLL function call with both try-catch and __try__except blocks, but the code in the catch/except never gets executed. Is there any way to catch Exceptions raised in FOrtran DLL in the calling VC++ applications.
Any help will be greatly appreciated.
cheers,
kashif manzoor
peace to all
|
|
|
|
|
try/catch and __try/__except blocks are setting per thread exception frames , so your Fortran dll may spawns another threads that may throw the unhandled exceptions you are faced.
Try to set a proccess wide exception filter that will exceutes as the last recover to the unhandled exceptions that may be thrown by your dll.
the key function is the Win32 SetUnhandledExceptionFilter function.
I hope it works for you.
AbuMalek
|
|
|
|
|
Hi fellows,
I would like to have COM object pooling. Therefore, i thought that if i overwrite the CComObject::Release method then i get what i need.
Since CComObject is derived from any COM object and it is the one that implements the IUnknown methods (such as Release), i thought to have explicit specialization of template CComObject.
However, i get compilation error when i do the following:
template<>
class CComObject<CMyCOM> : public CMyCOM
{
...
}
error C2934: 'CComObject' : template-class-id redefined as a nested 'class' of '<unknown>'.
How can i have my CComObject specialization?
Thanks,
Dudi
|
|
|
|
|
I know this is half an answer, but can't you use COM+ object pooling? It's fully automatic, stable and you only need to have a free-threaded component.
My latest article:
SQL Server DO's and DONT's[^]
|
|
|
|
|
No, i can't use COM+. I am trying to do it myself by overwriting
Release method of CComobject.
However, i fail to have template specification.
|
|
|
|
|
Hmmm... Maybe this is a case for COM aggregation. It seems easier to control AddRef/Release by creating a second component that aggregates the first. It can be done in such a way that's almost transparent to clients and this will ease turning on/off the pooling behaviour. I know it's more a workaround, I don't have a solution for your specific problem, but IMHO it would be a more elegant way of implementing this kind of functionality.
My latest article:
SQL Server DO's and DONT's[^]
|
|
|
|
|
Maybe I am reading this wrong, but if you want to overwrite the Release function provided by CComObject then you should be creating a class that inherits from CComObject and overwrite its Release function. In the code example you provided it appears that you are doing it the other way round.
Instead of
template<>
class CComObject<cmycom> : public CMyCOM
Try
template<>
class CMyCOM<> : public CComObject
This way CMyCOM provides all features of CComObject except those that you overwrite.
|
|
|
|
|
You didn't understand me.
When you work with ATL to create COM objects, you should know that ATL defines a template class, called CComObject, that derives from your COM class.
CComObject is the most derived class which implements AddRef, Release and QueryInterface methods. (Look at atlcom.h)
Therefore:
1) I can't inherit from CComObject because it is derived from my COM class.
2) I tried to have explicit specialization
template<> class CComobject<CmyCOM>:public CMyCom{...} .
But i get error C2934: 'CComObject<class CMyCOM>' : template-class-id redefined as a nested 'class' of '<Unknown>'
What does the error mean?
|
|
|
|
|
I am not sure what the error means, but you sure have me thinking now...
Is CMyCOM an ATL COM class or just a C++ class?
Also it seems you are creating CComObject. But that class already exists.
Also per MSDN :
CComObject implements IUnknown for a nonaggregated object. However, calls to QueryInterface, AddRef, and Release are delegated to CComObjectRootEx.
So to achieve what you want, i.e., overwrite Release, you could derive a class from CComObjectRootEx, and then make your COM classes inherit from the derived class rather than CComObjectRootEx. Or something like that
Just random rambling thoughts.....
|
|
|
|
|
CMyCOM is an ATL COM class.
This class is derived from CComObjectRootEx so i can overwrite 'InternalAddRef' and 'InternalRelease' methods.
Now, take a look at CComObject::Release():
STDMETHOD_(ULONG, Release)()
{
ULONG l = InternalRelease();
if (l == 0)
delete this;
return l;
}
This is where a decision is made according to the reference counter. I can overwrite InternalRelease but it won't help. I must change CComObject::Release so that if the refernce counter is 1 then the object should be return to the pool.
|
|
|
|
|
Hi,
This is some misundestanding, based on fact, that in ATL the CComObject is used in some other way than other classes. So if you want to override the CComObject functionality, you have to realize, that this is the class which will be derived from yours (CComObject is the topmost in the hierarchy)
Then the code will looks like that:
template <class Base><br />
class CMyComObject: public CComObject<Base><br />
{};
this will create CMyComObject, where you can override required functions and do whatever you want to. But this is only the half way to the goal.
Then, for allowing a creation of your specialized (pooled) COM, you have to create a class factory -
<br />
template <class T><br />
class CMyComClassFactory : public CComClassFactory<br />
{<br />
};
there is the most important function to be overrided (at least) - CreateInstance(...). Inside this function you will create your object in a way like that:
CMyComObject<T>::CreateInstance(&m_pObj) ;
(note the ..My.. in CMyComObject)
and the last point to achieve the custom-creation is to declare following macro inside your com class
DECLARE_CLASSFACTORY_EX(CMyComClassFactory<class> )
for that I use some macro defined:
#define DECLARE_MY_CLASSFACTORY(obj) DECLARE_CLASSFACTORY_EX(CMyComClassFactory<obj> )
then your component code will looks like:
class CMySuperPooledComponent : public ...whatewer was there...<br />
{<br />
DECLARE_MY_CLASSFACTORY(CMySuperPooledComponent);<br />
};
I hope this will helps you to achive whatever you want to. It looks quite complicated, then if you will need some more help, don't hesitate to contact me on my e-mail (-nospam)
|
|
|
|
|
Hi, thanks a lot.
Should the class factory and CMyComObject point to a global pool object manager, for the factory will pop out an object from there and CMyComObject will return it back?
|
|
|
|
|
Well, if I understood correctly, you would like to change your CMyComObject Release method to add the object to some manager instead of deletion and the factory will first ask this manager for an existing instance before creating new one.
This can be correct I would probably use the same way.
|
|
|
|
|
Yes, this is exactly what i wanted to do.
Thanks a lot,
Dudi
|
|
|
|
|
hi,
I need a help !! Please someone help me !
I am developing ATL COM which contains property of type COM object (ATL coclass): CComObject<dombookingareaholder> *m_AreaHolder.
Just for info: domBookingAreaHolder is a ATL co class.
I want to allow all clients (C++, VB, VBSCript) to be able to get and put the property.
Below is the code for ATL COM:
1) domBooking.CPP
<br />
<br />
class ATL_NO_VTABLE domBooking : <br />
public CComObjectRootEx<CComSingleThreadModel>,<br />
public CComCoClass<domBooking, &CLSID_domBooking>,<br />
public ISupportErrorInfo,<br />
public IDispatchImpl<IdomBooking, &IID_IdomBooking, &LIBID_DOMIBMSLib><br />
{<br />
public:<br />
domBooking()<br />
{<br />
}<br />
<br />
HRESULT FinalConstruct()<br />
{<br />
CComObject<domBookingAreaHolder>::CreateInstance(&m_AreaHolder);<br />
return S_OK;<br />
}<br />
<br />
void FinalRelease()<br />
{ <br />
m_AreaHolder = NULL;<br />
}<br />
<br />
DECLARE_REGISTRY_RESOURCEID(IDR_DOMBOOKING)<br />
<br />
DECLARE_PROTECT_FINAL_CONSTRUCT()<br />
<br />
BEGIN_COM_MAP(domBooking)<br />
COM_INTERFACE_ENTRY(IdomBooking)<br />
COM_INTERFACE_ENTRY(IDispatch) <br />
END_COM_MAP()<br />
<br />
public:<br />
<br />
STDMETHOD(get_AreaHolder)(IDispatch*** pVal);<br />
STDMETHOD(put_AreaHolder)(IDispatch** newVal);<br />
<br />
<big>CComObject<domBookingAreaHolder> *m_AreaHolder;</big><br />
<br />
};<br />
<br />
1) How I can accomplish this ?
2) how the propety for get and set being implemeted ?
3) and lastly how client can call to object property using set and put in VC++ ?
Thank u very very much in advance . Any advice and suggestions strongly aprreciated.
Regards,
Newbie
|
|
|
|