Author: hbelusca
Date: Wed Oct 26 22:43:53 2016
New Revision: 73047
URL:
http://svn.reactos.org/svn/reactos?rev=73047&view=rev
Log:
[WINSPOOL_PRINT]: Improve the test application:
- Do not hardcode the test file name, but instead take it from the command line (and add a
Usage() function);
- Do not use a too large fixed-size buffer to read & print the file, but instead use a
correctly-size buffer, get the file size, and then do a loop to read data from the file by
chunks & send it to the printer.
Modified:
trunk/rosapps/applications/cmdutils/winspool_print/CMakeLists.txt
trunk/rosapps/applications/cmdutils/winspool_print/main.c
Modified: trunk/rosapps/applications/cmdutils/winspool_print/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/cmdutils/wins…
==============================================================================
--- trunk/rosapps/applications/cmdutils/winspool_print/CMakeLists.txt [iso-8859-1]
(original)
+++ trunk/rosapps/applications/cmdutils/winspool_print/CMakeLists.txt [iso-8859-1] Wed Oct
26 22:43:53 2016
@@ -1,4 +1,4 @@
add_executable(winspool_print main.c)
-set_module_type(winspool_print win32cui)
+set_module_type(winspool_print win32cui UNICODE)
add_importlibs(winspool_print winspool msvcrt kernel32)
add_cd_file(TARGET winspool_print DESTINATION reactos/system32 FOR all)
Modified: trunk/rosapps/applications/cmdutils/winspool_print/main.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/cmdutils/wins…
==============================================================================
--- trunk/rosapps/applications/cmdutils/winspool_print/main.c [iso-8859-1] (original)
+++ trunk/rosapps/applications/cmdutils/winspool_print/main.c [iso-8859-1] Wed Oct 26
22:43:53 2016
@@ -1,26 +1,38 @@
#include <stdio.h>
#include <windows.h>
-int main()
+void Usage(WCHAR* name)
+{
+ wprintf(L"Usage: %s testfile\n", name);
+}
+
+int wmain(int argc, WCHAR* argv[])
{
int ReturnValue = 1;
- DWORD dwRead;
- DWORD dwWritten;
+ DWORD dwFileSize;
+ DWORD dwRead, dwWritten;
HANDLE hFile = INVALID_HANDLE_VALUE;
HANDLE hPrinter = NULL;
DOC_INFO_1W docInfo;
- BYTE Buffer[20000];
+ BYTE Buffer[4096];
- hFile = CreateFileW(L"testfile", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0,
NULL);
+ if (argc <= 1)
+ {
+ Usage(argv[0]);
+ return 0;
+ }
+
+ hFile = CreateFileW(argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("CreateFileW failed, last error is %lu!\n", GetLastError());
goto Cleanup;
}
- if (!ReadFile(hFile, Buffer, sizeof(Buffer), &dwRead, NULL))
+ dwFileSize = GetFileSize(hFile, NULL);
+ if (dwFileSize == INVALID_FILE_SIZE)
{
- printf("ReadFile failed, last error is %lu!\n", GetLastError());
+ printf("File is too big, or GetFileSize failed; last error is %lu!\n",
GetLastError());
goto Cleanup;
}
@@ -30,6 +42,7 @@
goto Cleanup;
}
+ /* Print to a printer, with the "RAW" datatype (pDatatype == NULL or
"RAW") */
ZeroMemory(&docInfo, sizeof(docInfo));
docInfo.pDocName = L"winspool_print";
@@ -45,10 +58,21 @@
goto Cleanup;
}
- if (!WritePrinter(hPrinter, Buffer, dwRead, &dwWritten))
+ while (dwFileSize > 0)
{
- printf("WritePrinter failed, last error is %lu!\n", GetLastError());
- goto Cleanup;
+ dwRead = min(sizeof(Buffer), dwFileSize);
+ if (!ReadFile(hFile, Buffer, dwRead, &dwRead, NULL))
+ {
+ printf("ReadFile failed, last error is %lu!\n", GetLastError());
+ goto Cleanup;
+ }
+ dwFileSize -= dwRead;
+
+ if (!WritePrinter(hPrinter, Buffer, dwRead, &dwWritten))
+ {
+ printf("WritePrinter failed, last error is %lu!\n",
GetLastError());
+ goto Cleanup;
+ }
}
if (!EndPagePrinter(hPrinter))
@@ -66,11 +90,11 @@
ReturnValue = 0;
Cleanup:
+ if (hPrinter)
+ ClosePrinter(hPrinter);
+
if (hFile != INVALID_HANDLE_VALUE)
CloseHandle(hFile);
- if (hPrinter)
- ClosePrinter(hPrinter);
-
return ReturnValue;
}