Jump to content
Sign in to follow this  

Increasing STDOUT Buffer Size

Recommended Posts



I am currently trying to increase the STDOUT buffer size of my script. I'm trying to use DllCall using setbuf() and I am having a hard time obtaining the File handle of STDOUT for the script. Here is the header of setbuf():

void setbuf( FILE *stream, char *buffer );

Here is my AutoIt script code that attempts to increase the buffer size of STDOUT:

Global Const $gc_strStandardCLib = "msvcrt.dll"                                             ;Name of dll that contains setbuf()
Global Const $gc_filePtrStdOut = 1                                                          ;File handle of STDOUT
Global Const $gc_intStdOutBufferSize = 102400                                               ;Size in bytes of our standard out buffer
Global $ga_intStdOutBuffer = DllStructCreate( "char[" & $gc_intStdOutBufferSize & "]" )     ;Buffer used for standard out

;Increase the buffer size of STDOUT to ensure we do not overflow the buffer
DllCall( $gc_strStandardCLib, "none", "setbuf", "ptr", $gc_filePtrStdOut, "ptr", DllStructGetPtr( $ga_intStdOutBuffer ) )

The problem I am having is with the first parameter of setbuf() ("FILE *stream") which I need to pass in STDOUT to. Anyone have any suggestions?


Edited by HopJokey

Share this post

Link to post
Share on other sites

The only reliable method I can find is to use _fdopen() to bind the file descriptor for stdout to a FILE* handle. The symbolic constants stdin, stdout and stderr cannot be accessed and are actually a little more complex than I thought. At any rate, the file descriptors for the standard streams are:

0 = stdin
 1 = stdout
 2 = stderr

So in C++ the code would look something like:

FILE *fptr = _fdopen(1, "a+");
setvbuf(fptr, pBuffer, mode, buffer_size);

Share this post

Link to post
Share on other sites

So in AutoIt that could likely be:


Global $iFile = 1 ; STDOUT
Global $iSize = 102400 ; size in bytes (chars)
Global $tBuffer = DllStructCreate("char[" & $iSize & "]") ; char buffer

Global $aCall = DllCall("msvcrt.dll", "ptr:cdecl", "_fdopen", _
        "ptr", $iFile, _ ; handle to open file
        "str", "a+") ; opens for reading and appending; creates the file first if it doesn’t exist

; error checking missing

Global $hFile = $aCall[0]
ConsoleWrite("! $hFile = " & $hFile & @CRLF)

Global Const $IOFBF = 0

$aCall = DllCall("msvcrt.dll", "int:cdecl", "setvbuf", _
        "ptr", $hFile, _ ; file
        "ptr", DllStructGetPtr($tBuffer), _ ; allocated buffer
        "int", $IOFBF, _ ; mode of buffering _IOFBF (full buffering)
        "dword", DllStructGetSize($tBuffer)) ; buffer size in bytes

; error checking missing

ConsoleWrite(">setvbuf returned: " & $aCall[0] & @CRLF) ;<- if 0 then OK





Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  


Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.