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.
1149 lines
29 KiB
1149 lines
29 KiB
/*
|
|
Related Files:
|
|
[Section = Compile]
|
|
%OsUtilDir%:OsUtil.hxx
|
|
[Section =End]
|
|
|
|
*/
|
|
/* -------------------------------------------------------------------------
|
|
Project : OB - Type Information Interface
|
|
Platform : Win32
|
|
Module : osutil.cpp
|
|
|
|
Copyright (C) 1992-3, Microsoft Corporation
|
|
---------------------------------------------------------------------------
|
|
Notes : Library routines for programs that run under Win32
|
|
---------------------------------------------------------------------------
|
|
Revision History:
|
|
|
|
[ 0] 09-Mar-1993 Angelach: Created Test
|
|
[ 1] 10-Mar-1993 Angelach: added support to Win32s
|
|
[ 2] 06-Jul-1994 Angelach: added support for remoting
|
|
typelib testing
|
|
[ 3] 27-Oct-1994 Angelach: added LCMapStringX
|
|
[ 4] 06-Mar-1995 Angelach: added osGetNetDrive
|
|
[ 5] 07-Mar-1995 Angelach: added Memory-leak detection
|
|
--------------------------------------------------------------------------- */
|
|
|
|
#include "osutil32.hxx"
|
|
|
|
IMalloc FAR* ppmalloc ; // need for memory allocation
|
|
IMallocSpy FAR* g_IMallocSpy ; // [7]
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osAllocSpaces
|
|
|
|
PURPOSE : obtains some spaces from the far heap
|
|
|
|
INPUTS : nSize - no of bytes to be allocated
|
|
|
|
OUTPUT : pointer to the allocated space
|
|
|
|
NOTES : caller is responsible to free up the memory after used
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
VOID FAR * osAllocSpaces(WORD nSize)
|
|
{
|
|
return ( (VOID FAR *)malloc(nSize) ) ;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osGetRootDir
|
|
|
|
PURPOSE : Retrieves pathspec of the root directory
|
|
|
|
INPUTS : lpszRootDir - storage for the pathspec
|
|
|
|
OUTPUT : none
|
|
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
VOID FAR osGetRootDir(LPXSTR lpszRootDir)
|
|
{
|
|
osStrCpy(lpszRootDir, XSTR("c:")) ;
|
|
osStrCat(lpszRootDir, szPathSep) ;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osGetCurDir
|
|
|
|
PURPOSE : Retrieves pathspec of the current directory
|
|
|
|
INPUTS : lpszCurDir - storage for the pathspec
|
|
|
|
OUTPUT : True if information is retrieved successfully; otherwise, False
|
|
lpszCurDir contains the pathspec if True
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
BOOL FAR osGetCurDir(LPXSTR lpszCurDir)
|
|
{
|
|
int i ;
|
|
#if defined (OAU) && !defined (UNICODE) // [1]
|
|
char szBufferC[256];
|
|
|
|
i = GetCurrentDirectory((DWORD)256, szBufferC) ;
|
|
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szBufferC,
|
|
-1,
|
|
lpszCurDir,
|
|
256);
|
|
#else // if OAU && ! UNICODE
|
|
i = GetCurrentDirectory((DWORD)256, lpszCurDir) ;
|
|
#endif // if OAU && ! UNICODE
|
|
|
|
if ( i != 0 )
|
|
return TRUE ; // info of the current directory
|
|
else // is retrieved successfully
|
|
return FALSE ;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osMkDir
|
|
|
|
PURPOSE : Creates a subdirectory
|
|
|
|
INPUTS : lpszSubDir - name of the subdirectory to be created
|
|
|
|
OUTPUT : True if subdirectory is created successfully; otherwise, False
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
BOOL FAR osMkDir(LPXSTR lpszSubDir)
|
|
{
|
|
SECURITY_ATTRIBUTES sa ;
|
|
BOOL rCode ;
|
|
|
|
sa.nLength = sizeof(SECURITY_ATTRIBUTES) ;
|
|
sa.lpSecurityDescriptor = NULL ;
|
|
sa.bInheritHandle = FALSE ;
|
|
|
|
#if defined (OAU) && !defined (UNICODE) // [1]
|
|
char szBufferS[256];
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
lpszSubDir,
|
|
-1,
|
|
szBufferS,
|
|
256,
|
|
NULL,
|
|
NULL);
|
|
rCode = CreateDirectory(szBufferS, &sa) ;
|
|
#else // if OAU && ! UNICODE
|
|
rCode = CreateDirectory(lpszSubDir, &sa) ;
|
|
#endif // if OAU && ! UNICODE
|
|
|
|
return rCode;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osItoA
|
|
|
|
PURPOSE : Gets the string representation of an integer
|
|
|
|
INPUTS : inVal - the integer in concern
|
|
lpsz - the string representation
|
|
|
|
OUTPUT : the string representation of inVal will be returned via lpsz
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
VOID FAR osItoA (int inVal, LPXSTR lpsz)
|
|
{
|
|
char szlTmp[20] ;
|
|
|
|
_itoa(inVal, szlTmp, 10) ;
|
|
#ifdef OAU
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szlTmp,
|
|
-1,
|
|
lpsz,
|
|
20);
|
|
#else // OAU
|
|
osStrCpy(lpsz, szlTmp) ;
|
|
#endif // OAU
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osLtoA
|
|
|
|
PURPOSE : Gets the string representation of a long integer
|
|
|
|
INPUTS : inVal - the long integer in concern
|
|
lpsz - the string representation
|
|
|
|
OUTPUT : the string representation of inVal will be returned via lpsz
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
VOID FAR osLtoA (long inVal, LPXSTR lpsz)
|
|
{
|
|
char szlTmp[20] ;
|
|
|
|
_ltoa(inVal, szlTmp, 10) ;
|
|
#ifdef OAU
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szlTmp,
|
|
-1,
|
|
lpsz,
|
|
20);
|
|
#else // OAU
|
|
osStrCpy(lpsz, szlTmp) ;
|
|
#endif // OAU
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osAtoL
|
|
|
|
PURPOSE : Gets the long integer from a string representing that value
|
|
|
|
INPUTS : lpsz - the string representation
|
|
|
|
OUTPUT : the long integer
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
long FAR osAtoL (LPXSTR lpsz)
|
|
{
|
|
|
|
#ifdef OAU
|
|
char szlTmp[20];
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
lpsz,
|
|
-1,
|
|
szlTmp,
|
|
20,
|
|
NULL,
|
|
NULL);
|
|
|
|
return atol(szlTmp) ;
|
|
#else
|
|
return atol(lpsz) ;
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osGetNetDrive
|
|
|
|
PURPOSE : Establish/Break a net connection
|
|
|
|
INPUTS : lpszNetDir - string to receieve the network drive letter
|
|
bnAct - flag for establishing or breaking the net connection
|
|
TRUE: establish a net connection
|
|
FALSE: break a net connection
|
|
|
|
OUTPUT : True if net connect is established/broken successfully
|
|
|
|
NOTES : Since Win32s has no API's that support net work action; this
|
|
routine does nothing for right now. It can be modified to
|
|
establish/break a net connection programmatically in the future.
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
BOOL FAR osGetNetDrive(LPXSTR lpszNetDir, LPXSTR lpUNCDir, BOOL /*bnAct*/) // [4]
|
|
{
|
|
osStrCpy(lpszNetDir, XSTR("z:\\tmp\\")) ;
|
|
osStrCpy(lpUNCDir, XSTR("\\\\apputest\\slm\\tmp\\")) ;
|
|
|
|
return TRUE ;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osCreateGuid
|
|
|
|
PURPOSE : Converts a GUID value from string to GUID format
|
|
|
|
INPUTS : lpszGuid - string contains the desired GUID value
|
|
|
|
OUTPUT : pointer to the GUID structure
|
|
|
|
NOTES : caller is responsible to free up the memory after used
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
GUID FAR * osCreateGuid(LPXSTR lpszGuid)
|
|
{
|
|
|
|
GUID FAR * lpGuid ;
|
|
HRESULT hRes ;
|
|
|
|
lpGuid = (GUID FAR *) osAllocSpaces(sizeof(GUID)*2) ;// allocate space
|
|
// for the Guid
|
|
if ( lpGuid )
|
|
{ // convert string to GUID format
|
|
hRes = CLSIDFromStringX(lpszGuid, (LPCLSID)lpGuid);
|
|
if ( LOWORD (hRes) )
|
|
{
|
|
osDeAllocSpaces ((LPXSTR)lpGuid) ; // release space before exit
|
|
return NULL ;
|
|
}
|
|
else
|
|
return lpGuid ; // return pointer to the
|
|
} // GUID structure
|
|
else
|
|
return NULL ; // no space is allocated
|
|
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osRetrieveGuid
|
|
|
|
PURPOSE : Converts a GUID structure to a readable string format
|
|
|
|
INPUTS : lpszGuid - string representation of the GUID will be returned
|
|
GUID - the GUID structure in concern
|
|
|
|
OUTPUT : True if conversion is succeed
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
BOOL FAR osRetrieveGuid (LPXSTR lpszGuid, GUID inGuid)
|
|
{
|
|
LPOLESTR lpszTmp ;
|
|
HRESULT hRes ;
|
|
// allocate memory for the string
|
|
hRes = StringFromCLSID((REFCLSID) inGuid, &lpszTmp) ;
|
|
if ( LOWORD (hRes) ) // representation
|
|
{
|
|
ppmalloc->Free(lpszTmp) ;
|
|
return FALSE ;
|
|
}
|
|
else
|
|
{
|
|
#ifdef OAU
|
|
osStrCpy (lpszGuid, lpszTmp) ;
|
|
#else
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
lpszTmp,
|
|
-1,
|
|
lpszGuid,
|
|
40,
|
|
NULL,
|
|
NULL);
|
|
#endif
|
|
ppmalloc->Free(lpszTmp) ;
|
|
return TRUE ;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osGetSize
|
|
|
|
PURPOSE : returns size of the input data
|
|
|
|
INPUTS : inVT - data type; WORD
|
|
|
|
OUTPUT : size of inVT; WORD
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
WORD FAR osGetSize (WORD inVT)
|
|
{
|
|
WORD tSize ;
|
|
|
|
switch ( inVT )
|
|
{
|
|
case VT_I2:
|
|
tSize = sizeof(short) ;
|
|
break ;
|
|
case VT_I4:
|
|
tSize = sizeof(long) ;
|
|
break ;
|
|
case VT_R4:
|
|
tSize = sizeof(float) ;
|
|
break ;
|
|
case VT_R8:
|
|
tSize = sizeof(double) ;
|
|
break ;
|
|
case VT_CY:
|
|
tSize = sizeof(CY) ;
|
|
break ;
|
|
case VT_DATE:
|
|
tSize = sizeof(DATE) ;
|
|
break ;
|
|
case VT_BSTR:
|
|
tSize = sizeof(BSTR) ;
|
|
break ;
|
|
case VT_ERROR:
|
|
tSize = sizeof(SCODE) ;
|
|
break ;
|
|
case VT_BOOL:
|
|
tSize = sizeof(VARIANT_BOOL) ;
|
|
break ;
|
|
case VT_VARIANT:
|
|
tSize = sizeof(VARIANT) ;
|
|
break ;
|
|
case VT_I1:
|
|
tSize = sizeof(char) ;
|
|
break ;
|
|
case VT_UI1:
|
|
tSize = sizeof(char) ;
|
|
break ;
|
|
case VT_UI2:
|
|
tSize = sizeof(short) ;
|
|
break ;
|
|
case VT_UI4:
|
|
tSize = sizeof(long) ;
|
|
break ;
|
|
case VT_I8:
|
|
tSize = sizeof(long)*2 ;
|
|
break ;
|
|
case VT_UI8:
|
|
tSize = sizeof(long)*2 ;
|
|
break ;
|
|
case VT_INT:
|
|
tSize = sizeof(int) ;
|
|
break ;
|
|
case VT_UINT:
|
|
tSize = sizeof(int) ;
|
|
break ;
|
|
case VT_VOID:
|
|
tSize = 0 ;
|
|
break ;
|
|
case VT_HRESULT:
|
|
tSize = sizeof(HRESULT) ;
|
|
break ;
|
|
case VT_LPSTR:
|
|
tSize = sizeof(LPSTR) ;
|
|
break ;
|
|
case VT_PTR:
|
|
tSize = 4 ;
|
|
break ;
|
|
case VT_SAFEARRAY:
|
|
tSize = sizeof(ARRAYDESC FAR *) ;
|
|
break ;
|
|
case VT_DISPATCH:
|
|
tSize = 4 ;
|
|
break ;
|
|
case VT_UNKNOWN:
|
|
tSize = 4 ;
|
|
break ;
|
|
default:
|
|
tSize = 1 ;
|
|
break ;
|
|
}
|
|
|
|
return tSize ;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osGetAlignment
|
|
|
|
PURPOSE : returns value of the alignment
|
|
|
|
INPUTS : inVT - data type; WORD
|
|
mAlign - max possible alignment; WORD
|
|
|
|
OUTPUT : value of the aliangment; WORD
|
|
|
|
NOTES : value is machine dependent:
|
|
Win16 = 1 (everything is packed -> always = 1)
|
|
Win32 = natural alignment; max is 4-byte align
|
|
mac = everything is on the even-byte boundary
|
|
see silver\cl\clutil.cxx for a table of the alignement information
|
|
---------------------------------------------------------------------------*/
|
|
|
|
WORD FAR osGetAlignment (WORD inVT, WORD mAlign)
|
|
{
|
|
WORD expAlign ;
|
|
|
|
expAlign = osGetSize(inVT) ; // check size of the data
|
|
|
|
return ( expAlign <= mAlign ? expAlign : mAlign ) ;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osGetEnumType
|
|
|
|
PURPOSE : return the type of an enum member
|
|
|
|
INPUTS : none
|
|
|
|
OUTPUT : VT_I2 for Win16; VARTYPE
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
VARTYPE FAR osGetEnumType ()
|
|
{
|
|
return VT_I4 ;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osOleInit
|
|
|
|
PURPOSE : Calls OleInitialize and returns its return code
|
|
|
|
INPUTS : none
|
|
|
|
OUTPUT : return code from calling OleInitialize; HRESULT
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
HRESULT FAR osOleInit ()
|
|
{
|
|
HRESULT hRes ;
|
|
|
|
hRes = OleInitialize(NULL) ; // Ole initialization
|
|
|
|
#ifdef DEBUG
|
|
if ( hRes != NOERROR )
|
|
return hRes ;
|
|
|
|
hRes = GetMallocSpy(&g_IMallocSpy) ; // [5]
|
|
hRes = CoRegisterMallocSpy(g_IMallocSpy) ;
|
|
|
|
if ( hRes != NOERROR )
|
|
OleUninitialize ;
|
|
else
|
|
hRes = CoGetMalloc(MEMCTX_TASK, &ppmalloc) ;
|
|
#else
|
|
if ( !LOWORD(hRes) ) // allocate memory for use in the
|
|
hRes = CoGetMalloc(MEMCTX_TASK, &ppmalloc) ; // the program
|
|
#endif
|
|
|
|
return hRes ;
|
|
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osOleUninit
|
|
|
|
PURPOSE : Calls OleUnInitialize
|
|
|
|
INPUTS : none
|
|
|
|
OUTPUT : none
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
VOID FAR osOleUninit ()
|
|
{
|
|
|
|
ppmalloc->Release () ; // release memory that was been
|
|
OleUninitialize (); // allocated at OleInitialize
|
|
#ifdef DEBUG
|
|
CoRevokeMallocSpy () ; // [5]
|
|
#endif
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osMessage
|
|
|
|
PURPOSE : Displays a MessageBox
|
|
|
|
INPUTS : Message to be displayed; a string of characters
|
|
|
|
OUTPUT : none
|
|
|
|
NOTES :
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
VOID FAR osMessage (LPXSTR lpszMsg, LPXSTR lpszTitle)
|
|
{
|
|
#if defined (OAU) && !defined (UNICODE)// [1]
|
|
char szBufferM[256];
|
|
char szBufferT[256];
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
lpszMsg,
|
|
-1,
|
|
szBufferM,
|
|
256,
|
|
NULL,
|
|
NULL);
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
lpszTitle,
|
|
-1,
|
|
szBufferT,
|
|
256,
|
|
NULL,
|
|
NULL);
|
|
MessageBox (NULL, szBufferM, szBufferT, MB_OK) ;
|
|
#else // if OAU && ! UNICODE
|
|
MessageBox (NULL, lpszMsg, lpszTitle, MB_OK) ;
|
|
#endif // if OAU && ! UNICODE
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osSetErrorMode
|
|
|
|
PURPOSE : For Win16 compatibility
|
|
|
|
INPUTS : eFlag - UINT
|
|
|
|
OUTPUT : UINT
|
|
|
|
NOTES : This routine is for Win16 compatibility purposes
|
|
|
|
---------------------------------------------------------------------------*/
|
|
|
|
UINT FAR osSetErrorMode (UINT eFlag)
|
|
{
|
|
return eFlag ;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : WinMain
|
|
|
|
PURPOSE : Entry point of the test
|
|
|
|
INPUTS : standard inputs
|
|
|
|
OUTPUT : None
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
int FAR pascal WinMain(HINSTANCE /*hInstanceCur*/, HINSTANCE /*hInstancePrev*/, LPSTR lpCmdLineA, int /*nCmdShow*/)
|
|
{
|
|
#ifdef OAU
|
|
XCHAR lpCmdLine[128];
|
|
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
lpCmdLineA,
|
|
-1,
|
|
lpCmdLine,
|
|
128);
|
|
#else //OAU
|
|
#define lpCmdLine lpCmdLineA
|
|
#endif //OAU
|
|
mainEntry (lpCmdLine) ; // entry point for all programs
|
|
|
|
return 1 ;
|
|
}
|
|
|
|
|
|
//======================= Wrapper functions ==================================
|
|
|
|
#if !defined(OAU)
|
|
/*---------------------------------------------------------------------------
|
|
NAME : CreateTypeLibA
|
|
|
|
PURPOSE : Creates a typelib name of which is an ANSI string
|
|
|
|
INPUTS : syskind - os that the type library is created on; SYSKIND
|
|
szFile - name of type library; ANSI string
|
|
ppctlib - pointer to the created library
|
|
|
|
OUTPUT : None
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
STDAPI
|
|
CreateTypeLibA(SYSKIND syskind, char * szFile, ICreateTypeLibA * * ppctlib)
|
|
{ // [1]
|
|
OLECHAR szFileW[_MAX_PATH] ;
|
|
ICreateTypeLib * ptlibW ;
|
|
HRESULT hresult ;
|
|
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szFile,
|
|
-1,
|
|
szFileW,
|
|
_MAX_PATH);
|
|
|
|
hresult = CreateTypeLib(syskind, szFileW, &ptlibW);
|
|
|
|
if (hresult == NOERROR)
|
|
{
|
|
hresult = ptlibW->QueryInterface(IID_ICreateTypeLibA, (VOID **)ppctlib);
|
|
ptlibW->Release();
|
|
}
|
|
return hresult;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : LHashValOfNameSysA
|
|
|
|
PURPOSE : Finds the hash value for a given string
|
|
|
|
INPUTS : syskind - current operating system
|
|
lcid - lcid of the currenet system
|
|
szName - string in concern; ANSI string
|
|
|
|
OUTPUT : Return LHashValOfNameSys
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
STDAPI_(unsigned long)
|
|
LHashValOfNameSysA(SYSKIND syskind, LCID lcid, char * szName)
|
|
{
|
|
OLECHAR szNameW[_MAX_PATH];
|
|
|
|
if ( szName )
|
|
{
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szName,
|
|
-1,
|
|
szNameW,
|
|
_MAX_PATH);
|
|
|
|
return LHashValOfNameSys(syskind, lcid, szNameW) ;
|
|
}
|
|
else
|
|
return LHashValOfNameSys(syskind, lcid, NULL) ;
|
|
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : LoadTypeLibA
|
|
|
|
PURPOSE : Loads a typelib name of which is an ANSI string
|
|
|
|
INPUTS : szFile - name of type library; ANSI string
|
|
pptlib - pointer to the loaded library
|
|
|
|
OUTPUT : None
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
STDAPI
|
|
LoadTypeLibA(char * szFile, ITypeLibA * * pptlib)
|
|
{
|
|
OLECHAR szFileW[_MAX_PATH];
|
|
ITypeLib * ptlibW;
|
|
HRESULT hresult = (HRESULT) E_INVALIDARG ;
|
|
|
|
if ( szFile && pptlib )
|
|
{
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szFile,
|
|
-1,
|
|
szFileW,
|
|
_MAX_PATH);
|
|
|
|
hresult = LoadTypeLibEx(szFileW, REGKIND_NONE, &ptlibW);
|
|
|
|
if (hresult == NOERROR) // convert the wide pointer to a narrow
|
|
{ // one
|
|
hresult = ptlibW->QueryInterface(IID_ITypeLibA, (VOID **)pptlib);
|
|
ptlibW->Release();
|
|
}
|
|
}
|
|
|
|
return hresult;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : LoadRegTypeLibA
|
|
|
|
PURPOSE : Loads a typelib according to the info from the registry
|
|
|
|
INPUTS : rguid - GUID of the library
|
|
wVerMajor - Major version number of the library
|
|
wVerMinor - Minor version number of the library
|
|
pptlib - pointer to receive the library; an ANSI pointer
|
|
|
|
OUTPUT : result from LoadRegTypeLib
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
STDAPI
|
|
LoadRegTypeLibA(REFGUID rguid, unsigned short wVerMajor, unsigned short wVerMinor, LCID lcid, ITypeLibA * * pptlib)
|
|
{
|
|
ITypeLib * ptlibW;
|
|
HRESULT hresult;
|
|
|
|
hresult = LoadRegTypeLib(rguid, wVerMajor, wVerMinor, lcid, &ptlibW);
|
|
|
|
if (hresult == NOERROR) { // convert the wide pointer to a narrow
|
|
hresult = ptlibW->QueryInterface(IID_ITypeLibA, (VOID **)pptlib);
|
|
ptlibW->Release(); // one
|
|
}
|
|
return hresult;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : RegisterTypeLibA
|
|
|
|
PURPOSE : Adds information of a library to the system registry
|
|
|
|
INPUTS : ptlib - pointer to the library; an ANSI pointer
|
|
szFullPath - pathspec of the library; ANSI string
|
|
szHelpDir - pathspec of the help file; ANSI string
|
|
|
|
OUTPUT : result from RegisterTypeLib
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
STDAPI
|
|
RegisterTypeLibA(ITypeLibA FAR * ptlib, char * szFullPath, char * szHelpDir)
|
|
{
|
|
OLECHAR szPathW[_MAX_PATH];
|
|
OLECHAR szHelpW[_MAX_PATH];
|
|
ITypeLib FAR * ptlibW = NULL ;
|
|
BOOL PathOk = FALSE , HelpOk = FALSE ;
|
|
HRESULT hresult = (HRESULT) TYPE_E_LIBNOTREGISTERED ;
|
|
|
|
if ( !ptlib ) // ptlib == NULL
|
|
return (HRESULT) E_INVALIDARG ;
|
|
|
|
ptlibW = ITypeLibWFromA(ptlib) ; // convert the narrow pointer to a wide
|
|
// one
|
|
if ( ptlibW ) // check if the pathspec is NULL or not
|
|
{ // if it is not, convert the ANSI path
|
|
if ( szFullPath ) // to an UNICODE path
|
|
{
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szFullPath,
|
|
-1,
|
|
szPathW,
|
|
_MAX_PATH);
|
|
PathOk = TRUE ;
|
|
}
|
|
|
|
if ( szHelpDir )
|
|
{
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szHelpDir,
|
|
-1,
|
|
szHelpW,
|
|
_MAX_PATH);
|
|
HelpOk = TRUE ;
|
|
}
|
|
|
|
if ( PathOk && HelpOk ) // if both pathspec's are not NULL
|
|
hresult = RegisterTypeLib(ptlibW, szPathW, szHelpW);
|
|
else
|
|
{
|
|
if ( PathOk ) // here if helpdir is NULL
|
|
hresult = RegisterTypeLib(ptlibW, szPathW, NULL);
|
|
else // here if pathspec of library is NULL
|
|
hresult = RegisterTypeLib(ptlibW, NULL, szHelpW);
|
|
}
|
|
|
|
ptlibW->Release();
|
|
}
|
|
|
|
return hresult;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : CLSIDFromStringA
|
|
|
|
PURPOSE : Converts an ANSI string to a UUID
|
|
|
|
INPUTS : szG - string that represents a UUID; ANSI string
|
|
lpG - pointer to the UUID
|
|
|
|
OUTPUT : return code form CLSIDFromString
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
STDAPI
|
|
CLSIDFromStringA(char * szG, LPCLSID lpG)
|
|
{
|
|
OLECHAR szGW[100];
|
|
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szG,
|
|
-1,
|
|
szGW,
|
|
100);
|
|
|
|
return CLSIDFromString(szGW, (LPCLSID)lpG) ;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : IIDFromStringA
|
|
|
|
PURPOSE : Converts an ANSI string to an IID
|
|
|
|
INPUTS : szA - string that represents a IID; ANSI string
|
|
lpiid - pointer to the iid
|
|
|
|
OUTPUT : Return code form IIDFromString
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
STDAPI
|
|
IIDFromStringA(LPSTR lpszA, LPIID lpiid)
|
|
{
|
|
OLECHAR szAW[100];
|
|
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
lpszA,
|
|
-1,
|
|
szAW,
|
|
100);
|
|
|
|
return IIDFromString(szAW, (LPIID)lpiid) ;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : StgCreateDocfileA
|
|
|
|
PURPOSE : Creates a doc file
|
|
|
|
INPUTS : pwcsName - name of the doc file; ANSI string
|
|
grfMode - creation mode
|
|
ppstgOpenA - pointer the storage
|
|
|
|
OUTPUT : Return code from StgCreateDocfile
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
STDAPI StgCreateDocfileA(LPCSTR pwcsName, DWORD grfMode, DWORD reserved, IStorage * *ppstgOpenA)
|
|
{
|
|
OLECHAR szNameW[100];
|
|
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
pwcsName,
|
|
-1,
|
|
szNameW,
|
|
100);
|
|
|
|
return StgCreateDocfile(szNameW, grfMode, reserved, ppstgOpenA) ;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : CreateFileMonikerA
|
|
|
|
PURPOSE : Creates a doc file
|
|
|
|
INPUTS : szfName - name of the file spec; ANSI string
|
|
pmk - pointer the moniker
|
|
|
|
OUTPUT : Return code from CreateFileMoniker
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
STDAPI CreateFileMonikerA (char * szfName, LPMONIKER FAR * pmk) // [2]
|
|
{
|
|
OLECHAR szNameW[128];
|
|
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szfName,
|
|
-1,
|
|
szNameW,
|
|
128);
|
|
|
|
return CreateFileMoniker(szNameW, pmk) ;
|
|
}
|
|
|
|
#endif // if !OAU
|
|
|
|
|
|
#if defined(OAU) && !defined(UNICODE) // [1]
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osKillFile
|
|
|
|
PURPOSE : Removes a specific file from the disk
|
|
|
|
INPUTS : szFile - name of file to be removed; UNICODE string
|
|
|
|
OUTPUT : Output from DeleteFile
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
int osKillFile (XCHAR * szFile)
|
|
{
|
|
char szBuffer[256];
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
szFile,
|
|
-1,
|
|
szBuffer,
|
|
256,
|
|
NULL,
|
|
NULL);
|
|
|
|
return DeleteFile (szBuffer) ;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : osRmDir
|
|
|
|
PURPOSE : Removes a specific directory from the disk
|
|
|
|
INPUTS : szDir - name of directory to be removed; UNICODE string
|
|
|
|
OUTPUT : Output from RemoveDirectory
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
int osRmDir (XCHAR * szDir)
|
|
{
|
|
char szBuffer[256];
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
szDir,
|
|
-1,
|
|
szBuffer,
|
|
256,
|
|
NULL,
|
|
NULL);
|
|
|
|
return RemoveDirectory(szBuffer) ;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : LCMapStringX
|
|
|
|
PURPOSE : Converts one string of characters to another
|
|
|
|
INPUTS : lcid - Locale context fo the mapping; LCID
|
|
dw1 - type of mapping; unsigned long
|
|
sz1 - string for conversion; UNICODE string
|
|
i1 - number of characters in sz1; int
|
|
sz2 - buffer to store the resulting string; UNICODE string
|
|
i2 - number of characters converted
|
|
|
|
OUTPUT : Output from LCMapStringA
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
int LCMapStringX (LCID lcid, DWORD dw1, LPXSTR sz1, int i1, LPXSTR sz2, int i2) // [3]
|
|
{
|
|
char szBuf1[300];
|
|
char szBuf2[300];
|
|
int retval ;
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
sz1,
|
|
-1,
|
|
szBuf1,
|
|
300,
|
|
NULL,
|
|
NULL);
|
|
|
|
retval = LCMapStringA(lcid, dw1, szBuf1, i1, szBuf2, i2) ;
|
|
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
szBuf2,
|
|
-1,
|
|
sz2,
|
|
300);
|
|
|
|
return retval ;
|
|
}
|
|
|
|
#endif // if OAU && !UNICODE
|
|
|
|
#ifdef OAU
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : fopenX
|
|
|
|
PURPOSE : Opens a file for read/write
|
|
|
|
INPUTS : szFilName - name of file to be open; UNICODE string
|
|
szMode - purpose for the file; UNICODE string
|
|
|
|
OUTPUT : Return code from fopen
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
FILE * fopenX(XCHAR * szFilName, XCHAR * szMode)
|
|
{
|
|
char szANSITmp1[256];
|
|
char szANSITmp2[256];
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
szFilName,
|
|
-1,
|
|
szANSITmp1,
|
|
256,
|
|
NULL,
|
|
NULL);
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
szMode,
|
|
-1,
|
|
szANSITmp2,
|
|
256,
|
|
NULL,
|
|
NULL);
|
|
|
|
return fopen(szANSITmp1, szANSITmp2) ; // open output as an ANSI file
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
NAME : fputsX
|
|
|
|
PURPOSE : Writes to a file for read/write
|
|
|
|
INPUTS : szBuf - data to be written; UNICODE string
|
|
hFile - handle of the output file
|
|
|
|
OUTPUT : Return code from fputs
|
|
|
|
NOTES :
|
|
---------------------------------------------------------------------------*/
|
|
int fputsX(XCHAR *szBuf, FILE *hFile)
|
|
{
|
|
char szANSITmp[512];
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
szBuf,
|
|
-1,
|
|
szANSITmp,
|
|
512,
|
|
NULL,
|
|
NULL);
|
|
|
|
return fputs(szANSITmp, hFile) ;
|
|
}
|
|
|
|
#endif
|