Callback-Function für TAPI32.DLL
Verfasst: Do, 29. Sep 2005 10:24
Hallo,
ich würde gerne die TAPI32.DLL unter XBase++ benutzen, um eine Telefonanlage zu steuern.
Die TAPI32.DLL bietet mir die Möglichkeit alle Events der Telegonanlage per Callback-Funktion
zu erhalten. Die Callback-Funktion habe ich in C++ geschrieben und als Pointer an die TAPI32.DLL
übergeben. Nach Auslösung irgendeines Events (z.B. Telefon klinget) wird meine Callback-Funktion
von der TAPI32.DLL aufgerufen. Leider erhalte ich dann sofort die folgende Fehlermeldung.
"Exception: Zugriffsverletzung bei Adresse 004568E0 in Modul 'XPPRT1.dll'. Lesen von Adresse 00000004"
Wie ich nun feststellen musste, ist die TAPI32.DLL Multi-Threaded und generiert bei jedem Event einen
Thread, der dann meine Callback-Funktion aufruft. Sobald in meinem C-Programm die C-API Funktionen
"_conNew, _conPutNl, _conCall" von XBase++ benutzt werden, wird dieser Exception-Fehler erzeugt.
Hat jemand Erfahrung in C++ in Verbindung mit der C-API Schnittstelle von Xbase ?
#include <xppdef.h>
#include <xpppar.h>
#include <xppcon.h>
//-------------------------------------------------------------------------------------------------------------------------
VOID FAR PASCAL lineCallbackFunc(
DWORD hDevice,
DWORD dwMsg,
DWORD dwCallbackInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3
);
//-------------------------------------------------------------------------------------------------------------------------
XPPRET XPPENTRY LP_MYCALLBACK( XppParamList pl){ _retnl(pl, (LONG) lineCallbackFunc ); }
//-------------------------------------------------------------------------------------------------------------------------
VOID FAR PASCAL lineCallbackFunc(
DWORD hDevice,
DWORD dwMsg,
DWORD dwCallbackInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3)
{
ContainerHandle conr = _conNew( NULLCONTAINER );
ContainerHandle con1 = _conPutNL( NULLCONTAINER , (LONG) hDevice );
ContainerHandle con2 = _conPutNL( NULLCONTAINER , (LONG) dwMsg );
ContainerHandle con3 = _conPutNL( NULLCONTAINER , (LONG) dwCallbackInstance );
ContainerHandle con4 = _conPutNL( NULLCONTAINER , (LONG) dwParam1 );
ContainerHandle con5 = _conPutNL( NULLCONTAINER , (LONG) dwParam2 );
ContainerHandle con6 = _conPutNL( NULLCONTAINER , (LONG) dwParam3 );
_conCall( conr , "MyCall6p" , 6, con1, con2, con3, con4, con5, con6);
_conRelease(conr);
_conRelease(con1);
_conRelease(con2);
_conRelease(con3);
_conRelease(con4);
_conRelease(con5);
_conRelease(con6);
}
//-------------------------------------------------------------------------------------------------------------------------
ich würde gerne die TAPI32.DLL unter XBase++ benutzen, um eine Telefonanlage zu steuern.
Die TAPI32.DLL bietet mir die Möglichkeit alle Events der Telegonanlage per Callback-Funktion
zu erhalten. Die Callback-Funktion habe ich in C++ geschrieben und als Pointer an die TAPI32.DLL
übergeben. Nach Auslösung irgendeines Events (z.B. Telefon klinget) wird meine Callback-Funktion
von der TAPI32.DLL aufgerufen. Leider erhalte ich dann sofort die folgende Fehlermeldung.
"Exception: Zugriffsverletzung bei Adresse 004568E0 in Modul 'XPPRT1.dll'. Lesen von Adresse 00000004"
Wie ich nun feststellen musste, ist die TAPI32.DLL Multi-Threaded und generiert bei jedem Event einen
Thread, der dann meine Callback-Funktion aufruft. Sobald in meinem C-Programm die C-API Funktionen
"_conNew, _conPutNl, _conCall" von XBase++ benutzt werden, wird dieser Exception-Fehler erzeugt.
Hat jemand Erfahrung in C++ in Verbindung mit der C-API Schnittstelle von Xbase ?
#include <xppdef.h>
#include <xpppar.h>
#include <xppcon.h>
//-------------------------------------------------------------------------------------------------------------------------
VOID FAR PASCAL lineCallbackFunc(
DWORD hDevice,
DWORD dwMsg,
DWORD dwCallbackInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3
);
//-------------------------------------------------------------------------------------------------------------------------
XPPRET XPPENTRY LP_MYCALLBACK( XppParamList pl){ _retnl(pl, (LONG) lineCallbackFunc ); }
//-------------------------------------------------------------------------------------------------------------------------
VOID FAR PASCAL lineCallbackFunc(
DWORD hDevice,
DWORD dwMsg,
DWORD dwCallbackInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3)
{
ContainerHandle conr = _conNew( NULLCONTAINER );
ContainerHandle con1 = _conPutNL( NULLCONTAINER , (LONG) hDevice );
ContainerHandle con2 = _conPutNL( NULLCONTAINER , (LONG) dwMsg );
ContainerHandle con3 = _conPutNL( NULLCONTAINER , (LONG) dwCallbackInstance );
ContainerHandle con4 = _conPutNL( NULLCONTAINER , (LONG) dwParam1 );
ContainerHandle con5 = _conPutNL( NULLCONTAINER , (LONG) dwParam2 );
ContainerHandle con6 = _conPutNL( NULLCONTAINER , (LONG) dwParam3 );
_conCall( conr , "MyCall6p" , 6, con1, con2, con3, con4, con5, con6);
_conRelease(conr);
_conRelease(con1);
_conRelease(con2);
_conRelease(con3);
_conRelease(con4);
_conRelease(con5);
_conRelease(con6);
}
//-------------------------------------------------------------------------------------------------------------------------