Italia
Foro

TAPI-Problem

 

Matthias
Arlt
Hallo in die Runde

Ich habe mich mal im Netz umgesehen und mir aus einigen VB- und Delphi-Codes folgende TAPI-Routine zusammengebastelt. Die funktioniert soweit auch. Beim Aufruf von linemakecall wird die Verbindung auch korrekt aufgebaut. Allerdings knallts dann mit der bekannten Meldung Anwendungsfehler: Exception....... Ich habe schon Verschiedenes durchprobiert, aber ohne positives Ergebnis. Und bevor ich mich hier irgendwie verrenne, hoffe ich sehr auf Eure hilfreichen Ideen.
Hier mal der Code:
Def LineInit(5) !tapi32,lineInitialize
Def LineInitEx(7) !tapi32,lineInitializeExA
Def LineNegotiateAPIVersion(6) !tapi32,lineNegotiateAPIVersion
Def LineGetDevCaps(5) !tapi32,lineGetDevCaps
Def LineOpen(9) !tapi32,lineOpenA
Def LineSetStatusMessages(3) !tapi32,lineSetStatusMessages
Def LineMakeCall(5) !tapi32,lineMakeCall
Def LineShutdown(1) !tapi32,lineShutdown
declare TapiHdl#,TapiHdl&,TapiNumDevs#,TapiCallBack#,TapiVer#,extID#,ghLine#,ghCall#
declare TapiLineDevCaps#,LineCallParams#,TapiReturn&,TapiDevs&,ChooseDev&,DialNumber$
DialNumber$=123456 fiktive Telefonnummer

proc MakeTapiCall

    dim TapiHdl#,4
    dim TapiCallBack#,4
    dim TapiNumDevs#,4
    dim extID#,16
    dim ghLine#,4
    dim ghCall#,4
    dim TapiVer#,4
    long TapiVer#,0=$00020000	dwTapiVersion
    dim TapiLineDevCaps#,270
    long TapiLineDevCaps#,0=270     dwTotalSize
    dim LineCallParams#,236
    long LineCallParams#,0=236      dwTotalSize
    long LineCallParams#,4=1        dwBearerMode = LINEBEARERMODE_VOICE
    long LineCallParams#,16=4       dwMediaMode = LINEMEDIAMODE_INTERACTIVEVOICE
    long LineCallParams#,4=8        dwBearerMode = LINEBEARERMODE_DATA
    long LineCallParams#,16=16      dwMediaMode = LINEMEDIAMODE_DATAMODEM
    long LineCallParams#,20=2       dwCallParamFlags = LINECALLPARAMFLAGS_IDLE
    long LineCallParams#,24=1       dwAddressMode = LINEADDRESSMODE_ADDRESSID
    long LineCallParams#,28=0       dwAddressID
    TAPI initialisieren:
    TapiReturn&=LineInit(TapiHdl#,%hinstance,TapiCallBack#,0,TapiNumDevs#)
    TapiReturn&=LineInitEx(TapiHdl#,%hinstance,TapiCallBack#,0,TapiNumDevs#,TapiVer#,0)
    print LineInitEx +str$(TapiReturn&)
    TapiHdl&=long(TapiHdl#,0)
    TapiDevs&=long(TapiNumDevs#,0)
    print TapiNumDevs +str$(long(TapiNumDevs#,0))
    alle Tapi-Devices abfragen bis Modem gefunden...
    ChooseDev&=0

    whileloop TapiDevs&

        ChooseDev& = &loop - 1
        lokal zu verwendende API-Version aushandeln:
        TapiReturn&=LineNegotiateAPIVersion(TapiHdl&,ChooseDev&,$00020000,$00030000,TapiVer#,extID#)
        print NegotiateAPI +str$(TapiReturn&)
        print LocalAPI $000+hex$(long(TapiVer#,0))

        if TapiReturn& = 0

            Device-Parameter abfragen:
            TapiReturn&=LineGetDevCaps(TapiHdl&,ChooseDev&,long(TapiVer#,0),0,TapiLineDevCaps#)
            print GetDevCaps +str$(TapiReturn&)
            print dwBearerModes +str$(long(TapiLineDevCaps#,52))
            print dwMaxRate +str$(long(TapiLineDevCaps#,56))
            print dwMediaModes +str$(long(TapiLineDevCaps#,60))

            if TapiReturn& = 0

                wenn Modem gefunden...

                ifnot (long(TapiLineDevCaps#,52)=1) and (long(TapiLineDevCaps#,56)>=9600) and (long(TapiLineDevCaps#,60)=16)

                    if (long(TapiLineDevCaps#,52)=1) or (long(TapiLineDevCaps#,56)>=9600) or (long(TapiLineDevCaps#,60)=16)

                        clear ghLine#
                        TapiReturn&=LineOpen(TapiHdl&,ChooseDev&,ghLine#,long(TapiVer#,0),0,0,1,0,0)
                        print LineOpen +str$(TapiReturn&)

                        if TapiReturn& = 0

                            TapiReturn&=LineSetStatusMessages(long(ghLine#,0),$2+$4+$8+$80+$100+$400+$40000,1)
                            print SetStatusMessages +str$(TapiReturn&)

                            if TapiReturn& = 0

                                print Anwahl von +DialNumber$+  mit Gerät +str$(ChooseDev&)
                                clear ghCall#
                                TapiReturn&=LineMakeCall(long(ghLine#,0),ghCall#,addr(DialNumber$),0,LineCallParams#)
                                print MakeCall +str$(TapiReturn&)
                                messagebox(Anwahl erfolgreich !,,0)
                                print Anwahl erfolgreich !
                                case TapiHdl& <> 0 : LineShutdown(TapiHdl&)
                                break

                            endif

                        endif

                        case TapiHdl& <> 0 : LineShutdown(TapiHdl&)

                    endif

                endif

            endif

        endif

    wend

    dispose TapiHdl#
    dispose TapiNumDevs#
    dispose extID#
    dispose ghLine#
    dispose ghCall#
    dispose TapiCallBack#
    dispose TapiVer#
    dispose TapiLineDevCaps#
    dispose LineCallParams#

endproc

cls
MakeTapiCall
waitinput

Matthias
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
23.01.2008  
 



Bei beiden Profanversionen (Profan 7 ff. / 9.1sh) Absturz an selber Stelle?

Leider habe ich kein tapifähiges Gerät um es wirklich testen zu können...

PS: Codes nicht in
sondern in [CODE]
 
23.01.2008  
 




Matthias
Arlt
Hallo IF
Ja, Absturz an gleicher Stelle. Mit dem Unterschied, daß bei Profan 7 die Verbindung bis zum Wegklicken der Fehlermeldung bestehen bleibt und bei XProfan sofort, also noch während des Wahlvorgangs abbricht. Bin daher etwas ratlos...

In CODE statt in BOX: Ja, eigentlich klar. Ich habe momentan testweise einen kleineren Monitor in Gebrauch mit nur 800x600. Da läßt sich die XProfan-Seite etwas schwierig handhaben. Und da passiert das schon mal...
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
23.01.2008  
 



Könntest Du mal ein Verzeichnis c:p00x anlegen und folgenden Code ausführen?
proc __xpse__endofprogram__

    REM {{SOMEEXTRAENDCOMMAND}}
    end

endproc

DECLARE TAPIHDL#,TAPIHDL&,TAPINUMDEVS#,TAPICALLBACK#,TAPIVER#,EXTID#,GHLINE#,GHCALL#,TAPILINEDEVCAPS#,LINECALLPARAMS#,TAPIRETURN&,TAPIDEVS&,CHOOSEDEV&,DIALNUMBER$
declare __gallog__%
__gallog__%=0

proc __log__

    parameters u$,s$
    assign #89,C:P00X	api.debug
    append #89
    print #89,mkstr$(chr$(9),__gallog__%)+s$
    close #89
    return u$

endproc

assign #89,C:P00X	api.debug
rewrite #89
close #89
__log__ @$(0), DEF LINEINIT(5) !*tapi32*,*lineInitialize*
DEF LINEINIT(5) !tapi32,lineInitialize
__log__ @$(0), DEF LINEINITEX(7) !*tapi32*,*lineInitializeExA*
DEF LINEINITEX(7) !tapi32,lineInitializeExA
__log__ @$(0), DEF LINENEGOTIATEAPIVERSION(6) !*tapi32*,*lineNegotiateAPIVersion*
DEF LINENEGOTIATEAPIVERSION(6) !tapi32,lineNegotiateAPIVersion
__log__ @$(0), DEF LINEGETDEVCAPS(5) !*tapi32*,*lineGetDevCaps*
DEF LINEGETDEVCAPS(5) !tapi32,lineGetDevCaps
__log__ @$(0), DEF LINEOPEN(9) !*tapi32*,*lineOpenA*
DEF LINEOPEN(9) !tapi32,lineOpenA
__log__ @$(0), DEF LINESETSTATUSMESSAGES(3) !*tapi32*,*lineSetStatusMessages*
DEF LINESETSTATUSMESSAGES(3) !tapi32,lineSetStatusMessages
__log__ @$(0), DEF LINEMAKECALL(5) !*tapi32*,*lineMakeCall*
DEF LINEMAKECALL(5) !tapi32,lineMakeCall
__log__ @$(0), DEF LINESHUTDOWN(1) !*tapi32*,*lineShutdown*
DEF LINESHUTDOWN(1) !tapi32,lineShutdown
__log__ @$(0), DIALNUMBER$=*725372*
DIALNUMBER$=725372
__log__ @$(0), #DEFINE PROCEDURE { proc MAKETAPICALL }/* LINE:12
proc MAKETAPICALL
__log__ @$(0), PROCEED PROCEDURE { proc MAKETAPICALL } /* LINE:12 {
inc __gallog__%
__log__ @$(0), DIM TAPIHDL#,4
DIM TAPIHDL#,4
__log__ @$(0), DIM TAPICALLBACK#,4
DIM TAPICALLBACK#,4
__log__ @$(0), DIM TAPINUMDEVS#,4
DIM TAPINUMDEVS#,4
__log__ @$(0), DIM EXTID#,16
DIM EXTID#,16
__log__ @$(0), DIM GHLINE#,4
DIM GHLINE#,4
__log__ @$(0), DIM GHCALL#,4
DIM GHCALL#,4
__log__ @$(0), DIM TAPIVER#,4
DIM TAPIVER#,4
__log__ @$(0), LONG TAPIVER#,0=$00020000
LONG TAPIVER#,0=$00020000
__log__ @$(0), DIM TAPILINEDEVCAPS#,270
DIM TAPILINEDEVCAPS#,270
__log__ @$(0), LONG TAPILINEDEVCAPS#,0=270
LONG TAPILINEDEVCAPS#,0=270
__log__ @$(0), DIM LINECALLPARAMS#,236
DIM LINECALLPARAMS#,236
__log__ @$(0), LONG LINECALLPARAMS#,0=236
LONG LINECALLPARAMS#,0=236
__log__ @$(0), LONG LINECALLPARAMS#,4=1
LONG LINECALLPARAMS#,4=1
__log__ @$(0), LONG LINECALLPARAMS#,16=16
LONG LINECALLPARAMS#,16=16
__log__ @$(0), LONG LINECALLPARAMS#,20=2
LONG LINECALLPARAMS#,20=2
__log__ @$(0), LONG LINECALLPARAMS#,24=1
LONG LINECALLPARAMS#,24=1
__log__ @$(0), LONG LINECALLPARAMS#,28=0
LONG LINECALLPARAMS#,28=0
__log__ @$(0), TAPIRETURN&=LINEINIT(TAPIHDL#,%HINSTANCE,TAPICALLBACK#,0,TAPINUMDEVS#)
TAPIRETURN&=LINEINIT(TAPIHDL#,%HINSTANCE,TAPICALLBACK#,0,TAPINUMDEVS#)
__log__ @$(0), PRINT *LineInitEx *+STR$(TAPIRETURN&)
PRINT LineInitEx +STR$(TAPIRETURN&)
__log__ @$(0), TAPIHDL&=LONG(TAPIHDL#,0)
TAPIHDL&=LONG(TAPIHDL#,0)
__log__ @$(0), TAPIDEVS&=LONG(TAPINUMDEVS#,0)
TAPIDEVS&=LONG(TAPINUMDEVS#,0)
__log__ @$(0), PRINT *TapiNumDevs *+STR$(LONG(TAPINUMDEVS#,0))
PRINT TapiNumDevs +STR$(LONG(TAPINUMDEVS#,0))
__log__ @$(0), CHOOSEDEV&=0
CHOOSEDEV&=0
__log__ @$(0), WHILELOOP { WHILELOOP TAPIDEVS& } /* LINE:36 {
WHILELOOP TAPIDEVS&
__log__ @$(0), CHOOSEDEV&=&LOOP - 1
CHOOSEDEV&=&LOOP - 1
__log__ @$(0), TAPIRETURN&=LINENEGOTIATEAPIVERSION(TAPIHDL&,CHOOSEDEV&,$00020000,$00030000,TAPIVER#,EXTID#)
TAPIRETURN&=LINENEGOTIATEAPIVERSION(TAPIHDL&,CHOOSEDEV&,$00020000,$00030000,TAPIVER#,EXTID#)
__log__ @$(0), PRINT *NegotiateAPI *+STR$(TAPIRETURN&)
PRINT NegotiateAPI +STR$(TAPIRETURN&)
__log__ @$(0), PRINT *LocalAPI $000*+HEX$(LONG(TAPIVER#,0))
PRINT LocalAPI $000+HEX$(LONG(TAPIVER#,0))
__log__ @$(0), IF { IF TAPIRETURN&=0 } /* LINE:41 {
IF TAPIRETURN&=0
__log__ @$(0), TAPIRETURN&=LINEGETDEVCAPS(TAPIHDL&,CHOOSEDEV&,LONG(TAPIVER#,0),0,TAPILINEDEVCAPS#)
TAPIRETURN&=LINEGETDEVCAPS(TAPIHDL&,CHOOSEDEV&,LONG(TAPIVER#,0),0,TAPILINEDEVCAPS#)
__log__ @$(0), PRINT *GetDevCaps *+STR$(TAPIRETURN&)
PRINT GetDevCaps +STR$(TAPIRETURN&)
__log__ @$(0), PRINT *dwBearerModes *+STR$(LONG(TAPILINEDEVCAPS#,52))
PRINT dwBearerModes +STR$(LONG(TAPILINEDEVCAPS#,52))
__log__ @$(0), PRINT *dwMaxRate *+STR$(LONG(TAPILINEDEVCAPS#,56))
PRINT dwMaxRate +STR$(LONG(TAPILINEDEVCAPS#,56))
__log__ @$(0), PRINT *dwMediaModes *+STR$(LONG(TAPILINEDEVCAPS#,60))
PRINT dwMediaModes +STR$(LONG(TAPILINEDEVCAPS#,60))
__log__ @$(0), IF { IF TAPIRETURN&=0 } /* LINE:47 {
IF TAPIRETURN&=0
__log__ @$(0), IFNOT { IFNOT (LONG(TAPILINEDEVCAPS#,52)=1) AND (LONG(TAPILINEDEVCAPS#,56)>=9600) AND (LONG(TAPILINEDEVCAPS#,60)=16) } /* LINE:48 {
IFNOT (LONG(TAPILINEDEVCAPS#,52)=1) AND (LONG(TAPILINEDEVCAPS#,56)>=9600) AND (LONG(TAPILINEDEVCAPS#,60)=16)
__log__ @$(0), IF { IF (LONG(TAPILINEDEVCAPS#,52)=1) OR (LONG(TAPILINEDEVCAPS#,56)>=9600) OR (LONG(TAPILINEDEVCAPS#,60)=16) } /* LINE:49 {
IF (LONG(TAPILINEDEVCAPS#,52)=1) OR (LONG(TAPILINEDEVCAPS#,56)>=9600) OR (LONG(TAPILINEDEVCAPS#,60)=16)
__log__ @$(0), CLEAR GHLINE#
CLEAR GHLINE#
__log__ @$(0), TAPIRETURN&=LINEOPEN(TAPIHDL&,CHOOSEDEV&,GHLINE#,LONG(TAPIVER#,0),0,0,1,0,0)
TAPIRETURN&=LINEOPEN(TAPIHDL&,CHOOSEDEV&,GHLINE#,LONG(TAPIVER#,0),0,0,1,0,0)
__log__ @$(0), PRINT *LineOpen *+STR$(TAPIRETURN&)
PRINT LineOpen +STR$(TAPIRETURN&)
__log__ @$(0), IF { IF TAPIRETURN&=0 } /* LINE:53 {
IF TAPIRETURN&=0
__log__ @$(0), TAPIRETURN&=LINESETSTATUSMESSAGES(LONG(GHLINE#,0),$2+$4+$8+$80+$100+$400+$40000,1)
TAPIRETURN&=LINESETSTATUSMESSAGES(LONG(GHLINE#,0),$2+$4+$8+$80+$100+$400+$40000,1)
__log__ @$(0), PRINT *SetStatusMessages *+STR$(TAPIRETURN&)
PRINT SetStatusMessages +STR$(TAPIRETURN&)
__log__ @$(0), IF { IF TAPIRETURN&=0 } /* LINE:56 {
IF TAPIRETURN&=0
__log__ @$(0), PRINT *Anwahl von *+DIALNUMBER$+* mit Gerät *+STR$(CHOOSEDEV&)
PRINT Anwahl von +DIALNUMBER$+ mit Gerät +STR$(CHOOSEDEV&)
__log__ @$(0), CLEAR GHCALL#
CLEAR GHCALL#
__log__ @$(0), TAPIRETURN&=LINEMAKECALL(LONG(GHLINE#,0),GHCALL#,ADDR(DIALNUMBER$),0,LINECALLPARAMS#)
TAPIRETURN&=LINEMAKECALL(LONG(GHLINE#,0),GHCALL#,ADDR(DIALNUMBER$),0,LINECALLPARAMS#)
__log__ @$(0), PRINT *MakeCall *+STR$(TAPIRETURN&)
PRINT MakeCall +STR$(TAPIRETURN&)
__log__ @$(0), MESSAGEBOX(*Anwahl erfolgreich !*,**,0)
MESSAGEBOX(Anwahl erfolgreich !,,0)
__log__ @$(0), IF { IF TAPIHDL& <> 0 } /* LINE:62 {
IF TAPIHDL& <> 0
__log__ @$(0), LINESHUTDOWN(TAPIHDL&)
LINESHUTDOWN(TAPIHDL&)
ENDIF
__log__ @$(0), }
__log__ @$(0), BREAK
BREAK
ENDIF
__log__ @$(0), }
ENDIF
__log__ @$(0), }
__log__ @$(0), IF { IF TAPIHDL& <> 0 } /* LINE:68 {
IF TAPIHDL& <> 0
__log__ @$(0), LINESHUTDOWN(TAPIHDL&)
LINESHUTDOWN(TAPIHDL&)
ENDIF
__log__ @$(0), }
ENDIF
__log__ @$(0), }
ENDIF
__log__ @$(0), }
ENDIF
__log__ @$(0), }
ENDIF
__log__ @$(0), }
ENDWHILE
__log__ @$(0), }
__log__ @$(0), DISPOSE TAPIHDL#
DISPOSE TAPIHDL#
__log__ @$(0), DISPOSE TAPINUMDEVS#
DISPOSE TAPINUMDEVS#
__log__ @$(0), DISPOSE EXTID#
DISPOSE EXTID#
__log__ @$(0), DISPOSE GHLINE#
DISPOSE GHLINE#
__log__ @$(0), DISPOSE GHCALL#
DISPOSE GHCALL#
__log__ @$(0), DISPOSE TAPICALLBACK#
DISPOSE TAPICALLBACK#
__log__ @$(0), DISPOSE TAPIVER#
DISPOSE TAPIVER#
__log__ @$(0), DISPOSE TAPILINEDEVCAPS#
DISPOSE TAPILINEDEVCAPS#
__log__ @$(0), DISPOSE LINECALLPARAMS#
DISPOSE LINECALLPARAMS#
dec __gallog__%
__log__ @$(0), }
endproc
__log__ @$(0), CLS
CLS
__log__ @$(0), MAKETAPICALL
MAKETAPICALL
__log__ @$(0), WAITINPUT
WAITINPUT
__log__ @$(0), REM ---ENDOFFILE---
REM ---ENDOFFILE---
__xpse__endofprogram__

...und anschließend die c:p00xapi.debug hier posten?
 
23.01.2008  
 




Matthias
Arlt
Schon erledigt ! Debug-File im Anhang.

3 kB
Hochgeladen:23.01.2008
Downloadcounter316
Download
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
23.01.2008  
 



Die Messagebox Anwahl erfolgreich ! erscheint und bleibt bis Du diese schließt?

Unausreichende Bereichsdimensionierung oder ein Callbackproblem - aber das ist rein spekulativ.
 
23.01.2008  
 




Matthias
Arlt
Ja, die Messagebox bleibt bis zum Schließen. Die Bereichsdimensionierung hatte ich auch zuerst in Verdacht, habe aber schon probehalber die Werte vervielfacht. Leider keine Cambiamento...
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
23.01.2008  
 



lpfnCallback, Dritter Param lineInitializeEx sollte ein Long sein, die Adresse einer Prozedur welche mit procAddr zu beziehen ist. Das ist bei Dir nicht der Fall - teste mal...
 
23.01.2008  
 




Matthias
Arlt
Das CallBack... Stimmt, das wäre noch ne Möglichkeit. Ich werde es testen. Muß mich aber, was die Verwendung von CallBacks in Profan angeht, erstmal einlesen. Da ich vorwiegend Profan7 mit gut funktionierenden und schnellen Workarrounds verwende und alles Übrige mit Assembler-Dlls löse, bin ich damit eigtl. garnicht vertraut...

Und überhaupt: Übrigens erstmal Danke IF, per Deine Unterstützung. Ich muß jetzt erstmal abbrechen. Morgen gehts weiter...

Matthias
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
23.01.2008  
 




Matthias
Arlt
IF, Du hattest recht. Es lag tatsächlich am CallBack. Ist jetzt zwar mit einer völlig leeren Prozedur nur eine Art Dummy, aber es funktioniert immerhin.

Danke nochmals
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
24.01.2008  
 



Gern.

[offtopic]@Roland: *erinner*procAddrStack* - dann ginge auch korrekte wProc[/offtopic]
 
24.01.2008  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

7.842 Views

Untitledvor 0 min.
Axel Berse10.06.2023
rquindt23.05.2016
Helmut12.01.2013

Themeninformationen

Dieses Thema hat 2 subscriber:

Matthias Arlt (6x)
iF (5x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie