|
Nearly there. This is a stupid one, but the CString (which I haven't used before) doesn't seem to work.
OK OK, forget that, how do I return an array to VB? Or even a string?
char anArray[2];
cpystr(anArray[0], "hello");
cpystr(anArray[1], "world");
*strVal = anArray;
Anything like this??
Lea
|
|
|
|
|
I need to log method calls and entries. Next to that I also have to log values of those methods arguments and return values.
I tried to do this by writing a macro that using a stl stringstream to dump the arguments but it crashes on arguments that are not defined yet, yep NULL pointes.
I tried to overload the operator<< as following:
template <typename type="">
std::wostringstream& operator << (std::wostringstream &stream, const type *value)
{
if(value != NULL)
{
stream << *value;
}
else
{
stream << L"NULL";
}
return stream;
};
...but this did not work. Does somebody know a way to make this work?
regards,
Brian
|
|
|
|
|
> it crashes on arguments that are not defined yet, yep NULL pointes
Try to be more specific: what kind of crash it is?
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
Well here is a small example project:
#include "stdafx.h"
#include <sstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
stringstream ss;
unsigned long *ul = NULL;
ul = new unsigned long(10);
ss << *ul << endl;
cout << ss.str();
return 0;
}
The code in this project works fine, but if you take away the line that assigns a new value to 'ul' then you will cause an access violation. I want to prevent this from happening, but don't know how to do this nicely in my tracer code.
|
|
|
|
|
What's the relationship of this sample and overloaded operator you've posted first? Even with overloaded operator << you'll get GPF - you are dereferencing NULL pointer (when ul isn't assigned to 'new long[10]').
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
I just needed a method that could log all different kinds of arguments without having to check if the arguments were NULL pointers. I now solved it like this:
#define INTERNAL_CALL_MSG(id,msg); CTracer tracer(id); tracer << msg; tracer.Enter();
class CTracer
{
public:
CTracer(std::wstring methodId) : m_methodId(methodId)
{};
virtual void Enter()
{
LogMethodEntry(m_methodId, m_message.str());
};
virtual ~CTracer()
{
LogMethodExit(m_methodId);
};
template<typename type=""> CTracer& operator << (type &arg)
{
if (arg)
{
m_message << arg << L" ";
}
else
{
m_message << L"0 ";
}
return *this;
};
private:
std::wostringstream m_message;
std::wstring m_methodId;
}
void CSomeClass::CSomeMethod(unsigned long *arg1, BSTR *arg2)
{
INTERNAL_CALL_MSG(L"CSomeClass::CSomeMethod", *arg1 << arg2);
...do some actual work...
}
This work fine, except there is now way of telling if an argument is an actual NULL pointer or a some pointer to 0 as there isn't realy a difference.
|
|
|
|
|
INTERNAL_CALL_MSG(L"CSomeClass::CSomeMethod", *arg1 << arg2);
I'm giving up - what are you trying to achieve using *arg1 << arg2?
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
I'm using Windows NT 4.0 and Visual C++...
Anyone knows how to verify if a process is running in other machine whitout use registry key handles ?
|
|
|
|
|
Hello folks!
I'm a beginner in MFC and I've got a small problem - at least I hope so
I'm trying to change the font in a listbox and to do that I used the following code:
void CSimaskra2View::OnInitialUpdate()
...
CFont font;
font.CreatePointFont(8, _T("Arial"), NULL);
m_listi.SetFont(&font);
...
The only thing that happens is that the font changes (no problems there) but the result is some default, ugly font (NOT Arial)! It doesn't matter if I change to Times New Roman, or if I change the size, I always get the same font!
If I erase the m_listi.SetFont(&font); I get the "wonderful" default font of Windows again
Please help me .. I need it
thatman
|
|
|
|
|
Your font is destroyed at the end of OnInitialUpdate. Make it a member of view class.
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
hello
I have a dialog based application, and in aboutbox I want to put my email, sth like;
Contact : me@myserver.com
Now I want is, when the user moves the mouse over my email address, the cursor will change shape to "hand" and when the user clicks on this email, application will open the default email client and fill the fields subject and email address.
How to do this?
Regards
Monka
|
|
|
|
|
|
Try:
<br />
CString sEmail;<br />
sEmail.Format ( IDS_MAILTO, "me@myserver.com", "Hello World!!" );<br />
ShellExecute ( 0, _T("open"), sEmail, 0, 0, SW_SHOWNORMAL );
-Ben
---------
On the topic of code with no error handling -- It's not poor coding, it's "optimistic"
|
|
|
|
|
hi,
i need to implement a wizard and create the dialog templates in memory (the pages and controls will be created dynamically). how do i do that ?
from what i ve seen so far : i must create a DLGTEMPLATE dlgTempl in memory so that propsheetpage->pResource points to the address of the dlgTempl. then set propsheetpage->dwFlags .... | PSP_DLGINDIRECT.. however it seems i need more help, cause i fail to create the dialog template.
could someone please help ?
tia, giorgos
giorgos
|
|
|
|
|
OK, bear with my this is my first attempt at VC (I've been using Borland)
I want a split SDI window with a tree to the left and various, probably CFormView s to the right according to which node of the tree is selected.
Is there a nice way to create a set of alternate views and switch between them, or is it really going to be necessary to create a brand new view every time I switch? Has anyone tried, for example, to produce an overloaded CRuntimeClass and smuggle an existing view in that way?
When you overwrite a pane does the old view get deleted (as opposed to destroyed)?
[Frankly I this CreateView method seems pretty perverse why on earth not take a CView argument and, if you want to use it the way Microsoft assume, put the "new" in the arguments list]
|
|
|
|
|
Check the FormSwap app described in Dec'98 issue of MSJ (C++ QA by Paul DiLascia). In MSDN, check the 'Periodicals' section - it should be there. If not, go to msdn.microsoft.com and use the search facility.
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
Can't seem to find it. Search gives hundreds of matches for CSplitterWnd but no relevant for FormSwap - and the only online periodical under MSDN is the MSDN mag.
|
|
|
|
|
MSDN comes in two flavors: one is online at msdn.microsoft.com, searching for FormSwap works for me there.
The other MSDN is on your harddisk (I'm assuming you've installed help and docs). From VC++ IDE:
1) Go to 'Help' menu
2) select 'Search...'
3) type FormSwap
4) press 'Display'
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
have you looked at the splitter section on this site?
|
|
|
|
|
Yes, and it was quite helpfull in clarifying the situation but it doesn't give me the kind of solution I want.
What I really want to do is put an _existing_ view into a pane. To have a small set of view objects and plug in the appropriate one at the appropriate time.
Unfortunately there's no "SetPane" method. This (to my mind) baddly designed CreateView method insists on creating a new view every time it's called. It looks to me like having this CRuntimeClass structure they are so pleased with they just couldn't resist using it. And, AFAIKS, it makes the call far less flexible without simplifying it a jot.
If you wanted to create a new view for a pane it could just as easilly have been done something like
SetPain(0, 1, new CFormView(ID_DLG), ..
Subsequent to posting the query I've tracked down another improved splitter class, which allows several views to be added to the splitter and switched between written by Caroline Englebienne. I'm hopeful that will fill the bill. It still looks like a clumsy work arround for something which could so easilly have been made simple.
|
|
|
|
|
#include <iostream>
using namespace std;
struct C;
struct D {
void operator*(D) { cout << "one\n"; }
} C;
struct E {
void operator*(E) { cout << "two\n"; }
} F;
struct F;
int main(){
C* C;
F* F;
return 0;
}
I got the above code from a C++ site. This code prints "one" "two" on the screen. Can anybody explain why is it printing so?
void (*p[10]) (void (*)());
|
|
|
|
|
C* C looks like declaration of pointer to C, but it isn't. It's a call to operator* overloaded in struct D. To make code clearer, put the space between first 'C' and asterisk - you'll see that this is an expression, not the declaration:
C * C;
This also applies to F* F (or rather F * F).
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
Thank u very much. Its only after ur reply I am thinking that C* C; is not a pointer declaration. Now, everything is quite clear and very simple.
Thank u once again.
void (*p[10]) (void (*)());
|
|
|
|
|
Hi
Iam trying to create a CRichEditCtrl ( like a popup wondow ) to display a certain text within a CListCtrl when the length of hte text in one of the column of the ListCtrl exceeds 256 characters.
This i smy problem :
y = 10 ( say )
CRichEditCtrl* myCtrl -= new CRichEditCtrl;
myCtrl->Create(WS_VISIBLE | WS_POPUPWINDOW | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY , CRect(x,y - 20, x+ 70, y - 90 ),
this, 5001);
where this refers to the Handle of the Parent Window
the application crashes at this point. Pl. explain me the reason.
regards
Sankar
regards
Sankar
|
|
|
|
|
It seems that rich edit can't be a popup window - it must be a child. That's what MSDN says about CRichEditCtrl styles:
"Apply the following window styles to an edit control:
WS_CHILD - Always."
You should create a popup as CWnd-derived class. This popup window should have one child - CRichEditCtrl, probably occupying the whole client area.
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|