You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
661 lines
15 KiB
661 lines
15 KiB
/////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1998 Active Voice Corporation. All Rights Reserved.
|
|
//
|
|
// Active Agent(r) and Unified Communications(tm) are trademarks of Active Voice Corporation.
|
|
//
|
|
// Other brand and product names used herein are trademarks of their respective owners.
|
|
//
|
|
// The entire program and user interface including the structure, sequence, selection,
|
|
// and arrangement of the dialog, the exclusively "yes" and "no" choices represented
|
|
// by "1" and "2," and each dialog message are protected by copyrights registered in
|
|
// the United States and by international treaties.
|
|
//
|
|
// Protected by one or more of the following United States patents: 5,070,526, 5,488,650,
|
|
// 5,434,906, 5,581,604, 5,533,102, 5,568,540, 5,625,676, 5,651,054.
|
|
//
|
|
// Active Voice Corporation
|
|
// Seattle, Washington
|
|
// USA
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
////
|
|
// app.c - Windows command line argument functions
|
|
////
|
|
|
|
#include "winlocal.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "app.h"
|
|
#include "file.h"
|
|
#include "loadlib.h"
|
|
#include "mem.h"
|
|
#include "str.h"
|
|
#include "sys.h"
|
|
#include "trace.h"
|
|
|
|
////
|
|
// private definitions
|
|
////
|
|
|
|
// app control struct
|
|
//
|
|
typedef struct APP
|
|
{
|
|
DWORD dwVersion;
|
|
HINSTANCE hInst;
|
|
HTASK hTask;
|
|
LPTSTR lpszFileName;
|
|
LPTSTR lpszDirectory;
|
|
LPTSTR lpszProfile;
|
|
LPTSTR lpszName;
|
|
HWND hwndMain;
|
|
BOOL fCtl3dEnabled;
|
|
HINSTANCE hInstCtl3d;
|
|
} APP, FAR *LPAPP;
|
|
|
|
// helper functions
|
|
//
|
|
static LPAPP AppGetPtr(HAPP hApp);
|
|
static HAPP AppGetHandle(LPAPP lpApp);
|
|
|
|
////
|
|
// public functions
|
|
////
|
|
|
|
// AppInit - initialize app engine
|
|
// <dwVersion> (i) must be APP_VERSION
|
|
// <hInst> (i) instance handle of calling module
|
|
// return handle (NULL if error)
|
|
//
|
|
HAPP DLLEXPORT WINAPI AppInit(DWORD dwVersion, HINSTANCE hInst)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp = NULL;
|
|
|
|
if (dwVersion != APP_VERSION)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if (hInst == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if ((lpApp = (LPAPP) MemAlloc(NULL, sizeof(APP), 0)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
{
|
|
TCHAR szPath[_MAX_PATH];
|
|
TCHAR szDrive[_MAX_DRIVE];
|
|
TCHAR szDir[_MAX_DIR];
|
|
TCHAR szFname[_MAX_FNAME];
|
|
TCHAR szExt[_MAX_EXT];
|
|
|
|
lpApp->dwVersion = dwVersion;
|
|
lpApp->hInst = hInst;
|
|
lpApp->hTask = GetCurrentTask();
|
|
lpApp->lpszFileName = NULL;
|
|
lpApp->lpszDirectory = NULL;
|
|
lpApp->lpszProfile = NULL;
|
|
lpApp->lpszName = NULL;
|
|
lpApp->hwndMain = NULL;
|
|
#ifdef _WIN32
|
|
lpApp->fCtl3dEnabled = (BOOL) (SysGetWindowsVersion() >= 400);
|
|
#else
|
|
lpApp->fCtl3dEnabled = FALSE;
|
|
#endif
|
|
lpApp->hInstCtl3d = NULL;
|
|
|
|
// get the full path of app executable
|
|
//
|
|
if (GetModuleFileName(hInst, szPath, SIZEOFARRAY(szPath)) <= 0)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if ((lpApp->lpszFileName = StrDup(szPath)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if (FileSplitPath(szPath,
|
|
szDrive, szDir, szFname, szExt) != 0)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
// get default app name
|
|
//
|
|
else if ((lpApp->lpszName = StrDup(szFname)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
// construct path to app directory
|
|
//
|
|
else if (FileMakePath(szPath,
|
|
szDrive, szDir, NULL, NULL) != 0)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if ((lpApp->lpszDirectory = StrDup(szPath)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
// construct path to app ini file
|
|
//
|
|
else if (AppDirectoryIsReadOnly(AppGetHandle(lpApp)) &&
|
|
FileMakePath(szPath, NULL, NULL, szFname, TEXT("ini")) != 0)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if (!AppDirectoryIsReadOnly(AppGetHandle(lpApp)) &&
|
|
FileMakePath(szPath, szDrive, szDir, szFname, TEXT("ini")) != 0)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if ((lpApp->lpszProfile = StrDup(szPath)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
}
|
|
|
|
if (!fSuccess)
|
|
{
|
|
AppTerm(AppGetHandle(lpApp));
|
|
lpApp = NULL;
|
|
}
|
|
|
|
return fSuccess ? AppGetHandle(lpApp) : NULL;
|
|
}
|
|
|
|
// AppTerm - shut down app engine
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return 0 if success
|
|
//
|
|
int DLLEXPORT WINAPI AppTerm(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
{
|
|
// shut down Ctl3d if necessary
|
|
//
|
|
if (AppEnable3dControls(hApp, FALSE, 0) != 0)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
if (lpApp->lpszFileName != NULL)
|
|
{
|
|
StrDupFree(lpApp->lpszFileName);
|
|
lpApp->lpszFileName = NULL;
|
|
}
|
|
|
|
if (lpApp->lpszDirectory != NULL)
|
|
{
|
|
StrDupFree(lpApp->lpszDirectory);
|
|
lpApp->lpszDirectory = NULL;
|
|
}
|
|
|
|
if (lpApp->lpszProfile != NULL)
|
|
{
|
|
StrDupFree(lpApp->lpszProfile);
|
|
lpApp->lpszProfile = NULL;
|
|
}
|
|
|
|
if (lpApp->lpszName != NULL)
|
|
{
|
|
StrDupFree(lpApp->lpszName);
|
|
lpApp->lpszName = NULL;
|
|
}
|
|
|
|
if ((lpApp = MemFree(NULL, lpApp)) != NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
}
|
|
|
|
return fSuccess ? 0 : -1;
|
|
}
|
|
|
|
// AppGetInstance - get instance handle
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return instance handle, NULL if error
|
|
//
|
|
HINSTANCE DLLEXPORT WINAPI AppGetInstance(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
HINSTANCE hInst;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
hInst = lpApp->hInst;
|
|
|
|
return fSuccess ? hInst : NULL;
|
|
}
|
|
|
|
// AppGetFileName - get full path of application executable
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return pointer to app file name, NULL if error
|
|
//
|
|
LPCTSTR DLLEXPORT WINAPI AppGetFileName(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
LPTSTR lpszFileName;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
lpszFileName = lpApp->lpszFileName;
|
|
|
|
return fSuccess ? lpszFileName : NULL;
|
|
}
|
|
|
|
// AppGetDirectory - get drive and directory of application executable
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return pointer to app path, NULL if error
|
|
//
|
|
LPCTSTR DLLEXPORT WINAPI AppGetDirectory(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
LPTSTR lpszDirectory;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
lpszDirectory = lpApp->lpszDirectory;
|
|
|
|
return fSuccess ? lpszDirectory : NULL;
|
|
}
|
|
|
|
// AppDirectoryIsReadOnly - test if application directory is read-only
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return TRUE if read-only, otherwise FALSE
|
|
//
|
|
BOOL DLLEXPORT WINAPI AppDirectoryIsReadOnly(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
BOOL fIsReadOnly;
|
|
TCHAR szPath[_MAX_PATH];
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if (FileMakePath(szPath, NULL,
|
|
AppGetDirectory(hApp), TEXT("readonly"), TEXT("ini")) != 0)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
{
|
|
// [ReadOnly]
|
|
// ReadOnly=1
|
|
//
|
|
fIsReadOnly = (BOOL) GetPrivateProfileInt(TEXT("ReadOnly"),
|
|
TEXT("ReadOnly"), 0, szPath);
|
|
}
|
|
|
|
return fSuccess ? fIsReadOnly : FALSE;
|
|
}
|
|
|
|
// AppGetProfile - get ini filename of application
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return pointer to app profile, NULL if error
|
|
//
|
|
// NOTE: by default, the filename returned by this function
|
|
// has the same file path and name as the application executable,
|
|
// with a ".ini" extension. If the application directory is
|
|
// read-only, the Windows directory is used instead.
|
|
// To override the default, use the AppSetProfile() function.
|
|
//
|
|
LPCTSTR DLLEXPORT WINAPI AppGetProfile(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
LPTSTR lpszProfile;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
lpszProfile = lpApp->lpszProfile;
|
|
|
|
return fSuccess ? lpszProfile : NULL;
|
|
}
|
|
|
|
// AppSetProfile - set ini filename of application
|
|
// <hApp> (i) handle returned from AppInit
|
|
// <lpszProfile> (i) ini filename
|
|
// return 0 if success
|
|
//
|
|
int DLLEXPORT WINAPI AppSetProfile(HAPP hApp, LPCTSTR lpszProfile)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
{
|
|
// save old profile
|
|
//
|
|
LPTSTR lpszProfileOld = lpApp->lpszProfile;
|
|
|
|
// set new profile
|
|
//
|
|
if ((lpApp->lpszProfile = StrDup(lpszProfile)) == NULL)
|
|
{
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
// restore old profile if error
|
|
//
|
|
lpApp->lpszProfile = lpszProfileOld;
|
|
}
|
|
|
|
// free old profile
|
|
//
|
|
else if (lpszProfileOld != NULL)
|
|
{
|
|
StrDupFree(lpszProfileOld);
|
|
lpszProfileOld = NULL;
|
|
}
|
|
}
|
|
|
|
return fSuccess ? 0 : -1;
|
|
}
|
|
|
|
// AppGetName - get name of application
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return pointer to app profile, NULL if error
|
|
//
|
|
// NOTE: by default, the name returned by this function
|
|
// has the same root name as the application executable,
|
|
// with no extension. To override the default, use the
|
|
// AppSetName() function.
|
|
//
|
|
LPCTSTR DLLEXPORT WINAPI AppGetName(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
LPTSTR lpszName;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
lpszName = lpApp->lpszName;
|
|
|
|
return fSuccess ? lpszName : NULL;
|
|
}
|
|
|
|
// AppSetName - set name of application
|
|
// <hApp> (i) handle returned from AppInit
|
|
// <lpszName> (i) application name
|
|
// return 0 if success
|
|
//
|
|
int DLLEXPORT WINAPI AppSetName(HAPP hApp, LPCTSTR lpszName)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
{
|
|
// save old name
|
|
//
|
|
LPTSTR lpszNameOld = lpApp->lpszName;
|
|
|
|
// set new name
|
|
//
|
|
if ((lpApp->lpszName = StrDup(lpszName)) == NULL)
|
|
{
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
// restore old name if error
|
|
//
|
|
lpApp->lpszName = lpszNameOld;
|
|
}
|
|
|
|
// free old name
|
|
//
|
|
else if (lpszNameOld != NULL)
|
|
{
|
|
StrDupFree(lpszNameOld);
|
|
lpszNameOld = NULL;
|
|
}
|
|
}
|
|
|
|
return fSuccess ? 0 : -1;
|
|
}
|
|
|
|
// AppGetMainWnd - get main window of application
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return window handle, NULL if error or none
|
|
//
|
|
HWND DLLEXPORT WINAPI AppGetMainWnd(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
HWND hwndMain;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
hwndMain = lpApp->hwndMain;
|
|
|
|
return fSuccess ? hwndMain : NULL;
|
|
}
|
|
|
|
// AppSetMainWnd - set main window of application
|
|
// <hApp> (i) handle returned from AppInit
|
|
// <hwndMain> (i) handle to main window
|
|
// return 0 if success
|
|
//
|
|
int DLLEXPORT WINAPI AppSetMainWnd(HAPP hApp, HWND hwndMain)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
lpApp->hwndMain = hwndMain;
|
|
|
|
return fSuccess ? 0 : -1;
|
|
}
|
|
|
|
// ctl3d stuff
|
|
//
|
|
#ifdef _WIN32
|
|
#define CTL3D_LIBRARY TEXT("ctl3d32.dll")
|
|
#else
|
|
#define CTL3D_LIBRARY TEXT("ctl3dv2.dll")
|
|
#endif
|
|
typedef BOOL (WINAPI* LPFNCTL3D)();
|
|
|
|
// AppEnable3dControls - give standard controls a 3d appearance
|
|
// <hApp> (i) handle returned from AppInit
|
|
// <fEnable> (i) TRUE to enable, FALSE to disable
|
|
// <dwFlags> (i) control flags
|
|
// 0 reserved; must be zero
|
|
// return 0 if success, -1 if error
|
|
//
|
|
int DLLEXPORT WINAPI AppEnable3dControls(HAPP hApp, BOOL fEnable, DWORD dwFlags)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
#ifdef _WIN32
|
|
// nothing to do if OS already supports 3d controls
|
|
//
|
|
else if (SysGetWindowsVersion() >= 400)
|
|
lpApp->fCtl3dEnabled = fEnable;
|
|
#endif
|
|
|
|
// enable 3d controls unless they already are enabled
|
|
//
|
|
else if (fEnable && !lpApp->fCtl3dEnabled)
|
|
{
|
|
LPFNCTL3D lpfnCtl3dRegister;
|
|
LPFNCTL3D lpfnCtl3dAutoSubclass;
|
|
|
|
if (lpApp->hInstCtl3d != NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if ((lpApp->hInstCtl3d = LoadLibraryPath(CTL3D_LIBRARY,
|
|
NULL, 0)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if ((lpfnCtl3dRegister = (LPFNCTL3D) GetProcAddress(
|
|
lpApp->hInstCtl3d, "Ctl3dRegister")) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if (!((*lpfnCtl3dRegister)(lpApp->hInstCtl3d)))
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if ((lpfnCtl3dAutoSubclass = (LPFNCTL3D) GetProcAddress(
|
|
lpApp->hInstCtl3d, "Ctl3dAutoSubclass")) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if (!((*lpfnCtl3dAutoSubclass)(lpApp->hInstCtl3d)))
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
lpApp->fCtl3dEnabled = TRUE;
|
|
}
|
|
|
|
// disable 3d controls unless they already are disabled
|
|
//
|
|
else if (!fEnable && lpApp->fCtl3dEnabled)
|
|
{
|
|
LPFNCTL3D lpfnCtl3dUnregister;
|
|
|
|
if (lpApp->hInstCtl3d == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if ((lpfnCtl3dUnregister = (LPFNCTL3D) GetProcAddress(
|
|
lpApp->hInstCtl3d, "Ctl3dUnregister")) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if (!((*lpfnCtl3dUnregister)(lpApp->hInstCtl3d)))
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
#ifdef _WIN32
|
|
else if (!FreeLibrary(lpApp->hInstCtl3d))
|
|
{
|
|
fSuccess = TraceFALSE(NULL);
|
|
TracePrintf_2(NULL, 5,
|
|
TEXT("FreeLibrary(\"%s\") failed (%lu)\n"),
|
|
(LPTSTR) CTL3D_LIBRARY,
|
|
(unsigned long) GetLastError());
|
|
}
|
|
#else
|
|
else if (FreeLibrary(lpApp->hInstCtl3d), FALSE)
|
|
;
|
|
#endif
|
|
else
|
|
{
|
|
lpApp->hInstCtl3d = NULL;
|
|
lpApp->fCtl3dEnabled = FALSE;
|
|
}
|
|
}
|
|
|
|
return fSuccess ? 0 : -1;
|
|
}
|
|
|
|
// AppIs3dControlsEnabled - return TRUE if 3d controls enabled
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return TRUE if 3d controls enabled, otherwise FALSE
|
|
//
|
|
BOOL DLLEXPORT WINAPI AppIs3dControlsEnabled(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
BOOL fEnabled;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else
|
|
fEnabled = lpApp->fCtl3dEnabled;
|
|
|
|
return fSuccess ? fEnabled : FALSE;
|
|
}
|
|
|
|
// AppOnSysColorChange - handler for WM_SYSCOLORCHANGE message
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return 0 if success
|
|
//
|
|
LRESULT DLLEXPORT WINAPI AppOnSysColorChange(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
|
|
if ((lpApp = AppGetPtr(hApp)) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if (lpApp->fCtl3dEnabled)
|
|
{
|
|
LPFNCTL3D lpfnCtl3dColorChange;
|
|
|
|
if (lpApp->hInstCtl3d == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if ((lpfnCtl3dColorChange = (LPFNCTL3D) GetProcAddress(
|
|
lpApp->hInstCtl3d, "Ctl3dColorChange")) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if (!((*lpfnCtl3dColorChange)()))
|
|
fSuccess = TraceFALSE(NULL);
|
|
}
|
|
|
|
return fSuccess ? 0 : -1;
|
|
}
|
|
|
|
////
|
|
// helper functions
|
|
////
|
|
|
|
// AppGetPtr - verify that arg handle is valid,
|
|
// <hApp> (i) handle returned from AppInit
|
|
// return corresponding arg pointer (NULL if error)
|
|
//
|
|
static LPAPP AppGetPtr(HAPP hApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
LPAPP lpApp;
|
|
|
|
if ((lpApp = (LPAPP) hApp) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
else if (IsBadWritePtr(lpApp, sizeof(APP)))
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
#ifdef CHECKTASK
|
|
// make sure current task owns the arg handle
|
|
//
|
|
else if (lpApp->hTask != GetCurrentTask())
|
|
fSuccess = TraceFALSE(NULL);
|
|
#endif
|
|
|
|
return fSuccess ? lpApp : NULL;
|
|
}
|
|
|
|
// AppGetHandle - verify that arg pointer is valid,
|
|
// <lpApp> (i) pointer to APP struct
|
|
// return corresponding arg handle (NULL if error)
|
|
//
|
|
static HAPP AppGetHandle(LPAPP lpApp)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
HAPP hApp;
|
|
|
|
if ((hApp = (HAPP) lpApp) == NULL)
|
|
fSuccess = TraceFALSE(NULL);
|
|
|
|
return fSuccess ? hApp : NULL;
|
|
}
|
|
|