223 lines
4.9 KiB
C++
223 lines
4.9 KiB
C++
// ############################################################################
|
|
#include "pch.hpp"
|
|
|
|
extern "C" {
|
|
HINSTANCE g_hInstDll; // instance for this DLL
|
|
}
|
|
|
|
|
|
#ifdef WIN16
|
|
|
|
int CALLBACK LibMain(HINSTANCE hinst,
|
|
WORD wDataSeg,
|
|
WORD cbHeap,
|
|
LPSTR lpszCmdLine )
|
|
{
|
|
g_hInstDll = hinst;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrivateMalloc()
|
|
//
|
|
// Synopsis: Allocate and initialize memory
|
|
//
|
|
// Arguments: [size - Size of memory block to be allocated]
|
|
//
|
|
// Returns: pointer to memory block if successful
|
|
// NULL otherwise
|
|
//
|
|
// History: 7/9/96 VetriV Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void far *PrivateMalloc(size_t size)
|
|
{
|
|
void far * ReturnValue = NULL;
|
|
|
|
ReturnValue = malloc(size);
|
|
if (NULL != ReturnValue)
|
|
memset(ReturnValue, 0, size);
|
|
|
|
return ReturnValue;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrivateReAlloc()
|
|
//
|
|
// Synopsis: Reallocate memory
|
|
//
|
|
// Arguments: [lpBlock - Block to be reallocated ]
|
|
// [size - Size of memory block to be allocated]
|
|
//
|
|
// Returns: pointer to memory block if successful
|
|
// NULL otherwise
|
|
//
|
|
// History: 7/25/96 ValdonB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void far *PrivateReAlloc(void far *lpBlock, size_t size)
|
|
{
|
|
void far *lpRetBlock;
|
|
|
|
lpRetBlock = PrivateMalloc(size);
|
|
if (NULL == lpRetBlock)
|
|
return NULL;
|
|
|
|
if (NULL != lpBlock)
|
|
{
|
|
size_t OldBlockSize, MoveSize;
|
|
|
|
OldBlockSize = _msize(lpBlock);
|
|
MoveSize = min(OldBlockSize, size);
|
|
memmove(lpRetBlock, lpBlock, MoveSize);
|
|
PrivateFree(lpBlock);
|
|
}
|
|
|
|
return lpRetBlock;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PrivateFree
|
|
//
|
|
// Synopsis: Free a block of memory
|
|
//
|
|
// Arguments: [lpBlock - Block to be freed]
|
|
//
|
|
// Returns: Nothing
|
|
//
|
|
// History: 7/9/96 VetriV Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void PrivateFree(void far *lpBlock)
|
|
{
|
|
free(lpBlock);
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: SearchPath()
|
|
//
|
|
// Synopsis: Searchs for the specified file in the given path
|
|
//
|
|
// Arguments: [lpPath - Address of search path]
|
|
// [lpFileName - Address of filename]
|
|
// [lpExtension - Address of Extension]
|
|
// [nBufferLength - size, in characters, of buffer]
|
|
// [lpBuffer - address of buffer for found filename]
|
|
// [lpFilePart - address of pointer to file component]
|
|
//
|
|
// Returns: Length of string copied to buffer (not including terminating
|
|
// NULL character) if successful
|
|
// 0 otherwise
|
|
//
|
|
// History: 7/9/96 VetriV Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
DWORD SearchPath(LPCTSTR lpPath,LPCTSTR lpFileName, LPCTSTR lpExtension,
|
|
DWORD nBufferLength, LPTSTR lpBuffer, LPTSTR *lpFilePart)
|
|
{
|
|
|
|
BOOL bUseExtension = FALSE, bPathContainsFileName = FALSE;
|
|
DWORD dwRequiredLength;
|
|
LPSTR lpszPath = lpPath;
|
|
char szFileName[MAX_PATH+1];
|
|
OFSTRUCT OpenBuf;
|
|
|
|
|
|
|
|
// Check if extension should be used
|
|
//
|
|
if ((NULL != lpExtension) && !strchr(lpFileName, '.'))
|
|
bUseExtension = TRUE;
|
|
|
|
//
|
|
// Form Filename
|
|
//
|
|
lstrcpy(szFileName, lpFileName);
|
|
if (bUseExtension)
|
|
lstrcat(szFileName, lpExtension);
|
|
|
|
|
|
//
|
|
// If search path is NULL, then try to OpenFile using OF_SEARCH flag
|
|
// get the full path in OpenBuf struct
|
|
//
|
|
if (NULL == lpszPath)
|
|
{
|
|
|
|
if (HFILE_ERROR != OpenFile(szFileName, &OpenBuf, OF_EXIST | OF_SEARCH))
|
|
{
|
|
//
|
|
// This path contains the file name also
|
|
//
|
|
lpszPath = &OpenBuf.szPathName[0];
|
|
bPathContainsFileName = TRUE;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// Check if output buffer length is sufficient
|
|
//
|
|
dwRequiredLength = lstrlen(lpszPath) +
|
|
(bPathContainsFileName ? 0 :lstrlen(szFileName)) + 1;
|
|
if (nBufferLength < dwRequiredLength)
|
|
return 0;
|
|
|
|
//
|
|
// Copy the full name to buffer
|
|
//
|
|
if (bPathContainsFileName)
|
|
lstrcpy(lpBuffer, lpszPath);
|
|
else
|
|
wsprintf(lpBuffer, "%s\\%s", lpszPath, szFileName);
|
|
|
|
|
|
//
|
|
// Do not include the terminating null character in return length
|
|
//
|
|
return dwRequiredLength - 1;
|
|
}
|
|
|
|
|
|
#else // WIN16
|
|
|
|
#ifdef _NOT_USING_ACTIVEX
|
|
extern "C" __declspec(dllexport) BOOL WINAPI DllMain(
|
|
HINSTANCE hinstDLL, // handle to DLL module
|
|
DWORD fdwReason, // reason for calling function
|
|
LPVOID lpvReserved // reserved
|
|
)
|
|
{
|
|
if (fdwReason == DLL_PROCESS_ATTACH)
|
|
g_hInstDll = hinstDLL;
|
|
|
|
return TRUE;
|
|
}
|
|
#if 0
|
|
extern "C" __declspec(dllexport) BOOL WINAPI DllMain(
|
|
HINSTANCE hinstDLL, // handle to DLL module
|
|
DWORD fdwReason, // reason for calling function
|
|
LPVOID lpvReserved // reserved
|
|
)
|
|
{
|
|
if (fdwReason == DLL_PROCESS_ATTACH)
|
|
g_hInstDll = hinstDLL;
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
#endif // WIN16
|
|
|
|
|