|
Or, in other words than Christian says, the COM is a technology, while the ATL is a tool.
COM defines some rules (like that objects are refcounted etc.) while ATL helps you to implement these rules, saving you a time by providing helpers for keeping the rules etc.
compare:
creating the com object without ATL:
<br />
IMyInterface* ipNewObject = NULL;<br />
HRESULT hr = CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IMyInterface, &ipNewObject );<br />
if( ipNewObject )<br />
{<br />
ipNewObject->SomeFunction();<br />
ipNewObject->Release();<br />
}<br />
return;<br />
with ATL:
<br />
CComPtr<IMyInterface> spNewObject;<br />
spNewObject.CreateInstance("objectId");<br />
if( spNewObject )<br />
spNewObject->SomeFunction();<br />
return;<br />
|
|
|
|
|
ATL is not only a tool for building COM servers and COM clients, but is also a tiny GUI toolkit. WTL extends the GUI toolkit, making it complete and suitable for application programming.
Good music: In my rosary[^]
|
|
|
|
|
Axter wrote:
Cans someone please tell me what is the difference between ALT and COM.
yeap many!...
COM is just a protocol set for making language independent component and ATL is one technique that use to create com objects.......
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
Hello everyone,
i'm trying to re-write a code from MFC to WTL but that seems not to work so... for exemple:
CString str(_T("some text"));
string st=str;
That has worked in MFC; with WTL, i have the message:
error C2440: 'initialisation' : impossible to convert from 'ATL::CString' to 'std::basic_string<_Elem,_Traits,_Ax>'
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Ax=std::allocator<char>
]
Can someone help me?
Madjid.
|
|
|
|
|
Out of interest, what happens if you change the line to
string st = (LPCTSTR)str;
Steve S
Developer for hire!
|
|
|
|
|
As Steve S points out, you probably need an explicit cast. Another thing to watch for is if you are compiling a Unicode app, then you should use std::wstring instead of std::string.
|
|
|
|
|
With CString, one should do something like this:
typedef std::basic_string<TCHAR> tstring;
Then tstring will be UNICODE when CString is, and isn't.
Good music: In my rosary[^]
|
|
|
|
|
Thankh everybody!
With:
string st = (LPCTSTR)str;
the same problem... if i use wstring, it works. The problem is that i'm obliged to wotk with string,and to convert from wstring to string, i really don't know how!!
|
|
|
|
|
You can use the MS string conversion macros.
If you are using Visual Studio 2002/2003 then you can do this:
string strA = "ascii";
CA2W pszUnicode(strA.c_str());
wstring strW = pszUnicode.m_psz;
...
wstring strW = L"unicode";
CW2A pszASCII(strW.c_str());
string strA = pszASCII.m_psz;
If you are using Visual Studio 6, then you can do this:
USES_CONVERSION;
...
string strA = "ascii";
const wchar_t* pszUnicode = A2CW(strA.c_str());
wstring strW = pszUnicode;
...
wstring strW = L"unicode";
const char* pszASCII = W2CA(strW.c_str());
string strA = pszASCII;
HTH.
|
|
|
|
|
Yeh, I have a whole <tstring> header file containing useful typedefs and inline functions. However, as I _always_ compile for Unicode only nowadays, I am back in the loving arms of wstring...
|
|
|
|
|
I'm also _UNICODE, but I always keep my options open, just in case.
Good music: In my rosary[^]
|
|
|
|
|
Shouldn't be an issue - gotta love the MSLU - works a treat for Win9x.
|
|
|
|
|
Something like make settings after the AMBIENT_CONTROL event, but IE just can't fire that for me.
To edit the registry maybe one approach, but the response is bad
Thanks in advance!
|
|
|
|
|
I know this class is the most derived class in ATL class hierarchy and (in case on non aggregatable object) is derived from user class. I want to know why is it derived from user class?
regards
Rahul
|
|
|
|
|
It's because of the IUnknown 's AddRef , Release and QueryInterface implementation.
You have to achieve, that the IUnknown implementation is one for the whole object, regardless of how many interfaces it consists of (there's usually only one reference counter for the whole object). This means that you need the implementation to be placed in the last object in the hierarchy. Therefore the CComObject is a neat trick, how to save user the need to write the AddRef/Release code into every user class.
|
|
|
|
|
How to connect database Access into Visual basic using ODBC?
Can you hepl me?
|
|
|
|
|
looking to use a date time object like COleDateTime in a win32 dll.
What can i use?
Intellisense seems to work fine when i use COleDateTime and i have access to all the methods but when i compile, i get an error:
(33): error C2065: 'COleDateTime' : undeclared identifier
Any guidnce is appreciated...
Thanks
|
|
|
|
|
#include <atlcomtime.h>
Although, you will depend on ATL for this. But I'm assuming that's not a problem, as you are posting in the ATL/WTL/STL forum.
Good music: In my rosary[^]
|
|
|
|
|
Can you create a clock by ActiveX control using ATL
|
|
|
|
|
|
Hi J.Sigvardsson
Thank you very much
|
|
|
|
|
Hi,
I have some troubles to add an enumeration to an existing idl-file. (VC++ 6.0, ATL-EXE-Project)
I am declaring the enumeration like this:
import "ocidl.idl";
[
object,
uuid( C15A95C3-1437-4ec4-B290-1B73573F4007),
// AT 11.08.2005 dual,
helpstring("ISEPSJobManager Interface"),
pointer_default(unique),
// AT 11.08.2005 oleautomation // AT 11.07.2004
]
interface IJobManager : IUnknown
{
typedef enum tag_SEPSSensorStatus{
eSeps_Sensor_OK,
eSeps_Sensor_ALARM
} eSEPSSensorStatusID;
--> I could declare 3 types of enumetations some years ago, but now when I am adding a new enumeration I can't use it from my client.
I have checked the following issues:
- Adding a new method to the interface works fine.
- Adding a new enumeration adds the enumeration to the header-file of my ATl-Project, but does not add the enumeration to the *.tlh-file of the client, neither I can observe a change in the OleView.
Does anybody know what causes this behaviour or how to implement a workaraound?
Is it possible, that the previous definitions
' dual' or 'oleautomation' causes the problems.
Thanks in advance
andi
|
|
|
|
|
As per ur code it seesm u declared the enum in interface defenition. Thats wrong u have to declare it outside the interface defenition. Other than that there is nothing wrong in your code. Also its a gud practice to have a uuid associated with ur enum. see the code below.
typedef [uuid(85916817-EE0E-4f0d-B7DB-FE6F15890CB5)]<br />
enum _eSEPSSensorStatusID{<br />
eSeps_Sensor_OK,<br />
eSeps_Sensor_ALARM<br />
} eSEPSSensorStatusID;
rgds ...mil10
|
|
|
|
|
thank you for this proposal.
I tried to add this to my idl-file, but it didn't solve my problem. -> now I am following the advice of Vita (to reference the enumeration in the library).
Thank you for answering my question
tagi
|
|
|
|
|
You should never ever add new/modify/remove methods to/in/from an interface, nor should you ever change enumerations after they've been published. COM isn't robust enough for that.
What you can do is to add a new interface which can handle the "new" way of doing things. With it, you should also declare the new enumeration.
Good music: In my rosary[^]
|
|
|
|