- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi
I am writing a code that uses a 'c' library. That library has a lot of output to the console.How can I open the console in a Windows app to see those messages and how can I grab those messages and print it to a file or to a MessageBox (because console display it is not pretty in a windows app)?
thanks
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You can use the sdk routine attachconsole (you need the console process id) you can then read and write to that console using the sdk WriteConsole and ReadConsole I have attached a code extract snippet...
BTW if you create the console from Fortran using CreateProcess with StartupInfo you can make the console look prettier by setting foreground and background colours etc. If you want I can post an example.
use ifwin, only: bret
use ifwinW, only: AttachConsole
integer(bool) :: bret
bret = AttachConsole(ProcessInfo%dwProcessId)
.....
module IfwinW
!missing unicode interfaces from IFWIN + other missing interfaces
use ifwinty
!DEC$OBJCOMMENT LIB:"USER32.LIB"
!DEC$OBJCOMMENT LIB:"KERNEL32.LIB"
interface
function AttachConsole(dwProcessId)
import !if intel add this missing inteface we should then get an error
integer(bool) :: AttachConsole
!DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'AttachConsole' :: AttachConsole
integer(dword) :: dwProcessId
!DEC$ ATTRIBUTES VALUE :: dwProcessId
end function AttachConsole
end interface
END MODULE IfwinW
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi
Thanks. If that is not too much work for you I would appreciate that also.
thanks
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
subroutine OpenCloseConsole(Iopen) !iopen=1 open, iopen=0 close
use ifwin
use IfwinW, only: AttachConsole
use ifport, only: sleep, getlasterror
implicit none
integer, intent(in) :: iopen
integer(bool) :: bret
integer(handle) :: fhandle
integer(dword) :: dwX, dwY, dwXSize, dwYSize ! initial size and position of console (pix/screen)
Type(T_COORD) :: wpos
type (T_STARTUPINFO) :: StartupInfo
type (T_PROCESS_INFORMATION), save :: ProcessInfo
!call cc_GetLastError()
if(iopen == 0) then
!BOOL WINAPI TerminateProcess(_In_ HANDLE hProcess,_In_ UINT uExitCode);
bret = FreeConsole() !close/Deallocate the console to free its resources.
!call cc_GetLastError()
bret = TerminateProcess(ProcessInfo%hProcess,0)
!call cc_GetLastError()
return
endif
dwX=0; dwY=0; dwXSize=0; dwYSize=0 !doesn't seem to work
! Initialize StartupInfo iany([STARTF_USEFILLATTRIBUTE,STARTF_USEPOSITION,STARTF_USEPOSITION])
StartupInfo = T_STARTUPINFO(C_SIZEOF(StartupInfo),NULL, NULL, &
transfer(C_loc("User Console"C),fhandle), & !initial name of console
dwX, dwY, dwXSize, dwYSize, & ! initial position and size
NULL,NULL, & ! x and y count chars
iany([FOREGROUND_BLUE,BACKGROUND_RED,BACKGROUND_GREEN,BACKGROUND_BLUE]), & ! blue text on white backgr
ior(STARTF_USEFILLATTRIBUTE,STARTF_USEPOSITION), & ! flags to tell items are present
NULL,NULL,NULL,NULL,NULL,NULL)
ProcessInfo%dwProcessId=0 !init
! now Open a custom console
bret = CreateProcess (NULL_CHARACTER,"cmd.exe"C, & ! Application Name, cmdline
NULL_SECURITY_ATTRIBUTES, &
NULL_SECURITY_ATTRIBUTES, &
TRUE, & ! InheritHandles
0, & ! CreationFlags CREATE_NEW_CONSOLE
NULL, & ! Environment variables
NULL_CHARACTER, & ! Current directory
StartupInfo, &
ProcessInfo) ! process id etc returned
if(bret /= true) then
!call cc_GetLastError()
else
call sleep(1000) !create process returns before proc fully running
!call SetLastError(0) !reset the non-error that always is happening set in creatproc
bret = AttachConsole(ProcessInfo%dwProcessId)
!call cc_GetLastError()
endif
bret = SetConsoleTitle("My Text Window"C) ! we know we have connected.....
!if(bret /= true) call cc_GetLastError()
fhandle = GetStdHandle(STD_OUTPUT_HANDLE)
!call cc_GetLastError()
! Set buffer size variables
wpos%x = 132 ! line length must be >= currently set console window line length
wpos%y = 300 ! lines must be >= currently set console window number of lines
! Set a console buffer bigger than the console window. This provides
! scroll bars on the console window to scroll through the console buffer
bret = SetConsoleScreenBufferSize(fhandle, wpos)
!if(bret /= true) call cc_GetLastError()
end subroutine OpenCloseConsole
The code above illustrates some points, it opens console with attributes, closes it, set the title etc. The missing cc_ routines are just wrappers for the IFPORT routines
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi
But, is there an alternative to write the console messages in a MessageBox instead of console itself?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
How, specifically, does the C library do its IO? printf and friends?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi
Some of the libraries use printf and 'friends'. Concerning another library I must ask first to PETSc development team because and still don't know how that is done.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi
I tried the code above but you didn't send gutils and asx6 modules.
regards
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
P R. wrote:
Hi
I tried the code above but you didn't send gutils and asx6 modules.
regards
You do not need them, I edited the source above, axs6 only declared fhandle varaiable, I replaced cc_sleep with the std sleep and commented out the calls to the error handler routines.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page