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.
2365 lines
55 KiB
2365 lines
55 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1996 - 1999
|
|
//
|
|
// File: user.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <windows.h>
|
|
#include "unicode.h"
|
|
#include "crtem.h"
|
|
#include <stddef.h>
|
|
|
|
#ifdef _M_IX86
|
|
|
|
#define MAX_STRING_RSC_SIZE 512
|
|
|
|
int WINAPI LoadString9x(
|
|
HINSTANCE hInstance, // handle of module containing string resource
|
|
UINT uID, // resource identifier
|
|
LPWSTR lpBuffer, // address of buffer for resource
|
|
int nBufferMax // size of buffer
|
|
) {
|
|
|
|
char rgch[MAX_STRING_RSC_SIZE];
|
|
int cchW;
|
|
LONG err;
|
|
|
|
err = LoadStringA(
|
|
hInstance,
|
|
uID,
|
|
rgch,
|
|
MAX_STRING_RSC_SIZE);
|
|
|
|
if (err == 0)
|
|
return err;
|
|
|
|
return MultiByteToWideChar(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
rgch,
|
|
err + 1,
|
|
lpBuffer,
|
|
nBufferMax);
|
|
}
|
|
|
|
int WINAPI LoadStringU(
|
|
HINSTANCE hInstance, // handle of module containing string resource
|
|
UINT uID, // resource identifier
|
|
LPWSTR lpBuffer, // address of buffer for resource
|
|
int nBufferMax // size of buffer
|
|
) {
|
|
|
|
if(FIsWinNT())
|
|
return( LoadStringW(
|
|
hInstance,
|
|
uID,
|
|
lpBuffer,
|
|
nBufferMax
|
|
));
|
|
else
|
|
return( LoadString9x(
|
|
hInstance,
|
|
uID,
|
|
lpBuffer,
|
|
nBufferMax
|
|
));
|
|
}
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
InsertMenu9x(
|
|
HMENU hMenu,
|
|
UINT uPosition,
|
|
UINT uFlags,
|
|
UINT_PTR uIDNewItem,
|
|
LPCWSTR lpNewItem
|
|
)
|
|
{
|
|
|
|
LPSTR pszNewItem=NULL;
|
|
BOOL fReturn=FALSE;
|
|
|
|
if( (0 == (uFlags & MF_BITMAP)) &&
|
|
(0 == (uFlags & MF_OWNERDRAW))
|
|
)
|
|
{
|
|
|
|
if(!MkMBStr(NULL, 0, lpNewItem, &pszNewItem))
|
|
return FALSE;
|
|
|
|
fReturn=InsertMenuA(
|
|
hMenu,
|
|
uPosition,
|
|
uFlags,
|
|
uIDNewItem,
|
|
(LPCSTR)pszNewItem);
|
|
}
|
|
else
|
|
{
|
|
fReturn=InsertMenuA(
|
|
hMenu,
|
|
uPosition,
|
|
uFlags,
|
|
uIDNewItem,
|
|
(LPCSTR)lpNewItem);
|
|
}
|
|
|
|
if(pszNewItem)
|
|
FreeMBStr(NULL, pszNewItem);
|
|
|
|
return fReturn;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
InsertMenuU(
|
|
HMENU hMenu,
|
|
UINT uPosition,
|
|
UINT uFlags,
|
|
UINT_PTR uIDNewItem,
|
|
LPCWSTR lpNewItem
|
|
)
|
|
{
|
|
if(FIsWinNT())
|
|
return InsertMenuW(
|
|
hMenu,
|
|
uPosition,
|
|
uFlags,
|
|
uIDNewItem,
|
|
lpNewItem);
|
|
else
|
|
return InsertMenu9x(
|
|
hMenu,
|
|
uPosition,
|
|
uFlags,
|
|
uIDNewItem,
|
|
lpNewItem);
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
//
|
|
// FormatMessageU
|
|
// This function assume any patten of !S! or !s! in lpSource are used for
|
|
// formatting purpose only.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
DWORD WINAPI FormatMessage9x(
|
|
DWORD dwFlags, // source and processing options
|
|
LPCVOID lpSource, // pointer to message source
|
|
DWORD dwMessageId, // requested message identifier
|
|
DWORD dwLanguageId, // language identifier for requested message
|
|
LPWSTR lpBuffer, // pointer to message buffer
|
|
DWORD nSize, // maximum size of message buffer
|
|
va_list *Arguments // address of array of message inserts
|
|
)
|
|
{
|
|
|
|
DWORD cb=0;
|
|
LPSTR pChar=NULL;
|
|
DWORD dwSize=0;
|
|
|
|
LPSTR pszSource=NULL;
|
|
LPSTR pszBuffer=NULL;
|
|
LPWSTR pwszBuffer=NULL;
|
|
|
|
//we need to change the lpSource
|
|
if((dwFlags & FORMAT_MESSAGE_FROM_STRING) &&
|
|
(0 == (dwFlags & FORMAT_MESSAGE_IGNORE_INSERTS))
|
|
)
|
|
{
|
|
//get the ascii version of the string
|
|
if((lpSource == NULL) || !MkMBStr(NULL, 0, (LPWSTR)lpSource, &pszSource))
|
|
goto CLEANUP;
|
|
|
|
//we change "!S!" to "!s!" and "!s!" to "!S!"
|
|
pChar = pszSource;
|
|
|
|
while((*pChar) != '\0')
|
|
{
|
|
if((*pChar) == '!')
|
|
{
|
|
if((*(pChar+1)) == 's')
|
|
{
|
|
if((*(pChar+2)) == '!')
|
|
*(pChar+1)='S';
|
|
}
|
|
else
|
|
{
|
|
if((*(pChar+1)) == 'S')
|
|
{
|
|
if((*(pChar+2)) == '!')
|
|
*(pChar+1)='s';
|
|
}
|
|
}
|
|
}
|
|
|
|
pChar++;
|
|
}
|
|
|
|
}
|
|
|
|
if(dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER)
|
|
{
|
|
cb = FormatMessageA(
|
|
dwFlags,
|
|
pszSource,
|
|
dwMessageId,
|
|
dwLanguageId,
|
|
(LPSTR)&pszBuffer,
|
|
nSize,
|
|
Arguments);
|
|
|
|
if(cb)
|
|
{
|
|
if(NULL == (pwszBuffer=MkWStr(pszBuffer)))
|
|
{
|
|
cb=0;
|
|
goto CLEANUP;
|
|
}
|
|
|
|
dwSize=sizeof(WCHAR)*(wcslen(pwszBuffer) +1);
|
|
|
|
*((LPWSTR *)lpBuffer)=(LPWSTR)LocalAlloc(LPTR, dwSize);
|
|
|
|
if(NULL == (*lpBuffer))
|
|
{
|
|
cb=0;
|
|
goto CLEANUP;
|
|
}
|
|
|
|
wcscpy((*((LPWSTR *)lpBuffer)), pwszBuffer);
|
|
|
|
cb=wcslen(pwszBuffer);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
pszBuffer=(LPSTR)LocalAlloc(LPTR, sizeof(CHAR) * nSize);
|
|
|
|
if (NULL == pszBuffer)
|
|
goto CLEANUP;
|
|
|
|
cb = FormatMessageA(
|
|
dwFlags,
|
|
pszSource,
|
|
dwMessageId,
|
|
dwLanguageId,
|
|
pszBuffer,
|
|
nSize,
|
|
Arguments);
|
|
|
|
if(cb)
|
|
{
|
|
if(NULL == (pwszBuffer=MkWStr(pszBuffer)))
|
|
{
|
|
cb=0;
|
|
goto CLEANUP;
|
|
}
|
|
|
|
wcscpy((LPWSTR)lpBuffer, pwszBuffer);
|
|
|
|
cb=wcslen(pwszBuffer);
|
|
}
|
|
}
|
|
|
|
CLEANUP:
|
|
|
|
if(pszSource)
|
|
FreeMBStr(NULL,pszSource);
|
|
|
|
if(pszBuffer)
|
|
LocalFree((HLOCAL)pszBuffer);
|
|
|
|
if(pwszBuffer)
|
|
FreeWStr(pwszBuffer);
|
|
|
|
return(cb);
|
|
}
|
|
|
|
DWORD WINAPI FormatMessageU(
|
|
DWORD dwFlags, // source and processing options
|
|
LPCVOID lpSource, // pointer to message source
|
|
DWORD dwMessageId, // requested message identifier
|
|
DWORD dwLanguageId, // language identifier for requested message
|
|
LPWSTR lpBuffer, // pointer to message buffer
|
|
DWORD nSize, // maximum size of message buffer
|
|
va_list *Arguments // address of array of message inserts
|
|
)
|
|
{
|
|
if(FIsWinNT())
|
|
return( FormatMessageW(
|
|
dwFlags,
|
|
lpSource,
|
|
dwMessageId,
|
|
dwLanguageId,
|
|
lpBuffer,
|
|
nSize,
|
|
Arguments
|
|
));
|
|
else
|
|
return( FormatMessage9x(
|
|
dwFlags,
|
|
lpSource,
|
|
dwMessageId,
|
|
dwLanguageId,
|
|
lpBuffer,
|
|
nSize,
|
|
Arguments
|
|
));
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
//
|
|
// CompareStringU
|
|
// This function only handles the case where cchCount1==-1 and cchCount==-1.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
int
|
|
WINAPI
|
|
CompareString9x(
|
|
LCID Locale,
|
|
DWORD dwCmpFlags,
|
|
LPCWSTR lpString1,
|
|
int cchCount1,
|
|
LPCWSTR lpString2,
|
|
int cchCount2)
|
|
{
|
|
int iReturn=0;
|
|
int cb1=0;
|
|
int cb2=0;
|
|
|
|
LPSTR psz1=NULL;
|
|
LPSTR psz2=NULL;
|
|
|
|
cb1 = WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
lpString1,
|
|
cchCount1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if(NULL==(psz1=(LPSTR)malloc(cb1)))
|
|
{
|
|
SetLastError(E_OUTOFMEMORY);
|
|
goto CLEANUP;
|
|
}
|
|
|
|
if(0 == (cb1 = WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
lpString1,
|
|
cchCount1,
|
|
psz1,
|
|
cb1,
|
|
NULL,
|
|
NULL)))
|
|
goto CLEANUP;
|
|
|
|
|
|
cb2 = WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
lpString2,
|
|
cchCount2,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if(NULL == (psz2=(LPSTR)malloc(cb2)))
|
|
{
|
|
SetLastError(E_OUTOFMEMORY);
|
|
goto CLEANUP;
|
|
}
|
|
|
|
if(0 == (cb2 = WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
lpString2,
|
|
cchCount2,
|
|
psz2,
|
|
cb2,
|
|
NULL,
|
|
NULL)))
|
|
goto CLEANUP;
|
|
|
|
iReturn = CompareStringA(Locale,
|
|
dwCmpFlags,
|
|
psz1,
|
|
cb1,
|
|
psz2,
|
|
cb2);
|
|
|
|
|
|
CLEANUP:
|
|
|
|
if(psz1)
|
|
free(psz1);
|
|
|
|
if(psz2)
|
|
free(psz2);
|
|
|
|
return iReturn;
|
|
|
|
}
|
|
|
|
int
|
|
WINAPI
|
|
CompareStringU(
|
|
LCID Locale,
|
|
DWORD dwCmpFlags,
|
|
LPCWSTR lpString1,
|
|
int cchCount1,
|
|
LPCWSTR lpString2,
|
|
int cchCount2)
|
|
{
|
|
if(FIsWinNT())
|
|
return CompareStringW(
|
|
Locale,
|
|
dwCmpFlags,
|
|
lpString1,
|
|
cchCount1,
|
|
lpString2,
|
|
cchCount2);
|
|
else
|
|
return CompareString9x(
|
|
Locale,
|
|
dwCmpFlags,
|
|
lpString1,
|
|
cchCount1,
|
|
lpString2,
|
|
cchCount2);
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
//
|
|
// PropertySheetU
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
typedef INT_PTR (WINAPI *PFPropertySheetA)(LPCPROPSHEETHEADERA);
|
|
typedef INT_PTR (WINAPI *PFPropertySheetW)(LPCPROPSHEETHEADERW);
|
|
|
|
INT_PTR WINAPI PropertySheet9x(
|
|
LPPROPSHEETHEADERW lppsph)
|
|
{
|
|
PROPSHEETHEADERA PropHeaderA;
|
|
INT_PTR iReturn=-1;
|
|
DWORD dwIndex=0;
|
|
UINT nPages=0;
|
|
DWORD dwSize=0;
|
|
|
|
LPPROPSHEETPAGEA pPropSheetA=NULL;
|
|
LPSTR pszCaption=NULL;
|
|
LPSTR pszTitle=NULL;
|
|
|
|
HMODULE hModule=NULL;
|
|
PFPropertySheetA pfPropertySheetA=NULL;
|
|
|
|
|
|
//load the comctl.32 since many dlls in ispu project
|
|
//use unicode.lib, just do not link to comctl32.dll
|
|
if(NULL == (hModule=LoadLibrary("comctl32.dll")))
|
|
return iReturn;
|
|
|
|
memcpy(&PropHeaderA, lppsph, sizeof(PROPSHEETHEADERA));
|
|
|
|
if(lppsph->pszCaption)
|
|
{
|
|
if(!MkMBStr(NULL, 0, (LPWSTR)(lppsph->pszCaption), &pszCaption))
|
|
goto CLEANUP;
|
|
|
|
PropHeaderA.pszCaption=pszCaption;
|
|
}
|
|
|
|
//convert the property sheets
|
|
if(PSH_PROPSHEETPAGE & lppsph->dwFlags)
|
|
{
|
|
nPages = lppsph->nPages;
|
|
|
|
if(nPages)
|
|
{
|
|
dwSize=sizeof(PROPSHEETPAGEA) * nPages;
|
|
|
|
pPropSheetA=(LPPROPSHEETPAGEA)LocalAlloc(LPTR, dwSize);
|
|
|
|
if(NULL == pPropSheetA)
|
|
goto CLEANUP;
|
|
|
|
memcpy(pPropSheetA, lppsph->ppsp, dwSize);
|
|
|
|
//pre-set the title
|
|
for(dwIndex=0; dwIndex < (DWORD)nPages; dwIndex++)
|
|
{
|
|
pPropSheetA[dwIndex].pszTitle=NULL;
|
|
}
|
|
|
|
for(dwIndex=0; dwIndex < (DWORD)nPages; dwIndex++)
|
|
{
|
|
if((lppsph->ppsp)[dwIndex].pszTitle)
|
|
{
|
|
if(!MkMBStr(NULL, 0, (LPWSTR)((lppsph->ppsp)[dwIndex].pszTitle),
|
|
&pszTitle))
|
|
goto CLEANUP;
|
|
|
|
pPropSheetA[dwIndex].pszTitle=pszTitle;
|
|
}
|
|
|
|
}
|
|
|
|
PropHeaderA.ppsp=pPropSheetA;
|
|
}
|
|
}
|
|
|
|
if(NULL != (pfPropertySheetA=(PFPropertySheetA)GetProcAddress(hModule, "PropertySheetA")))
|
|
{
|
|
iReturn=pfPropertySheetA(&PropHeaderA);
|
|
}
|
|
|
|
|
|
CLEANUP:
|
|
|
|
if(pszCaption)
|
|
FreeMBStr(NULL, pszCaption);
|
|
|
|
//free the title
|
|
if(PropHeaderA.nPages)
|
|
{
|
|
for(dwIndex=0; dwIndex < PropHeaderA.nPages; dwIndex++)
|
|
{
|
|
if(pPropSheetA[dwIndex].pszTitle)
|
|
FreeMBStr(NULL, (LPSTR)((pPropSheetA[dwIndex]).pszTitle));
|
|
}
|
|
|
|
}
|
|
|
|
if(pPropSheetA)
|
|
LocalFree((HLOCAL)pPropSheetA);
|
|
|
|
|
|
if(hModule)
|
|
FreeLibrary(hModule);
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
INT_PTR WINAPI PropertySheetU(
|
|
LPPROPSHEETHEADERW lppsph)
|
|
{
|
|
INT_PTR iReturn=-1;
|
|
HMODULE hModule=NULL;
|
|
PFPropertySheetW pfPropertySheetW=NULL;
|
|
|
|
if(FIsWinNT())
|
|
{
|
|
//load the comctl.32 since many dlls in ispu project
|
|
//use unicode.lib, just do not link to comctl32.dll
|
|
if(NULL == (hModule=LoadLibrary("comctl32.dll")))
|
|
return iReturn;
|
|
|
|
if(NULL != (pfPropertySheetW=(PFPropertySheetW)GetProcAddress(hModule, "PropertySheetW")))
|
|
{
|
|
iReturn=pfPropertySheetW(lppsph);
|
|
}
|
|
|
|
FreeLibrary(hModule);
|
|
}
|
|
else
|
|
{
|
|
iReturn=PropertySheet9x(lppsph);
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
//
|
|
// DragQueryFileU
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
typedef UINT (WINAPI *PFDragQueryFileA)(HDROP,UINT,LPSTR,UINT);
|
|
typedef UINT (WINAPI *PFDragQueryFileW)(HDROP,UINT,LPWSTR,UINT);
|
|
|
|
|
|
UINT WINAPI DragQueryFileU(
|
|
HDROP hDrop,
|
|
UINT iFile,
|
|
LPWSTR lpwszFile,
|
|
UINT cch)
|
|
{
|
|
PFDragQueryFileA pfA=NULL;
|
|
PFDragQueryFileW pfW=NULL;
|
|
HMODULE hModule=NULL;
|
|
UINT iReturn=0;
|
|
|
|
LPSTR psz=NULL;
|
|
|
|
|
|
//load the shell32.dll since many dlls in ispu project
|
|
//use unicode.lib, just do not link to comctl32.dll
|
|
if(NULL == (hModule=LoadLibrary("shell32.dll")))
|
|
return iReturn;
|
|
|
|
|
|
if(FIsWinNT())
|
|
{
|
|
|
|
if(NULL != (pfW=(PFDragQueryFileW)GetProcAddress(hModule, "DragQueryFileW")))
|
|
{
|
|
iReturn=pfW(hDrop, iFile, lpwszFile, cch);
|
|
}
|
|
|
|
FreeLibrary(hModule);
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
//allocate memory
|
|
if(0xFFFFFFFF != iFile)
|
|
{
|
|
if(lpwszFile)
|
|
{
|
|
//allocate a big enough buffer
|
|
psz=(LPSTR)malloc(sizeof(WCHAR) * cch);
|
|
if(NULL == psz)
|
|
goto CLEANUP;
|
|
}
|
|
}
|
|
|
|
if(NULL == (pfA=(PFDragQueryFileA)GetProcAddress(hModule, "DragQueryFileA")))
|
|
goto CLEANUP;
|
|
|
|
iReturn=pfA(hDrop, iFile, psz, cch);
|
|
|
|
if(0 != iReturn)
|
|
{
|
|
if(0xFFFFFFFF != iFile)
|
|
{
|
|
if(lpwszFile && psz)
|
|
{
|
|
iReturn = MultiByteToWideChar(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
psz,
|
|
iReturn+1,
|
|
lpwszFile,
|
|
cch);
|
|
|
|
//we should return the # of characters excluding the NULL terminator
|
|
if(0 != iReturn)
|
|
iReturn--;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
CLEANUP:
|
|
|
|
if(psz)
|
|
free(psz);
|
|
|
|
return iReturn;
|
|
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
//
|
|
// CreatePropertySheetPageU
|
|
//
|
|
// Notice: This function assumes that the LPCPROPSHEETPAGEW and
|
|
// LPCPROPSHEETPAGEA are equivalent.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
typedef HPROPSHEETPAGE (WINAPI *PFCreatePropertySheetPageA)(LPCPROPSHEETPAGEA);
|
|
typedef HPROPSHEETPAGE (WINAPI *PFCreatePropertySheetPageW)(LPCPROPSHEETPAGEW);
|
|
|
|
HPROPSHEETPAGE WINAPI CreatePropertySheetPageU(LPCPROPSHEETPAGEW pPage)
|
|
{
|
|
PFCreatePropertySheetPageA pfA=NULL;
|
|
PFCreatePropertySheetPageW pfW=NULL;
|
|
HMODULE hModule=NULL;
|
|
HPROPSHEETPAGE hPage=NULL;
|
|
|
|
//load the comctl.32 since many dlls in ispu project
|
|
//use unicode.lib, just do not link to comctl32.dll
|
|
if(NULL == (hModule=LoadLibrary("comctl32.dll")))
|
|
return hPage;
|
|
|
|
|
|
if(FIsWinNT())
|
|
{
|
|
|
|
if(NULL != (pfW=(PFCreatePropertySheetPageW)GetProcAddress(hModule, "CreatePropertySheetPageW")))
|
|
{
|
|
hPage=pfW(pPage);
|
|
}
|
|
|
|
FreeLibrary(hModule);
|
|
|
|
return hPage;
|
|
}
|
|
|
|
|
|
if(NULL != (pfA=(PFCreatePropertySheetPageA)GetProcAddress(hModule, "CreatePropertySheetPageA")))
|
|
{
|
|
hPage=pfA((LPCPROPSHEETPAGEA)pPage);
|
|
}
|
|
|
|
FreeLibrary(hModule);
|
|
|
|
return hPage;
|
|
}
|
|
|
|
|
|
BOOL WINAPI SetWindowText9x(
|
|
HWND hWnd, // handle of window or control
|
|
LPCWSTR lpString // address of string
|
|
) {
|
|
BYTE rgb1[_MAX_PATH];
|
|
char * szString = NULL;
|
|
LONG err = 0;
|
|
|
|
if (lpString == NULL) {
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return(0);
|
|
}
|
|
|
|
if( MkMBStr(rgb1, _MAX_PATH, lpString, &szString) &&
|
|
(szString != NULL)) {
|
|
err = SetWindowTextA(
|
|
hWnd,
|
|
szString);
|
|
}
|
|
|
|
if (szString != NULL)
|
|
FreeMBStr(rgb1, szString);
|
|
|
|
return(err);
|
|
}
|
|
|
|
BOOL WINAPI SetWindowTextU(
|
|
HWND hWnd, // handle of window or control
|
|
LPCWSTR lpString // address of string
|
|
) {
|
|
|
|
if(FIsWinNT())
|
|
return( SetWindowTextW(hWnd, lpString));
|
|
else
|
|
return( SetWindowText9x(hWnd, lpString));
|
|
}
|
|
|
|
|
|
int WINAPI GetWindowText9x(
|
|
HWND hWnd,
|
|
LPWSTR lpString,
|
|
int nMaxCount
|
|
)
|
|
{
|
|
LPSTR psz;
|
|
int ret;
|
|
|
|
psz = (LPSTR) malloc(nMaxCount);
|
|
|
|
if (psz == NULL)
|
|
{
|
|
return (0);
|
|
}
|
|
|
|
ret = GetWindowTextA(hWnd, psz, nMaxCount);
|
|
|
|
if (ret != 0)
|
|
{
|
|
MultiByteToWideChar(0, 0, psz, -1, lpString, nMaxCount);
|
|
}
|
|
else
|
|
{
|
|
free(psz);
|
|
return (0);
|
|
}
|
|
|
|
free(psz);
|
|
|
|
return (ret);
|
|
}
|
|
|
|
int WINAPI GetWindowTextU(
|
|
HWND hWnd,
|
|
LPWSTR lpString,
|
|
int nMaxCount
|
|
)
|
|
{
|
|
if (FIsWinNT())
|
|
return (GetWindowTextW(hWnd, lpString, nMaxCount));
|
|
else
|
|
return (GetWindowText9x(hWnd, lpString, nMaxCount));
|
|
|
|
}
|
|
|
|
|
|
UINT WINAPI GetDlgItemText9x(
|
|
HWND hDlg, // handle of dialog box
|
|
int nIDDlgItem, // identifier of control
|
|
LPWSTR lpString, // address of buffer for text
|
|
int nMaxCount // maximum size of string
|
|
) {
|
|
|
|
char *szBuffer;
|
|
int cchW;
|
|
LONG err;
|
|
|
|
szBuffer = (char *) malloc(nMaxCount);
|
|
if(!szBuffer)
|
|
{
|
|
SetLastError(ERROR_OUTOFMEMORY);
|
|
return 0;
|
|
}
|
|
|
|
err = GetDlgItemTextA(
|
|
hDlg,
|
|
nIDDlgItem,
|
|
szBuffer,
|
|
nMaxCount);
|
|
|
|
if (err != 0)
|
|
{
|
|
err = MultiByteToWideChar(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
szBuffer,
|
|
err+1,
|
|
lpString,
|
|
nMaxCount);
|
|
}
|
|
else if (nMaxCount >= 1)
|
|
{
|
|
lpString[0] = 0;
|
|
}
|
|
|
|
free(szBuffer);
|
|
|
|
return(err);
|
|
}
|
|
|
|
UINT WINAPI GetDlgItemTextU(
|
|
HWND hDlg, // handle of dialog box
|
|
int nIDDlgItem, // identifier of control
|
|
LPWSTR lpString, // address of buffer for text
|
|
int nMaxCount // maximum size of string
|
|
) {
|
|
|
|
if(FIsWinNT())
|
|
return( GetDlgItemTextW(
|
|
hDlg,
|
|
nIDDlgItem,
|
|
lpString,
|
|
nMaxCount
|
|
));
|
|
else
|
|
return( GetDlgItemText9x(
|
|
hDlg,
|
|
nIDDlgItem,
|
|
lpString,
|
|
nMaxCount
|
|
));
|
|
}
|
|
|
|
|
|
BOOL WINAPI SetDlgItemText9x(
|
|
HWND hDlg,
|
|
int nIDDlgItem,
|
|
LPCWSTR lpString
|
|
)
|
|
{
|
|
LPSTR szString = NULL;
|
|
DWORD cbszString = 0;
|
|
BOOL fRet;
|
|
|
|
cbszString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpString,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszString == 0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (NULL == (szString = (LPSTR) malloc(cbszString)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
cbszString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpString,
|
|
-1,
|
|
szString,
|
|
cbszString,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszString == 0)
|
|
{
|
|
free(szString);
|
|
return FALSE;
|
|
}
|
|
|
|
fRet = SetDlgItemTextA(
|
|
hDlg,
|
|
nIDDlgItem,
|
|
szString
|
|
);
|
|
|
|
free(szString);
|
|
|
|
return (fRet);
|
|
}
|
|
|
|
BOOL WINAPI SetDlgItemTextU(
|
|
HWND hDlg,
|
|
int nIDDlgItem,
|
|
LPCWSTR lpString
|
|
)
|
|
{
|
|
if(FIsWinNT())
|
|
return(SetDlgItemTextW(
|
|
hDlg,
|
|
nIDDlgItem,
|
|
lpString
|
|
));
|
|
else
|
|
return(SetDlgItemText9x(
|
|
hDlg,
|
|
nIDDlgItem,
|
|
lpString
|
|
));
|
|
}
|
|
|
|
|
|
int WINAPI DialogBoxParam9x(
|
|
HINSTANCE hInstance,
|
|
LPCWSTR lpTemplateName,
|
|
HWND hWndParent,
|
|
DLGPROC lpDialogFunc,
|
|
LPARAM dwInitParam
|
|
)
|
|
{
|
|
LPSTR szString = NULL;
|
|
DWORD cbszString = 0;
|
|
int iRet;
|
|
|
|
//now, lpTemplateName can either be a WORD from MAKEINTRESOURCE(..)
|
|
//or a NULL terminated string
|
|
if (0xFFFF >= ((DWORD_PTR)lpTemplateName))
|
|
{
|
|
return(DialogBoxParamA(
|
|
hInstance,
|
|
(LPCSTR)lpTemplateName,
|
|
hWndParent,
|
|
lpDialogFunc,
|
|
dwInitParam
|
|
));
|
|
}
|
|
|
|
|
|
cbszString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpTemplateName,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszString == 0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (NULL == (szString = (LPSTR) malloc(cbszString)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
cbszString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpTemplateName,
|
|
-1,
|
|
szString,
|
|
cbszString,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszString == 0)
|
|
{
|
|
free(szString);
|
|
return FALSE;
|
|
}
|
|
|
|
iRet = DialogBoxParamA(
|
|
hInstance,
|
|
szString,
|
|
hWndParent,
|
|
lpDialogFunc,
|
|
dwInitParam
|
|
);
|
|
|
|
free(szString);
|
|
|
|
return (iRet);
|
|
}
|
|
|
|
int WINAPI DialogBoxParamU(
|
|
HINSTANCE hInstance,
|
|
LPCWSTR lpTemplateName,
|
|
HWND hWndParent,
|
|
DLGPROC lpDialogFunc,
|
|
LPARAM dwInitParam
|
|
)
|
|
{
|
|
if(FIsWinNT())
|
|
return(DialogBoxParamW(
|
|
hInstance,
|
|
lpTemplateName,
|
|
hWndParent,
|
|
lpDialogFunc,
|
|
dwInitParam
|
|
));
|
|
else
|
|
return(DialogBoxParam9x(
|
|
hInstance,
|
|
lpTemplateName,
|
|
hWndParent,
|
|
lpDialogFunc,
|
|
dwInitParam
|
|
));
|
|
}
|
|
|
|
|
|
|
|
int WINAPI DialogBox9x(
|
|
HINSTANCE hInstance,
|
|
LPCWSTR lpTemplateName,
|
|
HWND hWndParent,
|
|
DLGPROC lpDialogFunc
|
|
)
|
|
{
|
|
LPSTR szString = NULL;
|
|
DWORD cbszString = 0;
|
|
int iRet;
|
|
|
|
//now, lpTemplateName can either be a WORD from MAKEINTRESOURCE(..)
|
|
//or a NULL terminated string
|
|
if (0xFFFF >= ((DWORD_PTR)lpTemplateName))
|
|
{
|
|
return(DialogBoxA(
|
|
hInstance,
|
|
(LPCSTR)lpTemplateName,
|
|
hWndParent,
|
|
lpDialogFunc
|
|
));
|
|
}
|
|
|
|
|
|
cbszString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpTemplateName,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszString == 0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (NULL == (szString = (LPSTR) malloc(cbszString)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
cbszString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpTemplateName,
|
|
-1,
|
|
szString,
|
|
cbszString,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszString == 0)
|
|
{
|
|
free(szString);
|
|
return FALSE;
|
|
}
|
|
|
|
iRet = DialogBoxA(
|
|
hInstance,
|
|
szString,
|
|
hWndParent,
|
|
lpDialogFunc
|
|
);
|
|
|
|
free(szString);
|
|
|
|
return (iRet);
|
|
|
|
}
|
|
|
|
int WINAPI DialogBoxU(
|
|
HINSTANCE hInstance,
|
|
LPCWSTR lpTemplateName,
|
|
HWND hWndParent,
|
|
DLGPROC lpDialogFunc
|
|
)
|
|
{
|
|
if(FIsWinNT())
|
|
return(DialogBoxW(
|
|
hInstance,
|
|
lpTemplateName,
|
|
hWndParent,
|
|
lpDialogFunc
|
|
));
|
|
else
|
|
return(DialogBox9x(
|
|
hInstance,
|
|
lpTemplateName,
|
|
hWndParent,
|
|
lpDialogFunc
|
|
));
|
|
}
|
|
|
|
|
|
int WINAPI MessageBox9x(
|
|
HWND hWnd,
|
|
LPCWSTR lpText,
|
|
LPCWSTR lpCaption,
|
|
UINT uType
|
|
) {
|
|
BYTE rgb1[_MAX_PATH];
|
|
char * szString1 = NULL;
|
|
BYTE rgb2[_MAX_PATH];
|
|
char * szString2 = NULL;
|
|
int err;
|
|
|
|
if (lpText == NULL) {
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return(0);
|
|
}
|
|
|
|
err = 0;
|
|
if(MkMBStr(rgb1, _MAX_PATH, lpText, &szString1))
|
|
{
|
|
MkMBStr(rgb2, _MAX_PATH, lpCaption, &szString2);
|
|
|
|
err = MessageBoxA(
|
|
hWnd,
|
|
szString1,
|
|
szString2,
|
|
uType);
|
|
}
|
|
|
|
if (szString1 != NULL)
|
|
FreeMBStr(rgb1, szString1);
|
|
|
|
if (szString2 != NULL)
|
|
FreeMBStr(rgb2, szString2);
|
|
|
|
return(err);
|
|
}
|
|
|
|
int WINAPI MessageBoxU(
|
|
HWND hWnd,
|
|
LPCWSTR lpText,
|
|
LPCWSTR lpCaption,
|
|
UINT uType
|
|
) {
|
|
|
|
if(FIsWinNT())
|
|
return( MessageBoxW(
|
|
hWnd,
|
|
lpText,
|
|
lpCaption,
|
|
uType));
|
|
else
|
|
return( MessageBox9x(
|
|
hWnd,
|
|
lpText,
|
|
lpCaption,
|
|
uType));
|
|
}
|
|
|
|
|
|
int WINAPI LCMapString9x(
|
|
LCID Locale, // locale identifier
|
|
DWORD dwMapFlags, // mapping transformation type
|
|
LPCWSTR lpSrcStr, // address of source string
|
|
int cchSrc, // number of characters in source string
|
|
LPWSTR lpDestStr, // address of destination buffer
|
|
int cchDest // size of destination buffer
|
|
) {
|
|
BYTE rgb1[_MAX_PATH];
|
|
char * szBuffer = NULL;
|
|
LPSTR szBuffer1 = NULL;
|
|
int cbConverted;
|
|
|
|
LONG err = GetLastError();
|
|
LONG cb = 0;
|
|
|
|
SetLastError(ERROR_OUTOFMEMORY);
|
|
|
|
// translate lpSrcStr to src ANSI szBuffer
|
|
if(MkMBStrEx(rgb1, _MAX_PATH, lpSrcStr, cchSrc, &szBuffer, &cbConverted) )
|
|
{
|
|
// Malloc the intermediate ANSI buf
|
|
if( NULL != (szBuffer1 = (LPSTR) malloc(cchDest)) ) {
|
|
|
|
// do translation from szBuffer into lpDestStr
|
|
cb = LCMapStringA(
|
|
Locale,
|
|
dwMapFlags,
|
|
szBuffer,
|
|
cbConverted,
|
|
szBuffer1,
|
|
cchDest);
|
|
}
|
|
}
|
|
|
|
// free src ANSI szBuffer, handles NULLs
|
|
FreeMBStr(rgb1, szBuffer);
|
|
|
|
if(cb != 0) {
|
|
|
|
// translate resultant ANSI szBuffer1 to UNICODE
|
|
cb = MultiByteToWideChar(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
szBuffer1, // src (ANSI)
|
|
cb, // already incl NULL
|
|
lpDestStr, // dest (UNICODE)
|
|
cchDest);
|
|
}
|
|
|
|
if(szBuffer1 != NULL)
|
|
free(szBuffer1);
|
|
|
|
if(cb != 0)
|
|
SetLastError(err);
|
|
|
|
return(cb);
|
|
}
|
|
|
|
int WINAPI LCMapStringU(
|
|
LCID Locale, // locale identifier
|
|
DWORD dwMapFlags, // mapping transformation type
|
|
LPCWSTR lpSrcStr, // address of source string
|
|
int cchSrc, // number of characters in source string
|
|
LPWSTR lpDestStr, // address of destination buffer
|
|
int cchDest // size of destination buffer
|
|
) {
|
|
|
|
if(FIsWinNT())
|
|
return( LCMapStringW(
|
|
Locale,
|
|
dwMapFlags,
|
|
lpSrcStr,
|
|
cchSrc,
|
|
lpDestStr,
|
|
cchDest));
|
|
else
|
|
return( LCMapString9x(
|
|
Locale,
|
|
dwMapFlags,
|
|
lpSrcStr,
|
|
cchSrc,
|
|
lpDestStr,
|
|
cchDest));
|
|
}
|
|
|
|
|
|
int WINAPI GetDateFormat9x(
|
|
LCID Locale,
|
|
DWORD dwFlags,
|
|
CONST SYSTEMTIME *lpDate,
|
|
LPCWSTR lpFormat,
|
|
LPWSTR lpDateStr,
|
|
int cchDate
|
|
)
|
|
{
|
|
LPSTR szFormatString = NULL;
|
|
LPSTR szDateString = NULL;
|
|
DWORD cbszFormatString = 0;
|
|
DWORD cbszDateString = 0;
|
|
int iRet;
|
|
|
|
if (lpFormat != NULL)
|
|
{
|
|
cbszFormatString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpFormat,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszFormatString == 0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (NULL == (szFormatString = (LPSTR) malloc(cbszFormatString)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
cbszFormatString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpFormat,
|
|
-1,
|
|
szFormatString,
|
|
cbszFormatString,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszFormatString == 0)
|
|
{
|
|
free(szFormatString);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
if (cchDate == 0)
|
|
{
|
|
iRet = GetDateFormatA(
|
|
Locale,
|
|
dwFlags,
|
|
lpDate,
|
|
szFormatString,
|
|
NULL,
|
|
0
|
|
);
|
|
}
|
|
else
|
|
{
|
|
szDateString = (LPSTR) malloc(cchDate);
|
|
if (szDateString == NULL)
|
|
{
|
|
if (szFormatString)
|
|
free(szFormatString);
|
|
return FALSE;
|
|
}
|
|
|
|
iRet = GetDateFormatA(
|
|
Locale,
|
|
dwFlags,
|
|
lpDate,
|
|
szFormatString,
|
|
szDateString,
|
|
cchDate
|
|
);
|
|
|
|
MultiByteToWideChar(
|
|
0,
|
|
0,
|
|
szDateString,
|
|
-1,
|
|
lpDateStr,
|
|
cchDate
|
|
);
|
|
}
|
|
|
|
if (szFormatString)
|
|
free(szFormatString);
|
|
|
|
if (szDateString)
|
|
free(szDateString);
|
|
|
|
return (iRet);
|
|
}
|
|
|
|
int WINAPI GetDateFormatU(
|
|
LCID Locale,
|
|
DWORD dwFlags,
|
|
CONST SYSTEMTIME *lpDate,
|
|
LPCWSTR lpFormat,
|
|
LPWSTR lpDateStr,
|
|
int cchDate
|
|
)
|
|
{
|
|
if(FIsWinNT())
|
|
return(GetDateFormatW(
|
|
Locale,
|
|
dwFlags,
|
|
lpDate,
|
|
lpFormat,
|
|
lpDateStr,
|
|
cchDate
|
|
));
|
|
else
|
|
return(GetDateFormat9x(
|
|
Locale,
|
|
dwFlags,
|
|
lpDate,
|
|
lpFormat,
|
|
lpDateStr,
|
|
cchDate
|
|
));
|
|
}
|
|
|
|
|
|
int WINAPI GetTimeFormat9x(
|
|
LCID Locale,
|
|
DWORD dwFlags,
|
|
CONST SYSTEMTIME *lpTime,
|
|
LPCWSTR lpFormat,
|
|
LPWSTR lpTimeStr,
|
|
int cchTime
|
|
)
|
|
{
|
|
LPSTR szFormatString = NULL;
|
|
LPSTR szTimeString = NULL;
|
|
DWORD cbszFormatString = 0;
|
|
DWORD cbszTimeString = 0;
|
|
int iRet;
|
|
|
|
if (lpFormat != NULL)
|
|
{
|
|
cbszFormatString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpFormat,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszFormatString == 0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (NULL == (szFormatString = (LPSTR) malloc(cbszFormatString)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
cbszFormatString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpFormat,
|
|
-1,
|
|
szFormatString,
|
|
cbszFormatString,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszFormatString == 0)
|
|
{
|
|
free(szFormatString);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
if (cchTime == 0)
|
|
{
|
|
iRet = GetTimeFormatA(
|
|
Locale,
|
|
dwFlags,
|
|
lpTime,
|
|
szFormatString,
|
|
NULL,
|
|
0
|
|
);
|
|
}
|
|
else
|
|
{
|
|
szTimeString = (LPSTR) malloc(cchTime);
|
|
if (szTimeString == NULL)
|
|
{
|
|
if (szFormatString)
|
|
free(szFormatString);
|
|
return FALSE;
|
|
}
|
|
|
|
iRet = GetTimeFormatA(
|
|
Locale,
|
|
dwFlags,
|
|
lpTime,
|
|
szFormatString,
|
|
szTimeString,
|
|
cchTime
|
|
);
|
|
|
|
MultiByteToWideChar(
|
|
0,
|
|
0,
|
|
szTimeString,
|
|
-1,
|
|
lpTimeStr,
|
|
cchTime
|
|
);
|
|
}
|
|
|
|
if (szFormatString != NULL)
|
|
free(szFormatString);
|
|
|
|
if (szTimeString != NULL)
|
|
free(szTimeString);
|
|
|
|
return (iRet);
|
|
}
|
|
|
|
int WINAPI GetTimeFormatU(
|
|
LCID Locale,
|
|
DWORD dwFlags,
|
|
CONST SYSTEMTIME *lpTime,
|
|
LPCWSTR lpFormat,
|
|
LPWSTR lpTimeStr,
|
|
int cchTime
|
|
)
|
|
{
|
|
if(FIsWinNT())
|
|
return(GetTimeFormatW(
|
|
Locale,
|
|
dwFlags,
|
|
lpTime,
|
|
lpFormat,
|
|
lpTimeStr,
|
|
cchTime
|
|
));
|
|
else
|
|
return(GetTimeFormat9x(
|
|
Locale,
|
|
dwFlags,
|
|
lpTime,
|
|
lpFormat,
|
|
lpTimeStr,
|
|
cchTime
|
|
));
|
|
}
|
|
|
|
|
|
BOOL WINAPI WinHelp9x(
|
|
HWND hWndMain,
|
|
LPCWSTR lpszHelp,
|
|
UINT uCommand,
|
|
DWORD dwData
|
|
)
|
|
{
|
|
LPSTR szHelpString = NULL;
|
|
DWORD cbszHelpString = 0;
|
|
BOOL bRet;
|
|
|
|
cbszHelpString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpszHelp,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszHelpString == 0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (NULL == (szHelpString = (LPSTR) malloc(cbszHelpString)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
cbszHelpString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
lpszHelp,
|
|
-1,
|
|
szHelpString,
|
|
cbszHelpString,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszHelpString == 0)
|
|
{
|
|
free(szHelpString);
|
|
return FALSE;
|
|
}
|
|
|
|
bRet = WinHelpA(
|
|
hWndMain,
|
|
szHelpString,
|
|
uCommand,
|
|
dwData
|
|
);
|
|
|
|
free(szHelpString);
|
|
|
|
return (bRet);
|
|
}
|
|
|
|
BOOL WINAPI WinHelpU(
|
|
HWND hWndMain,
|
|
LPCWSTR lpszHelp,
|
|
UINT uCommand,
|
|
DWORD dwData
|
|
)
|
|
{
|
|
if(FIsWinNT())
|
|
return(WinHelpW(
|
|
hWndMain,
|
|
lpszHelp,
|
|
uCommand,
|
|
dwData
|
|
));
|
|
else
|
|
return(WinHelp9x(
|
|
hWndMain,
|
|
lpszHelp,
|
|
uCommand,
|
|
dwData
|
|
));
|
|
}
|
|
|
|
|
|
LRESULT WINAPI SendMessageU(
|
|
HWND hWnd,
|
|
UINT Msg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
if(FIsWinNT())
|
|
{
|
|
return(SendMessageW(
|
|
hWnd,
|
|
Msg,
|
|
wParam,
|
|
lParam
|
|
));
|
|
}
|
|
else
|
|
{
|
|
return(SendMessageA(
|
|
hWnd,
|
|
Msg,
|
|
wParam,
|
|
lParam
|
|
));
|
|
}
|
|
}
|
|
|
|
|
|
LONG
|
|
WINAPI
|
|
SendDlgItemMessageU(
|
|
HWND hDlg,
|
|
int nIDDlgItem,
|
|
UINT Msg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
LPSTR szString = NULL;
|
|
DWORD cbszString = 0;
|
|
LONG lRet;
|
|
|
|
// only do string conversion for string type messages
|
|
if (Msg != LB_ADDSTRING &&
|
|
Msg != CB_INSERTSTRING &&
|
|
Msg != WM_SETTEXT &&
|
|
Msg != CB_FINDSTRINGEXACT &&
|
|
Msg != CB_ADDSTRING)
|
|
{
|
|
return(SendDlgItemMessageA(
|
|
hDlg,
|
|
nIDDlgItem,
|
|
Msg,
|
|
wParam,
|
|
lParam
|
|
));
|
|
}
|
|
|
|
if(FIsWinNT())
|
|
{
|
|
return(SendDlgItemMessageW(
|
|
hDlg,
|
|
nIDDlgItem,
|
|
Msg,
|
|
wParam,
|
|
lParam
|
|
));
|
|
}
|
|
|
|
cbszString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
(LPWSTR) lParam,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszString == 0)
|
|
{
|
|
return LB_ERR;
|
|
}
|
|
|
|
if (NULL == (szString = (LPSTR) malloc(cbszString)))
|
|
{
|
|
return LB_ERR;
|
|
}
|
|
|
|
cbszString = WideCharToMultiByte(
|
|
0, // codepage
|
|
0, // dwFlags
|
|
(LPWSTR) lParam,
|
|
-1,
|
|
szString,
|
|
cbszString,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cbszString == 0)
|
|
{
|
|
free(szString);
|
|
return LB_ERR;
|
|
}
|
|
|
|
lRet = SendDlgItemMessageA(
|
|
hDlg,
|
|
nIDDlgItem,
|
|
Msg,
|
|
wParam,
|
|
(LPARAM) szString
|
|
);
|
|
|
|
free(szString);
|
|
|
|
return (lRet);
|
|
}
|
|
|
|
LPWSTR
|
|
WINAPI
|
|
GetCommandLineU(void)
|
|
{
|
|
LPSTR szCmdLine = NULL;
|
|
LPWSTR wszCmdLine = NULL;
|
|
|
|
if (FIsWinNT())
|
|
return (GetCommandLineW());
|
|
|
|
szCmdLine = GetCommandLineA();
|
|
|
|
wszCmdLine = MkWStr(szCmdLine);
|
|
return (wszCmdLine);
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
IsBadStringPtr9x(IN LPWSTR lpsz, UINT ucchMax)
|
|
{
|
|
BYTE rgb[2048];
|
|
char *sz = NULL;
|
|
BOOL bResult = FALSE;
|
|
|
|
if (MkMBStr(rgb, _MAX_PATH, lpsz, &sz))
|
|
bResult = IsBadStringPtrA(sz, ucchMax);
|
|
|
|
FreeMBStr(rgb, sz);
|
|
|
|
return (bResult);
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
IsBadStringPtrU(IN LPWSTR lpsz, UINT ucchMax)
|
|
{
|
|
if (FIsWinNT())
|
|
return (IsBadStringPtrW(lpsz, ucchMax));
|
|
else
|
|
return (IsBadStringPtr9x(lpsz, ucchMax));
|
|
}
|
|
|
|
|
|
void
|
|
WINAPI
|
|
OutputDebugString9x(IN LPWSTR lpwsz)
|
|
{
|
|
BYTE rgb[_MAX_PATH];
|
|
char *sz = NULL;
|
|
|
|
if (MkMBStr(rgb, _MAX_PATH, lpwsz, &sz))
|
|
OutputDebugStringA(sz);
|
|
|
|
FreeMBStr(rgb, sz);
|
|
|
|
return;
|
|
}
|
|
|
|
void
|
|
WINAPI
|
|
OutputDebugStringU(IN LPWSTR lpwsz)
|
|
{
|
|
//DSIE: bug 171074.
|
|
if (!lpwsz)
|
|
return;
|
|
|
|
if (FIsWinNT())
|
|
OutputDebugStringW(lpwsz);
|
|
else
|
|
OutputDebugString9x(lpwsz);
|
|
}
|
|
|
|
int
|
|
WINAPI
|
|
DrawText9x(
|
|
HDC hDC,
|
|
LPCWSTR lpString,
|
|
int nCount,
|
|
LPRECT lpRect,
|
|
UINT uFormat
|
|
)
|
|
{
|
|
LPSTR pszText;
|
|
int ret;
|
|
|
|
if (NULL == (pszText = (LPSTR) malloc(wcslen(lpString)+1)))
|
|
{
|
|
SetLastError(ERROR_OUTOFMEMORY);
|
|
return(0);
|
|
}
|
|
|
|
WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
lpString,
|
|
-1,
|
|
pszText,
|
|
wcslen(lpString)+1,
|
|
NULL,
|
|
NULL);
|
|
|
|
ret = DrawTextA(hDC, pszText, nCount, lpRect, uFormat);
|
|
|
|
free(pszText);
|
|
return ret;
|
|
}
|
|
|
|
int
|
|
WINAPI
|
|
DrawTextU(
|
|
HDC hDC,
|
|
LPCWSTR lpString,
|
|
int nCount,
|
|
LPRECT lpRect,
|
|
UINT uFormat
|
|
)
|
|
{
|
|
if (FIsWinNT())
|
|
return (DrawTextW(hDC, lpString, nCount, lpRect, uFormat));
|
|
else
|
|
return (DrawText9x(hDC, lpString, nCount, lpRect, uFormat));
|
|
}
|
|
|
|
|
|
void CleanUpOpenFileNameA(LPOPENFILENAMEA pOpenFileNameA)
|
|
{
|
|
if (pOpenFileNameA->lpstrFilter != NULL)
|
|
free((void *) pOpenFileNameA->lpstrFilter);
|
|
|
|
if (pOpenFileNameA->lpstrCustomFilter != NULL)
|
|
free((void *) pOpenFileNameA->lpstrCustomFilter);
|
|
|
|
if (pOpenFileNameA->lpstrFile != NULL)
|
|
free((void *) pOpenFileNameA->lpstrFile);
|
|
|
|
if (pOpenFileNameA->lpstrFileTitle)
|
|
free((void *) pOpenFileNameA->lpstrFileTitle);
|
|
|
|
if (pOpenFileNameA->lpstrInitialDir)
|
|
free((void *) pOpenFileNameA->lpstrInitialDir);
|
|
|
|
if (pOpenFileNameA->lpstrTitle)
|
|
free((void *) pOpenFileNameA->lpstrTitle);
|
|
|
|
if (pOpenFileNameA->lpstrDefExt)
|
|
free((void *) pOpenFileNameA->lpstrDefExt);
|
|
}
|
|
|
|
//
|
|
// NOTE the following fields in LPOPENFILENAMEW are NOT supported:
|
|
// nFileOffset
|
|
// nFileExtension
|
|
// lpTemplateName
|
|
//
|
|
BOOL ConvertToOpenFileNameA(LPOPENFILENAMEW pOpenFileNameW, LPOPENFILENAMEA pOpenFileNameA)
|
|
{
|
|
int i;
|
|
int cb, cb1, cb2;
|
|
LPSTR pszTemp;
|
|
BOOL fResult = TRUE;
|
|
|
|
memset(pOpenFileNameA, 0, sizeof(OPENFILENAMEA));
|
|
pOpenFileNameA->lStructSize = offsetof(OPENFILENAMEA, lpTemplateName) + sizeof(LPCSTR);
|
|
pOpenFileNameA->hwndOwner = pOpenFileNameW->hwndOwner;
|
|
pOpenFileNameA->hInstance = pOpenFileNameW->hInstance;
|
|
|
|
//
|
|
// the lpstrFilter field is a list of pairs of NULL terminated strings
|
|
//
|
|
if (pOpenFileNameW->lpstrFilter != NULL)
|
|
{
|
|
i = 0;
|
|
cb = 0;
|
|
while (pOpenFileNameW->lpstrFilter[i] != L'\0')
|
|
{
|
|
cb += WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
&(pOpenFileNameW->lpstrFilter[i]),
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
i += wcslen(&(pOpenFileNameW->lpstrFilter[i])) + 1;
|
|
}
|
|
|
|
pOpenFileNameA->lpstrFilter = (LPSTR) malloc(cb + 1);
|
|
if (pOpenFileNameA->lpstrFilter == NULL)
|
|
{
|
|
goto OutOfMemory;
|
|
}
|
|
|
|
WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
pOpenFileNameW->lpstrFilter,
|
|
i + 1,
|
|
(LPSTR)pOpenFileNameA->lpstrFilter,
|
|
cb + 1,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
else
|
|
{
|
|
pOpenFileNameA->lpstrFilter = NULL;
|
|
}
|
|
|
|
//
|
|
// the lpstrCustomFilter field is a pair of NULL terminated strings
|
|
//
|
|
if (pOpenFileNameW->lpstrCustomFilter != NULL)
|
|
{
|
|
cb1 = WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
pOpenFileNameW->lpstrCustomFilter,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
cb2 = WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
&(pOpenFileNameW->lpstrCustomFilter[wcslen(pOpenFileNameW->lpstrCustomFilter)+1]),
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
pOpenFileNameA->lpstrCustomFilter = (LPSTR) malloc(cb1 + cb2);
|
|
if (pOpenFileNameA->lpstrCustomFilter == NULL)
|
|
{
|
|
goto OutOfMemory;
|
|
}
|
|
|
|
WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
pOpenFileNameW->lpstrCustomFilter,
|
|
-1,
|
|
pOpenFileNameA->lpstrCustomFilter,
|
|
cb1,
|
|
NULL,
|
|
NULL);
|
|
WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
&(pOpenFileNameW->lpstrCustomFilter[wcslen(pOpenFileNameW->lpstrCustomFilter)+1]),
|
|
-1,
|
|
&(pOpenFileNameA->lpstrCustomFilter[cb1]),
|
|
cb2,
|
|
NULL,
|
|
NULL);
|
|
|
|
pOpenFileNameA->nMaxCustFilter = cb1 + cb2;
|
|
}
|
|
else
|
|
{
|
|
pOpenFileNameA->lpstrCustomFilter = NULL;
|
|
pOpenFileNameA->nMaxCustFilter = 0;
|
|
}
|
|
|
|
pOpenFileNameA->nFilterIndex = pOpenFileNameW->nFilterIndex;
|
|
|
|
pOpenFileNameA->lpstrFile = (LPSTR) malloc(pOpenFileNameW->nMaxFile);
|
|
if (pOpenFileNameA->lpstrFile == NULL)
|
|
{
|
|
goto OutOfMemory;
|
|
}
|
|
WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
pOpenFileNameW->lpstrFile,
|
|
-1,
|
|
pOpenFileNameA->lpstrFile,
|
|
pOpenFileNameW->nMaxFile,
|
|
NULL,
|
|
NULL);
|
|
pOpenFileNameA->nMaxFile = pOpenFileNameW->nMaxFile;
|
|
|
|
if (pOpenFileNameW->lpstrFileTitle != NULL)
|
|
{
|
|
pOpenFileNameA->lpstrFileTitle = (LPSTR) malloc(pOpenFileNameW->nMaxFileTitle);
|
|
if (pOpenFileNameA->lpstrFileTitle == NULL)
|
|
{
|
|
goto OutOfMemory;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pOpenFileNameA->lpstrFileTitle = NULL;
|
|
}
|
|
pOpenFileNameA->nMaxFileTitle = pOpenFileNameW->nMaxFileTitle;
|
|
|
|
if (pOpenFileNameW->lpstrInitialDir != NULL)
|
|
{
|
|
cb = WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
pOpenFileNameW->lpstrInitialDir,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
pOpenFileNameA->lpstrInitialDir = (LPSTR) malloc(cb);
|
|
if (pOpenFileNameA->lpstrInitialDir == NULL)
|
|
{
|
|
goto OutOfMemory;
|
|
}
|
|
|
|
WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
pOpenFileNameW->lpstrInitialDir,
|
|
-1,
|
|
(LPSTR) pOpenFileNameA->lpstrInitialDir,
|
|
cb,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
else
|
|
{
|
|
pOpenFileNameW->lpstrInitialDir = NULL;
|
|
}
|
|
|
|
if (pOpenFileNameW->lpstrTitle != NULL)
|
|
{
|
|
cb = WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
pOpenFileNameW->lpstrTitle,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
pOpenFileNameA->lpstrTitle = (LPSTR) malloc(cb);
|
|
if (pOpenFileNameA->lpstrTitle == NULL)
|
|
{
|
|
goto OutOfMemory;
|
|
}
|
|
|
|
WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
pOpenFileNameW->lpstrTitle,
|
|
-1,
|
|
(LPSTR) pOpenFileNameA->lpstrTitle,
|
|
cb,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
else
|
|
{
|
|
pOpenFileNameW->lpstrTitle = NULL;
|
|
}
|
|
|
|
pOpenFileNameA->Flags = pOpenFileNameW->Flags;
|
|
pOpenFileNameA->nFileOffset = 0;
|
|
pOpenFileNameA->nFileExtension = 0;
|
|
|
|
if (pOpenFileNameW->lpstrDefExt != NULL)
|
|
{
|
|
cb = WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
pOpenFileNameW->lpstrDefExt,
|
|
-1,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
pOpenFileNameA->lpstrDefExt = (LPSTR) malloc(cb);
|
|
if (pOpenFileNameA->lpstrDefExt == NULL)
|
|
{
|
|
goto OutOfMemory;
|
|
}
|
|
|
|
WideCharToMultiByte(
|
|
0,
|
|
0,
|
|
pOpenFileNameW->lpstrDefExt,
|
|
-1,
|
|
(LPSTR) pOpenFileNameA->lpstrDefExt,
|
|
cb,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
else
|
|
{
|
|
pOpenFileNameW->lpstrDefExt = NULL;
|
|
}
|
|
|
|
pOpenFileNameA->lCustData = pOpenFileNameW->lCustData;
|
|
pOpenFileNameA->lpfnHook = pOpenFileNameW->lpfnHook;
|
|
pOpenFileNameA->lpTemplateName = NULL;
|
|
|
|
|
|
goto Return;
|
|
|
|
OutOfMemory:
|
|
|
|
CleanUpOpenFileNameA(pOpenFileNameA);
|
|
SetLastError(E_OUTOFMEMORY);
|
|
fResult = FALSE;
|
|
|
|
Return:
|
|
|
|
return (fResult);
|
|
}
|
|
|
|
|
|
typedef BOOL (WINAPI * PFNCGETSAVEFILENAMEW)(LPOPENFILENAMEW pOpenFileName);
|
|
typedef BOOL (WINAPI * PFNCGETSAVEFILENAMEA)(LPOPENFILENAMEA pOpenFileName);
|
|
|
|
BOOL
|
|
GetSaveFileName9x(
|
|
LPOPENFILENAMEW pOpenFileName
|
|
)
|
|
{
|
|
OPENFILENAMEA OpenFileNameA;
|
|
HINSTANCE h_module;
|
|
PFNCGETSAVEFILENAMEA pfncGetSaveFileNameA;
|
|
BOOL fRet;
|
|
|
|
h_module = LoadLibraryA("comdlg32.dll");
|
|
if (h_module == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (!ConvertToOpenFileNameA(pOpenFileName, &OpenFileNameA))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
pfncGetSaveFileNameA = (PFNCGETSAVEFILENAMEA) GetProcAddress(h_module, "GetSaveFileNameA");
|
|
if (pfncGetSaveFileNameA == NULL)
|
|
{
|
|
CleanUpOpenFileNameA(&OpenFileNameA);
|
|
return FALSE;
|
|
}
|
|
fRet = pfncGetSaveFileNameA(&OpenFileNameA);
|
|
DWORD dwErr = GetLastError();
|
|
|
|
if (fRet)
|
|
{
|
|
MultiByteToWideChar(
|
|
0,
|
|
0,
|
|
OpenFileNameA.lpstrFile,
|
|
-1,
|
|
pOpenFileName->lpstrFile,
|
|
pOpenFileName->nMaxFile);
|
|
}
|
|
|
|
CleanUpOpenFileNameA(&OpenFileNameA);
|
|
|
|
|
|
FreeLibrary(h_module);
|
|
return fRet;
|
|
}
|
|
|
|
BOOL
|
|
GetSaveFileNameU(
|
|
LPOPENFILENAMEW pOpenFileName
|
|
)
|
|
{
|
|
HINSTANCE h_module;
|
|
PFNCGETSAVEFILENAMEW pfncGetSaveFileNameW;
|
|
BOOL fRet;
|
|
|
|
if (FIsWinNT())
|
|
{
|
|
h_module = LoadLibraryA("comdlg32.dll");
|
|
if (h_module == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
pfncGetSaveFileNameW = (PFNCGETSAVEFILENAMEW) GetProcAddress(h_module, "GetSaveFileNameW");
|
|
if (pfncGetSaveFileNameW == NULL)
|
|
{
|
|
fRet = FALSE;
|
|
}
|
|
else
|
|
{
|
|
fRet = pfncGetSaveFileNameW(pOpenFileName);
|
|
}
|
|
|
|
FreeLibrary(h_module);
|
|
}
|
|
else
|
|
{
|
|
fRet = GetSaveFileName9x(pOpenFileName);
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|
|
|
|
typedef BOOL (WINAPI * PFNCGETOPENFILENAMEW)(LPOPENFILENAMEW pOpenFileName);
|
|
typedef BOOL (WINAPI * PFNCGETOPENFILENAMEA)(LPOPENFILENAMEA pOpenFileName);
|
|
|
|
BOOL
|
|
GetOpenFileName9x(
|
|
LPOPENFILENAMEW pOpenFileName
|
|
)
|
|
{
|
|
OPENFILENAMEA OpenFileNameA;
|
|
HINSTANCE h_module;
|
|
PFNCGETOPENFILENAMEA pfncGetOpenFileNameA;
|
|
BOOL fRet;
|
|
|
|
h_module = LoadLibraryA("comdlg32.dll");
|
|
if (h_module == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (!ConvertToOpenFileNameA(pOpenFileName, &OpenFileNameA))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
pfncGetOpenFileNameA = (PFNCGETOPENFILENAMEA) GetProcAddress(h_module, "GetOpenFileNameA");
|
|
if (pfncGetOpenFileNameA == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
fRet = pfncGetOpenFileNameA(&OpenFileNameA);
|
|
DWORD dwErr = GetLastError();
|
|
|
|
MultiByteToWideChar(
|
|
0,
|
|
0,
|
|
OpenFileNameA.lpstrFile,
|
|
-1,
|
|
pOpenFileName->lpstrFile,
|
|
pOpenFileName->nMaxFile);
|
|
|
|
CleanUpOpenFileNameA(&OpenFileNameA);
|
|
|
|
FreeLibrary(h_module);
|
|
return fRet;
|
|
}
|
|
|
|
BOOL
|
|
GetOpenFileNameU(
|
|
LPOPENFILENAMEW pOpenFileName
|
|
)
|
|
{
|
|
HINSTANCE h_module;
|
|
PFNCGETOPENFILENAMEW pfncGetOpenFileNameW;
|
|
BOOL fRet;
|
|
|
|
if (FIsWinNT())
|
|
{
|
|
h_module = LoadLibraryA("comdlg32.dll");
|
|
if (h_module == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
pfncGetOpenFileNameW = (PFNCGETOPENFILENAMEW) GetProcAddress(h_module, "GetOpenFileNameW");
|
|
if (pfncGetOpenFileNameW == NULL)
|
|
{
|
|
fRet = FALSE;
|
|
}
|
|
else
|
|
{
|
|
fRet = pfncGetOpenFileNameW(pOpenFileName);
|
|
}
|
|
|
|
FreeLibrary(h_module);
|
|
}
|
|
else
|
|
{
|
|
fRet = GetOpenFileName9x(pOpenFileName);
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|
|
|
|
|
|
#endif // _M_IX86
|