Source Code for Feuer's MFC Programming
I have just picked up a copy of Alan Feuer's MFC Programming from a
library in town. The book is in good condition, and looks like quite a
decent MFC tutorial. Unfortunately, the accompanying CD seems to have
gone walkabout. If anybody knows a place where I could legally get the
source code, kindly point me in the right direction.
Thanks in advance
Isaac
X-Hamster-Info: Score=0 ScoreLoad=0 ScoreSave=0 Received 120307115207
Xref: localhost microsoft.public.vc.mfc:12078
Path: news.ett.com.ua!goblin1!goblin.stu.neva.ru!postnews.google.com!w5g2000vbv.googlegroups.com!not-for-mail
From: paolob <paolob@bialive.it>
Newsgroups: microsoft.public.vc.mfc
Subject: Re: MFC: concurrent display of console output on GUI edit box.
Date: Wed, 7 Mar 2012 00:04:50 -0800 (PST)
Organization: http://groups.google.com
Lines: 201
Message-ID: <36aa6c02-4711-47d7-92d7-b90150c0b772@w5g2000vbv.googlegroups.com>
References: <8a79ae08-4d5d-4c1c-8d6b-4e178ddc64e5@v2g2000pbo.googlegroups.com>
NNTP-Posting-Host: 85.18.188.60
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
X-Trace: posting.google.com 1331107490 1003 127.0.0.1 (7 Mar 2012 08:04:50 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Wed, 7 Mar 2012 08:04:50 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: w5g2000vbv.googlegroups.com; posting-host=85.18.188.60; posting-account=ZLnASgoAAACZf7qKXL0hm33hMrrO3sl9
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2)
Gecko/20100101 Firefox/10.0.2,gzip(gfe)
X-Old-Xref: news.ett.com.ua microsoft.public.vc.mfc:35424
//-------------------------------------------------------------------------=
----
// Calling process...
//-------------------------------------------------------------------------=
----
#include "process.h"
typedef void (__cdecl * TSend_Output)(const char * );
// remember to implement this function... ;-) for display output
extern TSend_Output Send_StdOutput ;
extern TSend_Output Send_StdError ;
void Read_OutPut( HANDLE h, TSend_Output Send_Output )
{
char Buf[512];
unsigned long avail=0; //bytes available
do
{
PeekNamedPipe(h, Buf, sizeof(Buf)-1,NULL, &avail,NULL);
//check to see if there is any data to read from stdout
if( avail ) // ce ne =E8 !!!!
{
unsigned long letti=0; //bytes available
if( ReadFile( h, Buf, min(avail,sizeof(Buf)-1), &letti,
NULL) )
{
Buf[letti] =0;
TRACE0(Buf);
if(Send_Output) Send_Output(Buf);
}
}
} while(avail);
}
bool CallProcess( const CString & cmd )
{
try
{
char buf[1024];
strcpy( buf, cmd);
PROCESS_INFORMATION pInfo;
STARTUPINFO sInfo;
memset(&sInfo,0,sizeof(STARTUPINFO));
memset(&pInfo,0,sizeof(PROCESS_INFORMATION));
sInfo.cb = sizeof(STARTUPINFO);
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;
sa.lpSecurityDescriptor = NULL;
HANDLE hIRead=NULL, hIWrite=NULL;
HANDLE hORead=NULL, hOWrite=NULL;
HANDLE hERead=NULL, hEWrite=NULL;
BOOL retpipeI =retpipeI = CreatePipe(&hIRead, &hIWrite, &sa,
NULL);
BOOL retpipeO =retpipeO = CreatePipe(&hORead, &hOWrite, &sa,
NULL);
BOOL retpipeE =retpipeE = CreatePipe(&hERead, &hEWrite, &sa,
NULL);
BOOL cp=FALSE;
if( retpipeI && retpipeO && retpipeE )
{
HANDLE hProcess = GetCurrentProcess();
DuplicateHandle(hProcess, hIRead , hProcess,
&sInfo.hStdInput , 0, TRUE, DUPLICATE_SAME_ACCESS |
DUPLICATE_CLOSE_SOURCE);
DuplicateHandle(hProcess, hOWrite, hProcess,
&sInfo.hStdOutput, 0, TRUE, DUPLICATE_SAME_ACCESS |
DUPLICATE_CLOSE_SOURCE);
DuplicateHandle(hProcess, hEWrite, hProcess,
&sInfo.hStdError , 0, TRUE, DUPLICATE_SAME_ACCESS |
DUPLICATE_CLOSE_SOURCE);
sInfo.dwFlags = STARTF_USESTDHANDLES|
STARTF_USESHOWWINDOW;
sInfo.wShowWindow = SW_HIDE;
cp = CreateProcess(NULL,
buf,
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&sInfo,
&pInfo);
}
else
{
sInfo.dwFlags = 0;
cp = CreateProcess(NULL,
buf,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&sInfo,
&pInfo);
}
if( ! cp )
return false;
Sleep( 200 );
FILETIME CreationTime; // when the process was created
FILETIME ExitTime; // when the process exited
FILETIME KernelTime; // time the process has spent in kernel
mode
ULARGE_INTEGER UserTime; // time the process has spent in
user mode
ULARGE_INTEGER LastUserTime; // time the process has spent
in user mode
LastUserTime.QuadPart=0;
unsigned TimeDead = 0; //
const unsigned TimeOut = 60000; // un minuto
const unsigned gap = 10;
// Give the process time to execute and finish
DWORD ret;
do
{
ret = WaitForSingleObject(pInfo.hProcess, gap);
if( GetProcessTimes( pInfo.hProcess, &CreationTime,
&ExitTime, &KernelTime, (FILETIME *)&UserTime ) )
{
ULARGE_INTEGER dif;
dif.QuadPart = UserTime.QuadPart -
LastUserTime.QuadPart;
unsigned div=1000;
if( unsigned(dif.QuadPart/div) )
{
LastUserTime.QuadPart = UserTime.QuadPart;
TimeDead = 0; // ci ripenso, ma non troppo...
}
else
{
TimeDead += gap;
}
}
if( ret == WAIT_TIMEOUT && retpipeI && retpipeO &&
retpipeE )
{
Read_OutPut(hORead, Send_StdOutput );
Read_OutPut(hERead, Send_StdError );
}
}
while( ret == WAIT_TIMEOUT );
TRACE1("\n GetLastError=%d", GetLastError() );
if( retpipeI && retpipeO && retpipeE )
{
Read_OutPut(hORead, Send_StdOutput );
Read_OutPut(hERead, Send_StdError );
CloseHandle(hIWrite);
CloseHandle(hORead);
CloseHandle(hERead);
CloseHandle(sInfo.hStdInput );
CloseHandle(sInfo.hStdOutput);
CloseHandle(sInfo.hStdError );
}
DWORD exitCode;
if (GetExitCodeProcess(pInfo.hProcess, &exitCode))
{
switch(exitCode)
{
case STILL_ACTIVE:
assert(0); // come e' potuto succedere???
break;
default:
break;
}
}
CloseHandle(pInfo.hProcess);
CloseHandle(pInfo.hThread);
}
catch(...)
{
return false;
}
return true;
}
X-Hamster-Info: Score=0 ScoreLoad=0 ScoreSave=0 Received 101029133649
Xref: localhost microsoft.public.vc.ide_general:271
Path: news.solani.org!weretis.net!feeder3.news.weretis.net!feeder4.news.weretis.net!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail
From: David Lowndes <DavidL@example.invalid>
Newsgroups: microsoft.public.vc.ide_general
Subject: Re: Stand-alone C++ programming language?
Date: Fri, 29 Oct 2010 08:31:02 +0100
Organization: A noiseless patient Spider
Lines: 14
Message-ID: <vrtkc6hngelk9jn4uc4968471ei00aikld@4ax.com>
References: <4cc9f00a$0$5887$c3e8da3$1cbc7475@news.astraweb.com> <sstjc69akriahbf77vnk8m1jvjpfaaqfmm@4ax.com> <4cc9fbb5$0$1122$c3e8da3$aae71a0a@news.astraweb.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Injection-Info: mx01.eternal-september.org; posting-host="PysFJRLo1D2NK84lmtBe2g";
logging-data="6347"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX197KKfRHUKIzw1EvjxI2p/J"
X-Newsreader: Forte Agent 3.3/32.846
Cancel-Lock: sha1:kXWkDZrtnutZunEyGomdJEumrXs=
X-Old-Xref: news.solani.org microsoft.public.vc.ide_general:1057
The express editions cannot use MFC?
Yes. I believe the MFC components only come with the paid versions.
Does that mean I will not be
able to get my Visual C++ NET 2003 macro recorder project to work
with the express edition?
From what you mentioned about your project, I don't think you'd gain
much benefit from moving it to a newer toolset. If you had plans to
make use of newer C++ standards facilities, then such a move may be
worthwhile, but if you're happy with what you have, why change?
Dave