|
|
#include "faxrtp.h"
#pragma hdrstop
typedef struct _STRING_TABLE { DWORD ResourceId; DWORD InternalId; LPCTSTR String; } STRING_TABLE, *PSTRING_TABLE;
static STRING_TABLE StringTable[] = { { IDS_NO_MAPI_LOGON, IDS_NO_MAPI_LOGON, NULL }, { IDS_SERVICE_NAME, IDS_SERVICE_NAME, NULL }, { IDS_DEFAULT, IDS_DEFAULT, NULL } };
#define CountStringTable (sizeof(StringTable)/sizeof(STRING_TABLE))
LPTSTR GetLastErrorText( DWORD ErrorCode )
/*++
Routine Description:
Gets a string for a given WIN32 error code.
Arguments:
ErrorCode - WIN32 error code.
Return Value:
Pointer to a string representing the ErrorCode.
--*/
{ static TCHAR ErrorBuf[256]; DWORD Count;
Count = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, ErrorCode, LANG_NEUTRAL, ErrorBuf, sizeof(ErrorBuf), NULL );
if (Count) { if (ErrorBuf[Count-1] == TEXT('\n')) { ErrorBuf[Count-1] = 0; } if ((Count>1) && (ErrorBuf[Count-2] == TEXT('\r'))) { ErrorBuf[Count-2] = 0; } }
return ErrorBuf; }
VOID InitializeStringTable( VOID ) { DWORD i; HINSTANCE hInstance; TCHAR Buffer[256];
hInstance = GetModuleHandle(NULL);
for (i=0; i<CountStringTable; i++) {
if (LoadString( hInstance, StringTable[i].ResourceId, Buffer, sizeof(Buffer)/sizeof(TCHAR) )) {
StringTable[i].String = (LPCTSTR) MemAlloc( StringSize( Buffer ) ); if (!StringTable[i].String) { StringTable[i].String = TEXT(""); } else { _tcscpy( (LPTSTR)StringTable[i].String, Buffer ); }
} else {
StringTable[i].String = TEXT("");
} } }
LPCTSTR GetString( DWORD InternalId )
/*++
Routine Description:
Loads a resource string and returns a pointer to the string. The caller must free the memory.
Arguments:
ResourceId - resource string id
Return Value:
pointer to the string
--*/
{ DWORD i;
for (i=0; i<CountStringTable; i++) { if (StringTable[i].InternalId == InternalId) { return StringTable[i].String; } }
return NULL; }
DWORD MessageBoxThread( IN PMESSAGEBOX_DATA MsgBox ) { DWORD Answer = (DWORD) MessageBox( NULL, MsgBox->Text, GetString( IDS_SERVICE_NAME ), MsgBox->Type | MB_SERVICE_NOTIFICATION );
if (MsgBox->Response) { *MsgBox->Response = Answer; }
MemFree( (LPBYTE) MsgBox->Text ); MemFree( MsgBox );
return 0; }
BOOL ServiceMessageBox( IN LPCTSTR MsgString, IN DWORD Type, IN BOOL UseThread, IN LPDWORD Response, IN ... ) { #define BUFSIZE 1024
PMESSAGEBOX_DATA MsgBox; DWORD ThreadId; HANDLE hThread; DWORD Answer; LPTSTR buf; va_list arg_ptr;
buf = (LPTSTR) MemAlloc( BUFSIZE ); if (!buf) { return FALSE; }
va_start( arg_ptr, Response ); _vsntprintf( buf, BUFSIZE, MsgString, arg_ptr ); va_end( arg_ptr );
if (UseThread) {
MsgBox = (PMESSAGEBOX_DATA) MemAlloc( sizeof(MESSAGEBOX_DATA) ); if (!MsgBox) { return FALSE; }
MsgBox->Text = buf; MsgBox->Response = Response; MsgBox->Type = Type;
hThread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE) MessageBoxThread, (LPVOID) MsgBox, 0, &ThreadId );
if (!hThread) { return FALSE; }
return TRUE; }
Answer = MessageBox( NULL, buf, GetString( IDS_SERVICE_NAME ), Type | MB_SERVICE_NOTIFICATION ); if (Response) { *Response = Answer; }
MemFree( buf );
return TRUE; }
|