Hi Antonio
I have a Fwh and xHb aplication using latest Sept/Oct2006 Fw28/xHb
This app call the tMutex.prg class Create method below. The tMutex create method calls CallDLL32(.....). In my application when CallDLL32 is called, i get a pop up msgalert "CallDll32", with a title of "calldll.c". I have tracked this down to \fwh\source\winapi\calldll.c which contains
#ifdef __BORLANDC__
..........
#else
CLIPPER CALLDLL32( PARAMS )
{
#ifndef UNICODE
MessageBox( 0, "CallDll32", "CallDll.c", 0 );
#else
MessageBox( 0, L"CallDll32", L"CallDll.c", 0 );
#endif
}
It seems the above CLIPPER CALLDLL32 is being called in error?
In addition, if I ignore the above msgalert, in the line of code below (::hMutex := CallDLL32(...) is set to an array (in stead of a numeric handle), the 2nd element of which is the correct hMutex handle
If I move tMutex.prg to earlier in my xbp link script, the problem is resolved, but that is an unsatisfactory solution
Can you think what might be causing this?
Thanks
Peter
*********************
Method Create( sMutexAttr, lInitialOwner, cName ) Class TMutex
Local hDLL := LoadLib32( iKERNEL )
Local cFarProc, cFunc := "CreateMutexA", cBuffer := Nil
Default lInitialOwner := .F., cName := "FiveWin App"
If ValType( sMutexAttr ) == "O" .and. ;
Upper( sMutexAttr:className() ) == "TSTRUCT"
cBuffer := sMutexAttr:cBuffer
Endif
::cName := cName
If Abs( hDLL ) > 32 /*LPSTR*/ // LPSTR fails under 32bits!
cFarProc := GetProc32( hDLL, cFunc, iASPASCAL, LONG, LONG, LONG, STRING )
::hMutex := CallDLL32( cFarProc, ;
If( cBuffer # Nil, @cBuffer, cBuffer ), ; // lpMutexAttributes, security descriptor structure or nil
Bool2Int( lInitialOwner ), ; // bInitialOwner, initial owner
cName + Chr(0) ) // lpName, object name
FreeLib32( hDLL )
If cBuffer # Nil
sMutexAttr:cBuffer := cBuffer
Endif
Else
::Failed( hDLL, cFunc )
Endif
Return Self
*********************
CallDll32 funny
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Thank you
I now see that tMutex.prg does have the following at the bottom of the tMutex.prg (see end of mail)
So that would mean the fwh calldll.c function 'CLIPPER CALLDLL32( PARAMS )' is being called instead of the 'Function CallDLL32' below (in tMutex).
This should only happen if calldll.c (in FiveHcm.lib) is linked in before tMutex.prg. I am using xBuildW.exe which links FiveHcm.lib in automatically - I will have to investigate further
****************
#ifdef __HARBOUR__
Function LoadLib32( cDll )
Return LoadLibrary( cDll )
Function FreeLib32( hDll )
Return FreeLibrary( hDll )
Function GetProc32( hDLL, cFunc, lType, nRetType, nPType1, nPType2, nPType3, nPType4, nPType5, nPType6, nPType7, nPType8, nPType9, nPType10 )
Return GetProcAddress( hDLL, cFunc, lType, nRetType, nPType1, nPType2, nPType3, nPType4, nPType5, nPType6, nPType7, nPType8, nPType9, nPType10 )
Function CallDLL32( cFarProc, uParam1, uParam2, uParam3, uParam4, uParam5, uParam6, uParam7, uParam8, uParam9, uParam10 )
Return CallDLL( cFarProc, uParam1, uParam2, uParam3, uParam4, uParam5, uParam6, uParam7, uParam8, uParam9, uParam10 )
#endif
I now see that tMutex.prg does have the following at the bottom of the tMutex.prg (see end of mail)
So that would mean the fwh calldll.c function 'CLIPPER CALLDLL32( PARAMS )' is being called instead of the 'Function CallDLL32' below (in tMutex).
This should only happen if calldll.c (in FiveHcm.lib) is linked in before tMutex.prg. I am using xBuildW.exe which links FiveHcm.lib in automatically - I will have to investigate further
****************
#ifdef __HARBOUR__
Function LoadLib32( cDll )
Return LoadLibrary( cDll )
Function FreeLib32( hDll )
Return FreeLibrary( hDll )
Function GetProc32( hDLL, cFunc, lType, nRetType, nPType1, nPType2, nPType3, nPType4, nPType5, nPType6, nPType7, nPType8, nPType9, nPType10 )
Return GetProcAddress( hDLL, cFunc, lType, nRetType, nPType1, nPType2, nPType3, nPType4, nPType5, nPType6, nPType7, nPType8, nPType9, nPType10 )
Function CallDLL32( cFarProc, uParam1, uParam2, uParam3, uParam4, uParam5, uParam6, uParam7, uParam8, uParam9, uParam10 )
Return CallDLL( cFarProc, uParam1, uParam2, uParam3, uParam4, uParam5, uParam6, uParam7, uParam8, uParam9, uParam10 )
#endif
Peter
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact: