164 lines
3.8 KiB
C
164 lines
3.8 KiB
C
/*++
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
fmt.c
|
||
|
||
Abstract:
|
||
|
||
Example of a test code using FormatMessage() api.
|
||
|
||
Author:
|
||
|
||
Vladimir Z. Vulovic (vladimv) 06 - November - 1992
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
Revision History:
|
||
|
||
06-Nov-1992 vladimv
|
||
Created
|
||
|
||
--*/
|
||
|
||
#include "atclient.h"
|
||
#include <stdlib.h> // exit()
|
||
#include <stdio.h> // printf
|
||
#include <wchar.h> // wcslen
|
||
// #include <tstring.h> // wcslen
|
||
#include <apperr.h> // APE_AT_USAGE
|
||
#include <apperr2.h> // APE2_GEN_MONDAY + APE2_*
|
||
#include <lmapibuf.h> // NetApiBufferFree
|
||
|
||
|
||
BOOL
|
||
DecimalStringToDword(
|
||
IN CHAR * pDecimalString,
|
||
OUT PDWORD pNumber
|
||
)
|
||
/*++
|
||
|
||
This routine converts a string into a DWORD if it possibly can.
|
||
The conversion is successful if string is decimal numeric and
|
||
does not lead to an overflow.
|
||
|
||
pDecimalString ptr to decimal string
|
||
pNumber ptr to number
|
||
|
||
FALSE invalid number
|
||
TRUE valid number
|
||
|
||
--*/
|
||
{
|
||
DWORD Value;
|
||
DWORD OldValue;
|
||
DWORD digit;
|
||
|
||
if ( pDecimalString == NULL || *pDecimalString == 0) {
|
||
return( FALSE);
|
||
}
|
||
|
||
Value = 0;
|
||
|
||
while ( (digit = *pDecimalString++) != 0) {
|
||
|
||
if ( digit < L'0' || digit > L'9') {
|
||
return( FALSE); // not a decimal string
|
||
}
|
||
|
||
OldValue = Value;
|
||
Value = digit - L'0' + 10 * Value;
|
||
if ( Value < OldValue) {
|
||
return( FALSE); // overflow
|
||
}
|
||
}
|
||
|
||
*pNumber = Value;
|
||
return( TRUE);
|
||
}
|
||
|
||
|
||
VOID __cdecl
|
||
main(
|
||
int argc,
|
||
CHAR ** argv
|
||
)
|
||
{
|
||
LPVOID lpSource;
|
||
DWORD length;
|
||
WCHAR buffer[ 256];
|
||
BOOL success;
|
||
DWORD number;
|
||
WCHAR * strings[ 1];
|
||
|
||
if ( argc != 2) {
|
||
printf( "%s", "Usage: fmt error_number\n");
|
||
exit( -1);
|
||
}
|
||
|
||
|
||
success = DecimalStringToDword( argv[ 1], &number);
|
||
if ( success != TRUE) {
|
||
printf( "Usage: fmt decimal_string_for_error_number\n");
|
||
exit( -1);
|
||
}
|
||
|
||
lpSource = LoadLibrary( L"netmsg.dll");
|
||
if ( lpSource == NULL) {
|
||
printf( " LoadLibrary() fails with winError = %d\n", GetLastError());
|
||
exit( -1);
|
||
}
|
||
|
||
length = FormatMessage(
|
||
FORMAT_MESSAGE_FROM_HMODULE | // dwFlags
|
||
FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
||
lpSource,
|
||
number, // MessageId
|
||
0, // dwLanguageId
|
||
buffer, // lpBuffer
|
||
sizeof( buffer), // nSize
|
||
NULL
|
||
);
|
||
|
||
if ( length == 0) {
|
||
printf( " FormatMessage() fails with winError = %d\n", GetLastError());
|
||
}
|
||
|
||
printf( "%s", buffer);
|
||
|
||
if ( number != APE2_GEN_DEFAULT_NO) {
|
||
goto exit;
|
||
}
|
||
|
||
strings[ 0] = buffer;
|
||
|
||
printf( "\nSpecial case of APE_GEN_DEFAULT_NO inserted in APE_OkToProceed\n");
|
||
|
||
length = FormatMessage(
|
||
FORMAT_MESSAGE_FROM_HMODULE | // dwFlags
|
||
FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
||
lpSource,
|
||
APE_OkToProceed, // MessageId
|
||
0, // dwLanguageId
|
||
buffer, // lpBuffer
|
||
sizeof( buffer), // nSize
|
||
(va_list *)strings // lpArguments
|
||
);
|
||
|
||
if ( length == 0) {
|
||
printf( " FormatMessage() fails with winError = %d\n", GetLastError());
|
||
}
|
||
|
||
printf( "%s", buffer);
|
||
|
||
exit:
|
||
success = FreeLibrary( lpSource);
|
||
if ( success != TRUE) {
|
||
printf( " FreeLibrary() fails with winError = %d\n", GetLastError());
|
||
}
|
||
}
|