jeffslists wrote:
>
> Right now I have a simple speech application which compiles as a
> dialog-based application. I have no idea how to send output to the
> console from a dialog-based app. For now I've resorted to sending
> output to an edit box. (Sending output to the edit box was much more
> complicated than I expected. I spent two hours trying to figure out
> just how to automatically scroll the damn thing.)
>
> I would rather send trace output to the console/stdout than use an
> edit box. I could create a new project in MS VC 6.0 as a console
> based application, which would give me easy access to the console, but I do
> not know windows programming well enough to restructure the speech app .
>
> Here is a link to the app. I am working with:
> *SAPI 5.0 Tutorial I: An Introduction to SAPI*
> <http://www.generation5.org/content/2001/sr00.asp>
>
> Is there anyone here who can give me hand?
Gerald's reply reminded me that I'd faced the same issue using Rational Visual Test. There were 2 ways I found to get access to a console from a dialog based app. You can create a named pipe wrapper. See the following article: http://www.codeguru.com/console/dualmode.html
Or you could go down the AllocConsole route as Gerald mentioned. Here's a cut of proof of concept code I used in Visual Test Basic which illustrates that route:
'winbase.h
macro STD_INPUT_HANDLE = -10
macro STD_OUTPUT_HANDLE = -11
macro STD_ERROR_HANDLE = -12
macro FILE_TYPE_UNKNOWN = &h0000
macro FILE_TYPE_DISK = &h0001
macro FILE_TYPE_CHAR = &h0002
macro FILE_TYPE_PIPE = &h0003
macro FILE_TYPE_REMOTE = &h8000
declare function AllocConsole% lib "kernel32.dll" ()
declare function FreeConsole% lib "kernel32.dll" ()
declare function GetStdHandle& lib "kernel32.dll" (hStd&) ' STD_?_HANDLE, ? = INPUT, OUTPUT, or ERROR
declare function GetFileType& lib "kernel32.dll" (osfHandle&)
declare function WriteFile& lib "kernel32.dll" (hFile&, szWriteBuffer$, sizeWriteBuffer&, ytesWritten as pointer to long, overlap as pointer to long)
declare function CreateProcess& lib "kernel32.dll" alias "CreateProcessA" (lpApplicationName$, lpCommandLine$, lpProcessAttributes as SECURITY_ATTRIBUTES, lpThreadAttributes as SECURITY_ATTRIBUTES, bInheritHandles&, dwCreationFlags&, lpEnvironment as any, lpCurrentDirectory$, lpStartupInfo as STARTUPINFOA, lpProcessInformation as PROCESS_INFORMATION)
declare function CloseHandle lib "kernel32.dll" (hObject as long) as long
macro CRLF = chr(10) + chr(13)
macro NORMAL_PRIORITY_CLASS = &H00000020
type PROCESS_INFORMATION ' The PROCESS_INFO structure is used by
hProcess as long ' the CreateProcessA function to return
hThread as long ' information about the newly created process
dwProcessId as long ' The two handles that are returned in this
dwThreadId as long ' structure are open handles to the new
end type ' process and its primary thread
type STARTUPINFOA ' The STARTUPINFOA structure allows
cb as long ' the CreateProcessA function to control
lpReserved as long ' many aspects of the creation process
lpDesktop as long
lpTitle as long
dwX as long
dwY as long
dwXSize as long
dwYSize as long
dwXCountChars as long
dwYCountChars as long
dwFillAttribute as long
dwFlags as long
wShowWindow as short
cbReserved2 as short
lpReserved2 as long
hStdInput as long
hStdOutput as long
hStdError as long
end type
dim osfSTDOUT&, text$, pi as PROCESS_INFORMATION, si as STARTUPINFOA
const STATEMENT$ = "How am I doing?" + chr(10) + chr(13)
AllocConsole
osfSTDOUT = GetStdHandle(STD_OUTPUT_HANDLE)
if FILE_TYPE_CHAR = GetFileType(osfSTDOUT) then
WriteFile(osfSTDOUT, STATEMENT, len(STATEMENT), Null, Null)
sleep 3
CreateProcess(null, "c:\winnt\system32\cmd.exe", null, null, FALSE, _
NORMAL_PRIORITY_CLASS, 0, "C:\.", si, pi)
sleep 10
endif
CloseHandle(pi.hProcess)
CloseHandle(pi.hThread)
FreeConsole
--
Garrett Goebel
IS Development Specialist
ScriptPro Direct: 913.403.5261
5828 Reeds Road Main: 913.384.1008
Mission, KS 66202 Fax: 913.384.2180
www.scriptpro.com garrett at scriptpro dot com