|
The ATL (Active Template Library) is a library to make COM programming easier.
The WTL (Windows Template Library) extendes the ATL for more GUI support (for example splitter windows ect.)
So the WTL is something like MFC to make windows GUI programming easiert and somehow object oriented
You find here at codeproject some good tutorials how to use ATL/WTL especially if you have a background in MFC at
http://www.codeproject.com/wtl
Search for the articles "WTL for MFC programmers" from Michael Dunn.
Constantin
|
|
|
|
|
Hi suri,
Try http://www.funducode.com[^] this site ! OR offcourse search Codeproject itself, it has rich information about ATL/COM OR Search the online MSDN at http://msdn.microsoft.com/library
Cheers,
Vishal
|
|
|
|
|
Hi suren,
No personal mails please !
Should keep the discussion in the same thread, so that others can benifit form this.
Nways, you can refer to the books such as "Inside ATL - George Shepherd" OR "Inside COM - Dale Rogerson" etc...
All the very best !!!
Cheers,
Vishal
|
|
|
|
|
Hi,
I have a small console application using C structure, vector and std::sort().
The application crashes in the sort() function with memory corruption. Purify reports many ABW (Array Bound Write) and other illegal usage done by the sort function. Is there a known bug in the sort of stl vectors? Any help is appreciated.
Thanks,
Ron.
(Code sample)
// xx.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "xx.h"
#include <vector>
#include <algorithm>
#include <functional>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CWinApp theApp;
using namespace std;
#define LENGTH 1000
struct TTT
{
int d;
int h;
int n;
};
class ItemCompare : std::binary_function<TTT&, TTT&, bool>
{
public:
bool operator()(const TTT& t1, TTT& t2)
{
if (t1.d > t2.d)
return true;
else if (t1.h > t2.h)
return true;
else if (t1.n > t2.n)
return true;
else
return false;
}
};
TTT makeTTT(int i)
{
TTT t;
t.d = 1 + (i % 29);
t.h = 1 + (i % 22);
t.n = 1 + (i % 59);
return t;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
vector<TTT> t1;
t1.reserve(LENGTH);
for (int i=0;i<LENGTH;i++)
{
t1.push_back(makeTTT(i));
}
sort(t1.begin(), t1.end(), ItemCompare());
}
return nRetCode;
}
Ron.
|
|
|
|
|
I think the problem lies in that your ItemCompare class does not define a true order between TTT elements. Assuming you wanted to have a lexicographical order (order by d , else by h is d is the same, else by n if h is the same), you can write it like this:
class ItemCompare : std::binary_function<TTT,TTT,bool>
{
public:
bool operator()(const TTT& t1, TTT& t2) const
{
if (t1.d < t2.d)
return true;
if (t1.d > t2.d)
return false;
if (t1.h < t2.h)
return true;
if (t1.h > t2.h)
return false;
if (t1.n < t2.n)
return true;
return false;
}; Also, please note your implementation seemed to suggest you were trying to sort things in descending order. This formulation sorts just the opposite, flip the < s and > s is this is not what you want.
Hope this helps,
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
Want a Boost forum in Code Project? Vote here[^]!
|
|
|
|
|
Thanks. You were right, I had a bug in my compare function.
Thanks again,
ron.
Ron.
|
|
|
|
|
I was about to point that out, but since I figured it wouldn't produce memory corruption bugs, I didn't bother. This fix solved the memory corruption bugs, indicated by the original poster's reply.
How can a faulty predicate generate memory corruption? A screwy order would be expected, but memory corruption? I'm baffled.
--
My name in Katakana is ヨルゲン.
My name in German is Jörgen.
I blog too now[^]
|
|
|
|
|
Hi Jörgen,
How can a faulty predicate generate memory corruption? A screwy order would be expected, but memory corruption? I'm baffled.
Well, the problem with the OP's compare predicate is not that is does not induce an order, but rather that it is inconsistent, i.e, there exist elements t1 and t2 such that ItemCompare(t1,t2)==ItemCompare(t2,t1)==true . I guess the sorting algorithm might jump out of bounds when this assumed consistency is breached. Anyway, the sort source code is so complex that it's hard to elucidate what's going on inside.
Best,
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
Want a Boost forum in Code Project? Vote here[^]!
|
|
|
|
|
Hi,
I came up with a way how to call member functions directly so sending WM_NODIFY messages is no longer neccessary and I am interested in your opinions!
I have a MDI window (derived from CMDIFrameWindowImpl) that notifies the active MDI child (CChildFrame derived from CMDIChildWindowImpl) if its document should be opened/saved/reopened ect...
The only way I knew to do this was to send the MDI child a WM_NOTIFY message with different notification code and NMHDR*.
I thought it would be nice to call member function like Save(), Open(CString file),... directly on the CChildFrame object because it would be a lot easier to read and the casting of NMHDR* would no longer be neccessary.
So here is the code:
<br />
#define ATL_GET_THIS 100 <br />
<br />
template<typename T><br />
T* AtlGetObject(HWND hWnd) <br />
{<br />
NMHDR nmhdr = { hWnd, 0, ATL_GET_THIS };<br />
return (T*)(::SendMessage(hWnd, WM_NOTIFY, 0, (LPARAM)&nmhdr));<br />
}<br />
The CChildFrame must handle the ATL_GET_THIS notification:
<br />
BEGIN_MSG_MAP_EX(CChildFrame)<br />
...<br />
NOTIFY_CODE_HANDLER_EX(ATL_GET_THIS, _AtlOnNotifyGetThis) <br />
...<br />
END_MSG_MAP()<br />
<br />
LRESULT _AtlOnNotifyGetThis(NMHDR* ) { return (LRESULT)this; }
So the code in the parent to call some member function in the active MDI child would look like this:
<br />
CChildFrame* pWndChild = AtlGetObject<CChildFrame>(MDIGetActive());<br />
<br />
CString sFilename = pWndChild->GetFilename();<br />
CFileDialog dlg(FALSE, 0, sFilename);<br />
if (dlg.DoModal() == IDOK)<br />
{<br />
pWndChild->SaveAs(dlg.m_ofn.lpstrFile);<br />
} <br />
What do you say?
I know it works, but are there some traps I didn't see? And if this is a good idea, why is nothing like this in the ATL/WTL already? Or there is and I didn't see it?
Thanks for your time!
Constantin
|
|
|
|
|
hi,
im trying to open a document from the documents list but it always returns null.
this is my code:
<br />
m_ActiveProject->get_FullName(&l_ProjectName);<br />
<br />
CComPtr<EnvDTE::Documents> l_pDocuments;<br />
m_pDTE->get_Documents(&l_pDocuments);<br />
<br />
CComPtr<EnvDTE::Document> l_pDocument;<br />
l_pDocuments->Open(l_ProjectName,L"Text",false,&l_pDocument);<br />
am i doing something wrong?
|
|
|
|
|
hi,
im trying to get the project's full name by iterating the projects array.
<br />
EnvDTE::Projects *l_pProjects;<br />
l_pSolution->get_Projects(&l_pProjects);<br />
long *l_Count = new long;<br />
l_pProjects->get_Count(l_Count);<br />
<br />
for(long l = 0; l < *l_Count; l++)<br />
{<br />
EnvDTE::Project *l_pPrj;<br />
VARIANT v;<br />
v.lVal = 0;<br />
l_pProjects->Item(v,&l_pPrj);<br />
BSTR fullname;<br />
l_pPrj->get_FullName(&fullname);
}<br />
the problem is where the comment "// PROBLEM!" is. it just won't work?
what am i doing wrong?
|
|
|
|
|
I have created a button with a drop down arrrow with the following code:
<br />
TBBUTTON Button;<br />
TCHAR* pButSearchCaption = _T("Search Web");<br />
int iIndex0 = ::SendMessage(m_hWnd, TB_ADDSTRING, 0, (LPARAM)pButSearchCaption);<br />
Button.fsState = TBSTATE_ENABLED;<br />
Button.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE | TBSTYLE_DROPDOWN; <br />
Button.dwData = 0;<br />
Button.iString = iIndex0;<br />
Button.iBitmap = I_IMAGENONE;<br />
::SendMessage(m_hWnd, TB_INSERTBUTTON, 0, (LPARAM)&Button);<br />
I then add the following code to my message map to handle the TBN_DROPDOWN handler:
<br />
BEGIN_MSG_MAP(CMFToolbar)<br />
MESSAGE_HANDLER(WM_CREATE, OnCreate)<br />
MESSAGE_HANDLER(WM_SIZE, OnSize)<br />
ALT_MSG_MAP(1)<br />
NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnButDropDown)<br />
END_MSG_MAP()<br />
<br />
LRESULT OnButDropDown(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);<br />
However, whenever I click the arrown on the button, it seems as the OnButDropDown isn't being called. Anyone know why this is.
|
|
|
|
|
WM_NOTIFY messages are sent to the toolbar's parent window, just like with all child controls. You need to handle TBN_DROPDOWN in the parent and reflect it back to the toolbar.
Also, your TB_ADDSTRING call is wrong, you need to pass a double-null-terminated string.
--Mike--
LINKS~! Ericahist | 1ClickPicGrabber | CP SearchBar v2.0.2 | C++ Forum FAQ | You Are Dumb
Strange things are afoot at the U+004B U+20DD
|
|
|
|
|
how can i use CString with ATL in Visual Studio .NET?
|
|
|
|
|
Avi Laviad wrote:
how can i use CString with ATL in Visual Studio .NET?
#include <atlstr.h> ... to use ATL::CString
or
#include <atlmisc.h> ... to use WTL::CString
Greetings, Ralph
|
|
|
|
|
Ralph Wetzel wrote:
#include <atlstr.h> ... to use ATL::CString
#include <atlmisc.h> ... to use WTL::CString
I Couldn't find these two file in both of my compiler i.e. Visual Studio 6.0 and Visual Studio .Net.
Could you please tell how to use this two class.
thanks
"I Think this Will Help"
<h5
alok gupta="" <br=""> visit me at http://www.thisisalok.tk
|
|
|
|
|
You need atlmisc.h which comes with the other WTL headers you have to download from microsoft.
Then you need to define _WTL_USE_CSTRING to forward declare the CString class.
Look at the Beginner WTL tutorials here at codeproject (for example WTL for MFC programmers Part II covers including CString right at the beginning)
--Constantin
|
|
|
|
|
i am extremly thankful to u!
Thanks once again.
"I Think this Will Help"
<h5
alok gupta="" <br=""> visit me at http://www.thisisalok.tk
|
|
|
|
|
|
hi,
i added a custom resource to visual studio and im trying to do FindResource()
but it always return me null.
<br />
FindResource(_AtlModule.GetResourceInstance(), Xi_Name, "TEMPLATES");<br />
anyone know's whatsmy problem?
|
|
|
|
|
i have a OCX made in VB
when used in VB it has a function
func1( t1 as Integer, t2 as Integer)
if i use this OCX in MFC ( import )
the func ends up like
func1(short * t1,short * t2);
the func works fine in vb
but if i call it from MFC using short *
it doesn't work i tried passing short * and variants with integers and other stuff but no luck
how should i call it, why is there short * but just an integer in VB
please help
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg
|
|
|
|
|
short x = 1234;
short y = 5678;
func1(&x, &y); It looks like VB defaults to pass by reference. Try modifying the VB function to "func1(t1 as ByVal Integer, t2 as ByVal Integer)" and see if what happens in the generated C++ source.
--
My name in Katakana is ヨレゲン.
My name in German is Jörgen.
I blog too now[^]
|
|
|
|
|
Jörgen Sigvardsson wrote:
short x = 1234;short y = 5678;func1(&x, &y);
yes tried that doesn't work
unfortunatly i don't have the source code for the vb dll
the above stuff should but it doesn't
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg
|
|
|
|
|
How to use FindResourceEx for multiple dialog resources for different languages.
|
|
|
|
|
hi,
im coding an Add-In (Visual C++) that do some changes to the document files in Visual Studio (.NET).
in the code i need to get the Active Project that in the solution explorer (the one that will run when the project is execute).
how can i do that?
in MFC i think , in the class IApplication, there's ->get_ActiveProject,
but in the classes of EnvDTE there's not (i didn't find).
does anyone know about something like that? or is there another way to know which is the active/startup project?
thanks in advance,
Avi.
|
|
|
|
|