Files
harbour-core/contrib/hbwin/win_misc_1.c
Viktor Szakats 25e0853a49 2017-09-11 20:36 UTC Viktor Szakats (vszakats users.noreply.github.com)
* contrib/hbwin/hbwin.hbp
  * contrib/hbwin/wapi_winbase.c -> contrib/hbwin/wapi_winbase_1.c
  * contrib/hbwin/wapi_winuser.c -> contrib/hbwin/wapi_winuser_1.c
  * contrib/hbwin/win_misc.c -> contrib/hbwin/win_misc_1.c
  + contrib/hbwin/wapi_winbase_2.c
  + contrib/hbwin/wapi_winuser_2.c
  + contrib/hbwin/win_misc_2.c
    % sync file-splits with 3.4 fork

  * src/rtl/val.c
    * sync with 3.4 fork (no change in functionality)
2017-09-11 20:37:19 +00:00

251 lines
6.7 KiB
C

/*
* Misc Windows API functions
*
* Copyright 2008-2009 Viktor Szakats (vszakats.net/harbour)
* Copyright 2009 Francesco Saverio Giudice <info / at / fsgiudice.com> (win_SysRefresh())
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file LICENSE.txt. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA (or visit https://www.gnu.org/licenses/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
#include "hbwapi.h"
#include "hbapiitm.h"
#ifndef QS_ALLPOSTMESSAGE
#define QS_ALLPOSTMESSAGE 0x0100
#endif
HB_FUNC( WIN_LOADRESOURCE )
{
HANDLE hInstance = NULL;
/* Set default return value */
hb_retc_null();
if( hb_winmainArgGet( &hInstance, NULL, NULL ) )
{
void * hName;
void * hType;
HRSRC hRes = FindResource( ( HMODULE ) hInstance,
HB_PARSTRDEF( 1, &hName, NULL ),
HB_PARSTRDEF( 2, &hType, NULL ) );
if( hRes )
{
HGLOBAL hMem = LoadResource( NULL, hRes );
if( hMem )
{
void * pMem = LockResource( hMem );
if( pMem )
hb_retclen( ( char * ) pMem, SizeofResource( NULL, hRes ) );
}
}
hb_strfree( hName );
hb_strfree( hType );
}
}
HB_FUNC( WIN_GETCOMMANDLINEPARAM )
{
LPCTSTR lpCmdLine = GetCommandLine();
HB_BOOL fQuote = HB_FALSE;
long pos;
/* Skip application path */
pos = 0;
while( lpCmdLine[ pos ] && ( fQuote || ! HB_ISSPACE( lpCmdLine[ pos ] ) ) )
{
if( lpCmdLine[ pos ] == '"' )
fQuote = ! fQuote;
pos++;
}
while( HB_ISSPACE( lpCmdLine[ pos ] ) )
pos++;
HB_RETSTR( lpCmdLine + pos );
}
HB_FUNC( WIN_ANSITOWIDE )
{
HB_SIZE nLen = hb_parclen( 1 );
LPCSTR lpSrcMB = hb_parcx( 1 );
DWORD dwLength = MultiByteToWideChar( CP_ACP, 0, lpSrcMB, ( int ) nLen, NULL, 0 );
LPWSTR lpDstWide = ( LPWSTR ) hb_xgrab( ( dwLength + 1 ) * sizeof( wchar_t ) );
MultiByteToWideChar( CP_ACP, 0, lpSrcMB, ( int ) nLen, lpDstWide, dwLength + 1 );
hb_retclen_buffer( ( char * ) lpDstWide, ( HB_SIZE ) ( dwLength * sizeof( wchar_t ) ) );
}
HB_FUNC( WIN_WIDETOANSI )
{
HB_SIZE nLen = hb_parclen( 1 );
LPCWSTR lpSrcWide = ( LPCWSTR ) hb_parcx( 1 );
DWORD dwLength = WideCharToMultiByte( CP_ACP, 0, lpSrcWide, ( int ) nLen, NULL, 0, NULL, NULL );
LPSTR lpDstMB = ( LPSTR ) hb_xgrab( dwLength + 1 );
WideCharToMultiByte( CP_ACP, 0, lpSrcWide, ( int ) nLen, lpDstMB, dwLength + 1, NULL, NULL );
hb_retclen_buffer( lpDstMB, ( HB_SIZE ) dwLength );
}
HB_FUNC( WIN_UNICODE )
{
#if defined( UNICODE )
hb_retl( HB_TRUE );
#else
hb_retl( HB_FALSE );
#endif
}
HB_FUNC( WIN_N2P )
{
hb_retptr( ( void * ) ( HB_PTRUINT ) hb_parnint( 1 ) );
}
HB_FUNC( WIN_P2N )
{
hb_retnint( ( HB_PTRUINT ) hb_parptr( 1 ) );
}
HB_FUNC( WIN_HINSTANCE )
{
HANDLE hInstance;
hb_winmainArgGet( &hInstance, NULL, NULL );
hb_retptr( hInstance );
}
HB_FUNC( WIN_HPREVINSTANCE )
{
HANDLE hPrevInstance;
hb_winmainArgGet( NULL, &hPrevInstance, NULL );
hb_retptr( hPrevInstance );
}
HB_FUNC( WIN_NCMDSHOW )
{
int nCmdShow;
hb_winmainArgGet( NULL, NULL, &nCmdShow );
hb_retni( nCmdShow );
}
HB_FUNC( WIN_LOWORD )
{
hb_retni( ( int ) LOWORD( ( DWORD ) hb_parnl( 1 ) ) );
}
HB_FUNC( WIN_HIWORD )
{
hb_retni( ( int ) HIWORD( ( DWORD ) hb_parnl( 1 ) ) );
}
HB_FUNC( WIN_SYSREFRESH )
{
DWORD dwMsec = ( DWORD ) hb_parnl( 1 );
HANDLE hDummyEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
/* Begin the operation and continue until it is complete
or until the user clicks the mouse or presses a key. */
if( MsgWaitForMultipleObjects( 1, &hDummyEvent, FALSE, ( dwMsec == 0 ? INFINITE : dwMsec ), QS_ALLINPUT | QS_ALLPOSTMESSAGE ) == WAIT_OBJECT_0 + 1 )
{
MSG msg;
while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
switch( msg.message )
{
case WM_CLOSE:
CloseHandle( hDummyEvent );
hb_retni( 1 );
return;
case WM_QUIT:
CloseHandle( hDummyEvent );
hb_retnint( msg.wParam );
return;
#if 0
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_KEYDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_KEYUP:
/* Perform any required cleanup. */
break;
#endif
default:
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
}
CloseHandle( hDummyEvent );
hb_retni( 0 );
}
HB_FUNC( WIN_QPCOUNTER2SEC )
{
static HB_MAXDBL s_dFrequence = 0;
if( s_dFrequence == 0 )
{
LARGE_INTEGER frequency;
if( ! QueryPerformanceFrequency( &frequency ) )
{
hb_retnd( 0 );
return;
}
s_dFrequence = ( HB_MAXDBL ) HBWAPI_GET_LARGEUINT( frequency );
}
hb_retnd( ( double ) ( ( HB_MAXDBL ) hb_parnint( 1 ) / ( HB_MAXDBL ) s_dFrequence ) );
}