access to window via its :hwnd
- don lowenstein
- Posts: 196
- Joined: Mon Oct 17, 2005 9:09 pm
- Contact:
access to window via its :hwnd
I have a harbour .dll which I call dynamically.
I wish to pass a window-object ( ownd ) to the dll, but so far I have only been able to pass the window's handle to the .dll
so, today, the calling program passes the window's self:hwnd
the window handle is passed to the dynamic external .dll
question - when the .dll receives the window's handle, how does that process gain access to the actual window object, identified by :hwnd ??
If I could pass the actual windows object, that would be great.
I followed the basic convention used in the FWH samples babudll.prg and babu.prg.
thanks in advance.
I wish to pass a window-object ( ownd ) to the dll, but so far I have only been able to pass the window's handle to the .dll
so, today, the calling program passes the window's self:hwnd
the window handle is passed to the dynamic external .dll
question - when the .dll receives the window's handle, how does that process gain access to the actual window object, identified by :hwnd ??
If I could pass the actual windows object, that would be great.
I followed the basic convention used in the FWH samples babudll.prg and babu.prg.
thanks in advance.
Don Lowenstein
www.laapc.com
www.laapc.com
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: access to window via its :hwnd
Don,
function oWndFromHwnd( hWnd ) --> oWnd
If you use:
HbDLLEntry2( "TEST2", oWnd, nil )
then you will have access to oWnd from HbDLLEntry2()
function oWndFromHwnd( hWnd ) --> oWnd
If you use:
HbDLLEntry2( "TEST2", oWnd, nil )
then you will have access to oWnd from HbDLLEntry2()
- don lowenstein
- Posts: 196
- Joined: Mon Oct 17, 2005 9:09 pm
- Contact:
Re: access to window via its :hwnd
In this example, I added code to create a dialog in the calling program( babu.prg ) and added 1 control to it.
then, I pass to the .dll ( babudll.prg ) the following.
hItem1 := ItemNew( odialog:hwnd )
hItem2 := 'Dialog Handle Passed'
HbDLLEntry2( "TEST3", hItem1, hitem2 )
***************
within babudll.prg, the handle is properly passed.
Using, oWndFromHwnd( hWnd ) a problem exists, because that function searches the aWindows within the context of the dll.
The window was created in the calling program - babu.prg and therefore, the aWindows array in the babudll.prg does not see the window created in babu.dll, and therefore, returns NIL using this method.
Is it possible for babu.prg to pass to the dll a reference or pointer or something, so that the object created within babu.prg is visible in babudll.prg?
Using string, date, integer, boolean and decimal data types work perfectly.
thanks in advance for any guidance.
then, I pass to the .dll ( babudll.prg ) the following.
hItem1 := ItemNew( odialog:hwnd )
hItem2 := 'Dialog Handle Passed'
HbDLLEntry2( "TEST3", hItem1, hitem2 )
***************
within babudll.prg, the handle is properly passed.
Using, oWndFromHwnd( hWnd ) a problem exists, because that function searches the aWindows within the context of the dll.
The window was created in the calling program - babu.prg and therefore, the aWindows array in the babudll.prg does not see the window created in babu.dll, and therefore, returns NIL using this method.
Is it possible for babu.prg to pass to the dll a reference or pointer or something, so that the object created within babu.prg is visible in babudll.prg?
Using string, date, integer, boolean and decimal data types work perfectly.
thanks in advance for any guidance.
Don Lowenstein
www.laapc.com
www.laapc.com
- don lowenstein
- Posts: 196
- Joined: Mon Oct 17, 2005 9:09 pm
- Contact:
Re: access to window via its :hwnd
I tried passing oWnd, but the system created a GPF and froze.
I tried passing the oWnd within an array.
The array passed properly, however, the when accessing the control itself the GPF ensued.
I tried passing the oWnd within an array.
The array passed properly, however, the when accessing the control itself the GPF ensued.
Don Lowenstein
www.laapc.com
www.laapc.com
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: access to window via its :hwnd
Don,
Please post your modified PRGs here so we can test them
Please post your modified PRGs here so we can test them
- don lowenstein
- Posts: 196
- Joined: Mon Oct 17, 2005 9:09 pm
- Contact:
Re: access to window via its :hwnd
Here is the "calling program" = babu.prg modified
After that is the "dll program" = babudll.prg modified
you may want to remove the altd() breaks and the reference to the external debugging libraries.
REQUEST HB_GT_WIN
REQUEST HB_GT_WIN_DEFAULT
*********************************************************
// Using Harbour DLLs
// To build BabuDLL.dll do: buildhd.bat DLL-DON
#include "FiveWin.ch"
static hDLL
REQUEST HB_GT_WIN
REQUEST HB_GT_WIN_DEFAULT
// Harbour requirement for console debug mode comment out for Production Make/Link
// comment out this procedure for prod
procedure hb_gt_gui_default
return
*****************************************************
function Main()
// local hItem1 := ItemNew( "Hello world!-billy/don" )
// local hItem2 := ItemNew( "From a Harbour DLL-billy/don" )
local hItem1
local hItem2
local marray := {}
local i, OPRINTER
local ownd, OWAITDLG , ODIALOG, WORKTEXT, OSAY, MDLL
altd(1)
altd()
hDLL = LoadLibrary( "DLL-DON2.DLL" )
SET RESOURCES TO
DEFINE DIALOG owaitdlg FROM 1, 1 TO 222, 333 ;
STYLE nOR( WS_VISIBLE, WS_POPUP ) PIXEL
OWAITDLG:CTITLE := 'Prepare System Parameters'
worktext := ''
WORKTEXT += CR_LF()
WORKTEXT += 'Retrieving System Import' + CR_LF()
WORKTEXT += CR_LF()
WORKTEXT += 'and Upload Parameters' + CR_LF()
WORKTEXT += CR_LF()
WORKTEXT += 'This may Take Several Seconds' + CR_LF()
WORKTEXT += CR_LF()
WORKTEXT += 'Please Wait' + CR_LF()
@ 10, 20 SAY OSAY VAR WORKTEXT ;
OF OWAITDLG
ACTIVATE DIALOG OWAITDLG ;
CENTERED ;
NOWAIT
// pass the window/osay hwnd
hitem1 := ItemNew( owaitdlg:hwnd )
hitem2 := ItemNew( OSAY:hwnd )
HbDLLEntry2( "TEST3", hItem1, hitem2 )
// pass the dialog
//hitem1 := ItemNew( owaitdlg )
//hitem2 := ItemNew( OSAY:hwnd )
//HbDLLEntry2( "TEST3", hItem1, hitem2 )
ItemRelease( hItem1 )
ItemRelease( hItem2 )
FreeLibrary( hDLL )
return nil
***********
FUNCTION CR_LF()
RETURN CHR(13) + chr(10)
*************
****************************************
DLL FUNCTION HBDLLENTRY( cProc AS LPSTR ) AS LONG PASCAL LIB hDLL
DLL FUNCTION HBDLLENTRY2( cProc AS LPSTR, pItem1 AS LONG, pItem2 AS LONG ) AS LONG PASCAL LIB hDLL
// DLL FUNCTION HBDLLENTRY3( cProc AS LPSTR, pItem1 AS PTR, pItem2 AS PTR ) AS LONG PASCAL LIB hDLL
#pragma BEGINDUMP
#include <hbapi.h>
#include <hbapiitm.h>
HB_FUNC( ITEMNEW )
{
hb_retnl( ( unsigned long ) hb_itemNew( hb_param( 1, HB_IT_ANY ) ) );
}
HB_FUNC( ITEMRELEASE )
{
hb_retl( hb_itemRelease( ( PHB_ITEM ) hb_parnl( 1 ) ) );
}
#pragma ENDDUMP
************************************************************
************************************************************
"dll program"
// To build BabuDLL.dll do: buildhd.bat babuDLL
// To run this DLL, do buidh.bat dll-don2.prg
REQUEST HB_GT_WIN
REQUEST HB_GT_WIN_DEFAULT
// Harbour requirement for console debug mode comment out for Production Make/Link
// comment out this procedure for prod
procedure hb_gt_gui_default
return
***************************************************************
function Test()
MsgInfo( "Hello from inside the DLL!", 'our message 1' )
return nil
********************************************************************
function Test2( cMsg1, cMsg2 )
MsgInfo( cMsg1, cMsg2, 'our message 2' )
return nil
**************************************************************
function Test3( VAL1, VAL2 )
local a, b, c, d, e, f
local hwnd := val1
altd(1)
altd()
a := val2
b := a
altd(1)
altd()
c := d
altd(1)
altd()
// Function oWndFromHwnd( hWnd ) --> oWnd
b := oWndFromHwnd( hWnd )
return nil
****************************************************
#pragma BEGINDUMP
#include <windows.h>
#include <hbvm.h>
#include <hbapiitm.h>
BOOL WINAPI DllEntryPoint( HINSTANCE hinstDLL, DWORD fdwReason,
LPVOID lpvReserved )
{
HB_SYMBOL_UNUSED( hinstDLL );
HB_SYMBOL_UNUSED( fdwReason );
HB_SYMBOL_UNUSED( lpvReserved );
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// MessageBox( 0, "DLL properly loaded -", "DLL entry", 0 );
hb_vmInit( 0 );
break;
case DLL_PROCESS_DETACH:
// MessageBox( 0, "DLL unloaded - ", "DLL exit", 0 );
break;
}
return TRUE;
}
void pascal __export HBDLLENTRY( char * cProcName )
{
hb_itemDoC( cProcName, 0 );
}
void pascal __export HBDLLENTRY2( char * cProcName, PHB_ITEM pParam1, PHB_ITEM pParam2 )
{
hb_itemDoC( cProcName, 2, pParam1, pParam2 );
}
#pragma ENDDUMP
********************************************
After that is the "dll program" = babudll.prg modified
you may want to remove the altd() breaks and the reference to the external debugging libraries.
REQUEST HB_GT_WIN
REQUEST HB_GT_WIN_DEFAULT
*********************************************************
// Using Harbour DLLs
// To build BabuDLL.dll do: buildhd.bat DLL-DON
#include "FiveWin.ch"
static hDLL
REQUEST HB_GT_WIN
REQUEST HB_GT_WIN_DEFAULT
// Harbour requirement for console debug mode comment out for Production Make/Link
// comment out this procedure for prod
procedure hb_gt_gui_default
return
*****************************************************
function Main()
// local hItem1 := ItemNew( "Hello world!-billy/don" )
// local hItem2 := ItemNew( "From a Harbour DLL-billy/don" )
local hItem1
local hItem2
local marray := {}
local i, OPRINTER
local ownd, OWAITDLG , ODIALOG, WORKTEXT, OSAY, MDLL
altd(1)
altd()
hDLL = LoadLibrary( "DLL-DON2.DLL" )
SET RESOURCES TO
DEFINE DIALOG owaitdlg FROM 1, 1 TO 222, 333 ;
STYLE nOR( WS_VISIBLE, WS_POPUP ) PIXEL
OWAITDLG:CTITLE := 'Prepare System Parameters'
worktext := ''
WORKTEXT += CR_LF()
WORKTEXT += 'Retrieving System Import' + CR_LF()
WORKTEXT += CR_LF()
WORKTEXT += 'and Upload Parameters' + CR_LF()
WORKTEXT += CR_LF()
WORKTEXT += 'This may Take Several Seconds' + CR_LF()
WORKTEXT += CR_LF()
WORKTEXT += 'Please Wait' + CR_LF()
@ 10, 20 SAY OSAY VAR WORKTEXT ;
OF OWAITDLG
ACTIVATE DIALOG OWAITDLG ;
CENTERED ;
NOWAIT
// pass the window/osay hwnd
hitem1 := ItemNew( owaitdlg:hwnd )
hitem2 := ItemNew( OSAY:hwnd )
HbDLLEntry2( "TEST3", hItem1, hitem2 )
// pass the dialog
//hitem1 := ItemNew( owaitdlg )
//hitem2 := ItemNew( OSAY:hwnd )
//HbDLLEntry2( "TEST3", hItem1, hitem2 )
ItemRelease( hItem1 )
ItemRelease( hItem2 )
FreeLibrary( hDLL )
return nil
***********
FUNCTION CR_LF()
RETURN CHR(13) + chr(10)
*************
****************************************
DLL FUNCTION HBDLLENTRY( cProc AS LPSTR ) AS LONG PASCAL LIB hDLL
DLL FUNCTION HBDLLENTRY2( cProc AS LPSTR, pItem1 AS LONG, pItem2 AS LONG ) AS LONG PASCAL LIB hDLL
// DLL FUNCTION HBDLLENTRY3( cProc AS LPSTR, pItem1 AS PTR, pItem2 AS PTR ) AS LONG PASCAL LIB hDLL
#pragma BEGINDUMP
#include <hbapi.h>
#include <hbapiitm.h>
HB_FUNC( ITEMNEW )
{
hb_retnl( ( unsigned long ) hb_itemNew( hb_param( 1, HB_IT_ANY ) ) );
}
HB_FUNC( ITEMRELEASE )
{
hb_retl( hb_itemRelease( ( PHB_ITEM ) hb_parnl( 1 ) ) );
}
#pragma ENDDUMP
************************************************************
************************************************************
"dll program"
// To build BabuDLL.dll do: buildhd.bat babuDLL
// To run this DLL, do buidh.bat dll-don2.prg
REQUEST HB_GT_WIN
REQUEST HB_GT_WIN_DEFAULT
// Harbour requirement for console debug mode comment out for Production Make/Link
// comment out this procedure for prod
procedure hb_gt_gui_default
return
***************************************************************
function Test()
MsgInfo( "Hello from inside the DLL!", 'our message 1' )
return nil
********************************************************************
function Test2( cMsg1, cMsg2 )
MsgInfo( cMsg1, cMsg2, 'our message 2' )
return nil
**************************************************************
function Test3( VAL1, VAL2 )
local a, b, c, d, e, f
local hwnd := val1
altd(1)
altd()
a := val2
b := a
altd(1)
altd()
c := d
altd(1)
altd()
// Function oWndFromHwnd( hWnd ) --> oWnd
b := oWndFromHwnd( hWnd )
return nil
****************************************************
#pragma BEGINDUMP
#include <windows.h>
#include <hbvm.h>
#include <hbapiitm.h>
BOOL WINAPI DllEntryPoint( HINSTANCE hinstDLL, DWORD fdwReason,
LPVOID lpvReserved )
{
HB_SYMBOL_UNUSED( hinstDLL );
HB_SYMBOL_UNUSED( fdwReason );
HB_SYMBOL_UNUSED( lpvReserved );
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// MessageBox( 0, "DLL properly loaded -", "DLL entry", 0 );
hb_vmInit( 0 );
break;
case DLL_PROCESS_DETACH:
// MessageBox( 0, "DLL unloaded - ", "DLL exit", 0 );
break;
}
return TRUE;
}
void pascal __export HBDLLENTRY( char * cProcName )
{
hb_itemDoC( cProcName, 0 );
}
void pascal __export HBDLLENTRY2( char * cProcName, PHB_ITEM pParam1, PHB_ITEM pParam2 )
{
hb_itemDoC( cProcName, 2, pParam1, pParam2 );
}
#pragma ENDDUMP
********************************************
Don Lowenstein
www.laapc.com
www.laapc.com
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: access to window via its :hwnd
Don,
Please remove NOWAIT from here and try it again:
ACTIVATE DIALOG OWAITDLG ;
CENTERED ;
NOWAIT
Please remove NOWAIT from here and try it again:
ACTIVATE DIALOG OWAITDLG ;
CENTERED ;
NOWAIT
- don lowenstein
- Posts: 196
- Joined: Mon Oct 17, 2005 9:09 pm
- Contact:
Re: access to window via its :hwnd
Without the NOWAIT the dialog showed on the screen and waited until closed.
I tried to send a reference to an oPrinter object also. same results - the system either hung or GPF'ed depending on what and how I passed it.
I can't readily see how to gain access to an object created in one .exe, which is required to be examined within a Harbour .dll function, like FUNCTION TEST3()
Each time I attempt to reference the passed "object" the process terminated.
I tried to send a reference to an oPrinter object also. same results - the system either hung or GPF'ed depending on what and how I passed it.
I can't readily see how to gain access to an object created in one .exe, which is required to be examined within a Harbour .dll function, like FUNCTION TEST3()
Each time I attempt to reference the passed "object" the process terminated.
Don Lowenstein
www.laapc.com
www.laapc.com
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: access to window via its :hwnd
Don,
In order to use Harbour objects created in the EXE from the DLL, you have to use a pcode DLL and not an autocontained DLL. The pcode DLL shares the EXE virtual machine, so it can access and manage the created objects from the EXE.
Please review FWH/samples/buildhdp.bat to build them
also review samples/pcodedl*.prg
In order to use Harbour objects created in the EXE from the DLL, you have to use a pcode DLL and not an autocontained DLL. The pcode DLL shares the EXE virtual machine, so it can access and manage the created objects from the EXE.
Please review FWH/samples/buildhdp.bat to build them
also review samples/pcodedl*.prg
- don lowenstein
- Posts: 196
- Joined: Mon Oct 17, 2005 9:09 pm
- Contact:
Re: access to window via its :hwnd
My ultimate goal is to create an object in Visual C# and have access to that object within Harbour code.
Do you think this is possible?
Do you think this is possible?
Don Lowenstein
www.laapc.com
www.laapc.com
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: access to window via its :hwnd
Don,
Yes, you can do it using the FiveNet design architecture:
https://bitbucket.org/fivetech/fivenet/ ... chitecture
Please review FiveNet source code:
https://bitbucket.org/fivetech/fivenet/src
In its samples folder there are some working examples you can review
Yes, you can do it using the FiveNet design architecture:
https://bitbucket.org/fivetech/fivenet/ ... chitecture
Please review FiveNet source code:
https://bitbucket.org/fivetech/fivenet/src
In its samples folder there are some working examples you can review