|
Although I could see the attempt at humour, I didn't like it because all of it's premises are wrong. For something to be funny, it usually needs a grain of truth and every criticism I saw of C++ in the article was plain wrong.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
"I'm thinking of getting married for companionship and so I have someone to cook and clean." - Martin Marvinski, 6/3/2002
|
|
|
|
|
Maybe the difference, Christian, lies in the fact that, in my many years of attempting to learn the language, I've found every point to be true. I'm sure there are good reasons for each of these language "features" and I'll learn them when I get that far along, but to me they are all huge obstacles. Published elsewhere, not as obvious humor, I would read it as truth with hardly any argument.
Humor, like so many things, lies in the eye of the beholder.
|
|
|
|
|
I won't bother arguing with you then.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
"I'm thinking of getting married for companionship and so I have someone to cook and clean." - Martin Marvinski, 6/3/2002
|
|
|
|
|
void CView::GetWindowTitle()
{
CWnd* pWindow;
if(pWindow)
{
pWindow = GetActiveWindow();
pWindow->GetWindowText( m_strWindowText );
}
}
My miniputt high is now 29
I do not think I can improve on that
My temperament won't hold
www.busterboy.org
|
|
|
|
|
|
Oops!!!
I feel silly. I overlooked the 'CView' part of it
Nish
My miniputt high is now 29
I do not think I can improve on that
My temperament won't hold
www.busterboy.org
|
|
|
|
|
I just switched over from 6.0 to .NET and now i cannot access a few of my dialogs. These dialogs come up and say 'The ActiveX control "Microsoft FlexGrid Control, version 6.0" could not be instantiated because it requires a design-time license.'.
Does this mean i can't use this control without paying MS more money?!?! and if so where would i go to find out how much a license costs? i just dont get it.. it let me use it in 6.0, how is .NET more functional when it takes away my available controls!?
any insight would be much appreciated!
-dz
|
|
|
|
|
ThatActiveX does not exist in .NET,I think if you install VC6 at the same machine then you can use it again.
Mazy
"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here." Wish You Were Here-Pink Floyd-1975
|
|
|
|
|
Ah, I did format before instaling .Net, thanks for the help!
by the way.. is there a different grid that they expect us to use for C++ in .NET? I saw under 'Customize toolbox' in the '.NET Framework Components' something called 'DataGrid', i see it is checked off but it isn't in my toolbox.. is this what i should be using?
-dz
|
|
|
|
|
dazinith wrote:
I saw under 'Customize toolbox' in the '.NET Framework Components' something called 'DataGrid
I think we can't use that DataGrid in VisualC++(at least I don't know how),there are some powerfull DataGrid here in CP,I use them in my applications,If you don't know their address,I can send them for you.
Mazy
"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here." Wish You Were Here-Pink Floyd-1975
|
|
|
|
|
I'd like to instantiate a pointer to a template class but I'm not sure if its possible.
I'd like to do something like this:
Cx<cz>* x;
x = new Cx<cz>; // or x = new Cx<cz>();
x->whatever=...;
|
|
|
|
|
Use 'display this message as-is (no HTML)' option - your code is screwed without that.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Thanks Tomasz,
Here is the code that I would like to do (Cx is the template class, z is some other class):
Cx<z>* x;
x = new Cx<z>();
x->whatever = ...;
|
|
|
|
|
|
This is the error i get:
error LNK2001: unresolved external symbol "public: __thiscall Cx<class z="">::Cx<class z="">(void)"
|
|
|
|
|
Sorry, here it is "as-is"
error LNK2001: unresolved external symbol "public: __thiscall x1<class z>::x1<class z>(void)"
|
|
|
|
|
This is a problem with your #include files, or a missing library. It can see the header for x1, but cannot find anything to link it to.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
"I'm thinking of getting married for companionship and so I have someone to cook and clean." - Martin Marvinski, 6/3/2002
|
|
|
|
|
|
It seems that you have the methods of your template class defined in .cpp file. You should move them to the header.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
You were right. I had the methods in a cpp file.
|
|
|
|
|
I tend to try things first to see if they work and ask why if they do not
std::string * pString = new std::string;
std::vector<int> * pInt = new std::vector<int>
The above compiles fine for me.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
"I'm thinking of getting married for companionship and so I have someone to cook and clean." - Martin Marvinski, 6/3/2002
|
|
|
|
|
Can anyone tell me what (obvious to everyone else) piece I'm missing? The following code doesn't work when run as a service. It runs fine when run through the IDE. All it does is set a timer. The SetTimer returns a valid number, but the TimerProc callback is never hit.
Any ideas?
Carl
///////////////////////////////////////////////////////////////////////////
[ module(SERVICE, uuid = "{99CCA443-725A-44F2-A5F3-9855AFACF970}",
name = "QService",
helpstring = "QService 1.0 Type Library",
resource_name="IDS_SERVICENAME") ]
class CQServiceModule
{
public:
CQServiceModule() {};
public:
HRESULT PreMessageLoop(int nShowCmd)
{
HRESULT hr = __super::PreMessageLoop(nShowCmd);
if ( SUCCEEDED(hr) )
return S_OK;
return hr;
}
HRESULT Start(int nCmd)
{
m_lTimer = (UINT)::SetTimer((HWND) NULL, 1,
10000, TimerProc);
return __super::Start(nCmd);
}
static void CALLBACK TimerProc(HWND hwnd,UINT uMsg, UINT idEvent,
DWORD dwTime)
{
_AtlModule.LogEvent(_T("TimerEvent"));
}
UINT m_lTimer;
};
|
|
|
|
|
AFAIK services do not have message loops - and message loop is required when you want to use SetTimer, even with a callback function.
Use Sleep() or waitable timer instead of SetTimer.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Thanks for the response.
The ATL service code includes 3 methods
PreMessageLoop();
RunMessageLoop();
PostMessageLoop();
Which lead me to think (incorrectly?) that this should work. It worked with the ATL code with version 6.0, although a lot of the code that had been explicitely generated before is now contained in CAtlServiceModuleT.
|
|
|
|
|
First, a service is a normal Windows 32 program, and as such it has at least a system message queue (even if it doesn't use it). Each thread may also have a thread specific message queue, but the creation is deferred until it's really needed (e.g., a User or GDI function is called). The old SetTimer function makes use of window messages (it was normally used for background processing purposes back in the 16-bit days), even if you specify a callback. Because of this reason, one must get and dispatch messages when it's used.
Basically, all you need to do is to implement a Get-or-Peek/DispatchMessage-loop somewhere in your ServiceMain (or a function called from it). This is what makes the wheel go round. MFC and other framework libraries have a message loop buried way down in their private code, so you don't see it often these days, but it's still integral to Windows.
However, if the only WM-based function you're going to be using is SetTimer, there is a better solution: Waitable Timers. A waitable timer is a kernel object that can be waited on using the WaitForXObject(s) set of functions (cf. CreateWaitableTimer API), and it can be set to an absolute or relative due time. This way you can combine it with waiting on other events such as a Quit event, which is a good service design.
|
|
|
|