|
Yep, embedded zeros can screw c_str . However, I made this little experiment:
char buffer[] = {'h','e','l','l','o', 0, 'w', 'o', 'r', 'l', 'd'};
string s (buffer, sizeof(buffer));
cout << s << " length = " << s.length()<< endl;
And the output (VC 7.1) is:
hello world length = 11
|
|
|
|
|
The tidiest way would be to use ATL's CComBSTR rather than _bstr_t.
using namespace std;
....
string str = "abcdefghijklmnopqrstuvwxyz";
str[11] = 0; // str.size() still equals 26
CComBSTR bstr ( str.data (), str.size ()) ;
Paul
|
|
|
|
|
Iam currently developing a activeX control for my dissertation and am having problems accessing the properties of the control via VBscript.
I have added some properties via 'add properties' in the class view on VC 6.0 as in the ATL tutorial on MSDN. When I try to access the properties via VBscript, i just get a pop-up error telling me that what iam trying to access isnt a member method or property of that class...... help ne 1?
[] /\ () X
|
|
|
|
|
IIRC, I got such errors if I forgot to use the IDL directives [in] and [out, retval] where appropriate on the property IDL definitions.
--
Ich bin der böse Mann von Schweden.
|
|
|
|
|
[propget, id(3), helpstring("property yAngle")] HRESULT yAngle([out, retval] short *pVal);
[propput, id(3), helpstring("property yAngle")] HRESULT yAngle([in] short newVal);
I have this code in the IDL file that was generated by the add property wizard, I think this looks correct to what your saying?
WHat do you think?
[] /\ () X
|
|
|
|
|
They look fine to me.
--
Ich bin der böse Mann von Schweden.
|
|
|
|
|
Hi,
I'm very new to ATL and need your help. I am trying to create a com dll using ATL which should contain a tabbed control and each tab page should be able to contain many other controls (or a composite control). Please let me know how I can create a control like that. Also how do I interact with individual controls in each pages (how to initialize, modify, store etc).
Please give me some pointers or, a link to page which explains it in detail.
Thanks in advance
|
|
|
|
|
How to close ATL Dialog?
dadsadasd
|
|
|
|
|
EndDialog
--
Futue te et ipsum caballum.
|
|
|
|
|
(Sorry Chris)
Is it just me, or is the Yahoo group setup becoming more and more unreliable?
I've been trying to read the WTL group messages, and more specifically, the files area, and I keep being told it's not available.
If only it was as reliable as CP!!
Steve S
|
|
|
|
|
Hi ALL,
I am using stl list. (TCHAR*) pointers inside it. Now I want to erase the whole list along with deleteing pointers..Help me..
VikramS
|
|
|
|
|
Iterate through all the entries in the list deleting the data, then call clear on the list to empty it.
std::list<TCHAR*>::iterator i;<br />
for (i=myList.begin();i!=myList.end();++i)<br />
{<br />
delete *i;<br />
}<br />
mTests.clear();
Mike
|
|
|
|
|
|
Excellent technique
However, he'll probably need to write his own specialized functor for dealing freeing arrays. I doubt he's storing pointers to single TCHARs.
--
Futue te et ipsum caballum.
|
|
|
|
|
My TCHAR ptr's are like this
TCHAR *ptr=new TCHAR[256];
|
|
|
|
|
<br />
struct STLDeleteObject<br />
{<br />
template<typename T><br />
void operator()(const T* ptr) const<br />
{<br />
delete ptr;<br />
}<br />
};<br />
<br />
std::for_each(mylist.begin(), mylist.end(), STLDeleteObject());<br />
Type is determined automagically.
Todd Smith
|
|
|
|
|
No, delete[] should be called, since it's an array of TCHAR.
--
Futue te et ipsum caballum.
|
|
|
|
|
Then you should create your own deleter functor, much like the one in the example provided by Nemanja. The difference will be the actual call to delete. Since you have allocated an array of TCHAR, you should use delete[] when freeing it. delete will work for simple TCHARs - because there is no ~TCHAR to be called for each element in the array. However, make a habit or you might run into problems when you have code like this:
class Class {
OtherClass* pObj;
public:
Class() { pObj = new OtherClass(); }
~Class() { delete pObj; }
};
...
Class* arr = new Class[10];
...
delete arr;
Remember! delete for single objects, delete [] for arrays.
--
Futue te et ipsum caballum.
|
|
|
|
|
I guess I need another helper template. I like your approach better because then you don't have to know about your container and which STLDelete*** template to call.
struct STLDeleteObject
{
template<typename T>
void operator()(const T* ptr) const
{
delete ptr;
}
};
std::for_each(c.begin(), c.end(), STLDeleteObject())
struct STLDeleteArray
{
template<typename T>
void operator()(const T* ptr) const
{
delete[] ptr;
}
};
std::for_each(c.begin(), c.end(), STLDeleteArray())
Todd Smith
|
|
|
|
|
I am writing a custom-draw TreeView/ListView hybrid control similar to the one found in "A custom-drawn TreeList Control 18 Mar 2000 by Gerolf Kuehnel", found elsewhere on this site.
I am having relatively good success, except that while the custom-draw TreeView is scrolling quite well, the Header Control that is added in the OnInitDialog is not receiving the WM_WINDOWPOSCHANGING and other various messages, thus it does not scroll.
I used Spy++ to look at the messages received by Mr. Kuehnel’s project and my ATL control, and the Header control window in my control doesn’t receive any of the messages that I am sending (tried both to use a WTL CHeaderControl, as well as a CContainedWindow). I presume I’m missing something in my message map, or incorrectly creating the header control. The header generated messages are working fine (e.g. HDN_ENDTRACK). Although I am doing the exact same operation as Mr. Kuehnel, The messages aren't reaching their target.
Below is my Message Map for the composite control:
BEGIN_MSG_MAP(CTreeListViewCtrl)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_HSCROLL, OnHScroll)
NOTIFY_HANDLER(IDC_TREE,NM_CUSTOMDRAW,OnCustomdrawTree)
NOTIFY_HANDLER(IDC_TREE,TVN_DELETEITEM,OnDeleteTree)
NOTIFY_HANDLER(IDC_HEADER,HDN_ENDTRACK,OnEndTrackHandler)
CHAIN_MSG_MAP(CComCompositeControl<ctreelistviewctrl>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
This is where the item is created in OnInitDialog.
m_Header.Attach(
::CreateWindow(WC_HEADER,"", WS_CHILD|WS_VISIBLE|WS_BORDER|HDS_HORZ, 0,0,r.right - r.left,0,m_hWnd ,(HMENU)IDC_HEADER, hInst,NULL));
Can anyone give me an idea why this is happening?
Mark D Henning
ITT Industries
mark.henning@ITT.com
mdh@gldnrtvr.com
|
|
|
|
|
I have one com component working fine until yesterday now its giving me this exception?
what does it mean?
%1 is not a valid Win32 application.
Thanx.
MSN Messenger.
prakashnadar@msn.com
|
|
|
|
|
|
humm, well i would have belived that if the component is from 3rd party. But the component,the .dll file is mine and i compiled and registered it before using it.
MSN Messenger.
prakashnadar@msn.com
|
|
|
|
|
I have an activeX control embeded in a HTML page, how can my activeX component know from which website is it being downloading from ?
i can pass values from html page to the component, and modify the html pages to give different values to the activeX control from different websites is this a good way or i can accomplish this without modifying the HTML page ?
thanks in advance
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg
|
|
|
|
|