mirror of
https://github.com/reactos/reactos.git
synced 2024-07-01 18:24:24 +00:00
[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. svn path=/trunk/; revision=73047
This commit is contained in:
parent
b5beb7dffc
commit
688b18d88c
|
@ -1,4 +1,4 @@
|
||||||
add_executable(winspool_print main.c)
|
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_importlibs(winspool_print winspool msvcrt kernel32)
|
||||||
add_cd_file(TARGET winspool_print DESTINATION reactos/system32 FOR all)
|
add_cd_file(TARGET winspool_print DESTINATION reactos/system32 FOR all)
|
||||||
|
|
|
@ -1,26 +1,38 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <windows.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;
|
int ReturnValue = 1;
|
||||||
DWORD dwRead;
|
DWORD dwFileSize;
|
||||||
DWORD dwWritten;
|
DWORD dwRead, dwWritten;
|
||||||
HANDLE hFile = INVALID_HANDLE_VALUE;
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
||||||
HANDLE hPrinter = NULL;
|
HANDLE hPrinter = NULL;
|
||||||
DOC_INFO_1W docInfo;
|
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)
|
if (hFile == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
printf("CreateFileW failed, last error is %lu!\n", GetLastError());
|
printf("CreateFileW failed, last error is %lu!\n", GetLastError());
|
||||||
goto Cleanup;
|
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;
|
goto Cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +42,7 @@ int main()
|
||||||
goto Cleanup;
|
goto Cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Print to a printer, with the "RAW" datatype (pDatatype == NULL or "RAW") */
|
||||||
ZeroMemory(&docInfo, sizeof(docInfo));
|
ZeroMemory(&docInfo, sizeof(docInfo));
|
||||||
docInfo.pDocName = L"winspool_print";
|
docInfo.pDocName = L"winspool_print";
|
||||||
|
|
||||||
|
@ -45,11 +58,22 @@ int main()
|
||||||
goto Cleanup;
|
goto Cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (dwFileSize > 0)
|
||||||
|
{
|
||||||
|
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))
|
if (!WritePrinter(hPrinter, Buffer, dwRead, &dwWritten))
|
||||||
{
|
{
|
||||||
printf("WritePrinter failed, last error is %lu!\n", GetLastError());
|
printf("WritePrinter failed, last error is %lu!\n", GetLastError());
|
||||||
goto Cleanup;
|
goto Cleanup;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!EndPagePrinter(hPrinter))
|
if (!EndPagePrinter(hPrinter))
|
||||||
{
|
{
|
||||||
|
@ -66,11 +90,11 @@ int main()
|
||||||
ReturnValue = 0;
|
ReturnValue = 0;
|
||||||
|
|
||||||
Cleanup:
|
Cleanup:
|
||||||
if (hFile != INVALID_HANDLE_VALUE)
|
|
||||||
CloseHandle(hFile);
|
|
||||||
|
|
||||||
if (hPrinter)
|
if (hPrinter)
|
||||||
ClosePrinter(hPrinter);
|
ClosePrinter(hPrinter);
|
||||||
|
|
||||||
|
if (hFile != INVALID_HANDLE_VALUE)
|
||||||
|
CloseHandle(hFile);
|
||||||
|
|
||||||
return ReturnValue;
|
return ReturnValue;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue