windows-nt/Source/XPSP1/NT/shell/ext/brfcase/filesync/syncapp/syncapp.c
2020-09-26 16:20:57 +08:00

201 lines
5 KiB
C

#include "syncapp.h"
#ifndef WIN32
#include <w32sys.h> // for IsPEFormat definition
#endif
static TCHAR const g_szAppName [] = TEXT("SYNCAPP") ;
static TCHAR const c_szDLL[] = TEXT("SYNCUI.DLL");
#ifdef UNICODE
# define BRIEFCASE_CREATE_ENTRY "Briefcase_CreateW"
#else
# define BRIEFCASE_CREATE_ENTRY "Briefcase_Create"
#endif
static CHAR const c_szFunction[] = BRIEFCASE_CREATE_ENTRY; // Lib entry point (never UNICODE)
static HINSTANCE hInst;
static HICON g_hIcon;
static HINSTANCE g_hModule;
static RUNDLLPROC g_lpfnCommand;
static HWND g_hwndStub;
static TCHAR s_szRunDLL32[] = TEXT("SYNCAPP.EXE ");
static BOOL ParseCommand(void)
{
// Load the library and get the procedure address
// Note that we try to get a module handle first, so we don't need
// to pass full file names around
//
g_hModule = GetModuleHandle(c_szDLL);
if (g_hModule)
{
TCHAR szName[MAXPATHLEN];
GetModuleFileName(g_hModule, szName, ARRAYSIZE(szName));
LoadLibrary(szName);
}
else
{
g_hModule = LoadLibrary(c_szDLL);
if ((UINT_PTR)g_hModule <= 32)
{
return(FALSE);
}
}
g_lpfnCommand = (RUNDLLPROC)GetProcAddress(g_hModule, c_szFunction);
if (!g_lpfnCommand)
{
FreeLibrary(g_hModule);
return(FALSE);
}
return(TRUE);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch(iMessage)
{
case WM_CREATE:
g_hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_DEFAULT));
break;
case WM_DESTROY:
break;
default:
return DefWindowProc(hWnd, iMessage, wParam, lParam) ;
break;
}
return 0L;
}
static BOOL InitStubWindow(HINSTANCE hInst, HINSTANCE hPrevInstance)
{
WNDCLASS wndclass;
if (!hPrevInstance)
{
wndclass.style = 0 ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInst ;
wndclass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_DEFAULT)) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = g_szAppName ;
if (!RegisterClass(&wndclass))
{
return(FALSE);
}
}
g_hwndStub = CreateWindow(g_szAppName, TEXT(""), 0,
0, 0, 0, 0, NULL, NULL, hInst, NULL);
return(g_hwndStub != NULL);
}
static void CleanUp(void)
{
DestroyWindow(g_hwndStub);
FreeLibrary(g_hModule);
}
int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszWinMainCmdLine, int nCmdShow)
{
LPTSTR lpszCmdLine;
hInst = hInstance;
//
// The command line passed to WinMain is always ANSI, so for UNICODE
// builds we need to ask for the command line in UNICODE
//
#ifdef UNICODE
//
// Since the command line returned from GetCommandLine includes
// argv[0], but the one passed to Winmain does not, we have
// to strip argv[0] in order to be equivalent
//
lpszCmdLine = GetCommandLine();
//
// Skip past program name (first token in command line).
// Check for and handle quoted program name.
//
if ( *lpszCmdLine == '\"' )
{
//
// Scan, and skip over, subsequent characters until
// another double-quote or a null is encountered.
//
while ( *++lpszCmdLine && (*lpszCmdLine
!= '\"') );
//
// If we stopped on a double-quote (usual case), skip
// over it.
//
if ( *lpszCmdLine == '\"' )
lpszCmdLine++;
}
else
{
while (*lpszCmdLine > ' ')
lpszCmdLine++;
}
//
// Skip past any white space preceeding the second token.
//
while (*lpszCmdLine && (*lpszCmdLine <= ' '))
{
lpszCmdLine++;
}
#else
lpszCmdLine = lpszWinMainCmdLine;
#endif
// turn off critical error stuff
SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
if (!ParseCommand())
{
goto Error0;
}
if (!InitStubWindow(hInstance, hPrevInstance))
{
goto Error1;
}
(*g_lpfnCommand)(g_hwndStub, hInstance, lpszCmdLine, nCmdShow);
Error1:
CleanUp();
Error0:
return(FALSE);
}