Forum | | | | 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] |
| | | | |
| | 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? |
| | | | |
| | Matthias Arlt | Schon erledigt ! Debug-Datei im Anhang. |
| | | 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. |
| | | | |
| | 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 Änderung... |
| | | 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... |
| | | | |
| | 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, für 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] |
| | | | |
|
AntwortenThemenoptionen | 8.178 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |