Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 254396 (15832)
  Suchen
Seiten: 1 2Zurück zur Übersicht
 AutorThema: Fritz! Card ansteuern ???
Christian Edelmann
Datum:10.12.01 18:16 Antwortenals Email verschicken (idel@idel-online.de) 


Hallo,

hat schonmal jemand einen ISDN Adapter (z.B. Fritz! Card) über Profan² angesprochen ?
Ich möchte eigentlich nur auswerten ob ein Anruf kommt (und welche MSN angewählt wurde). Ich habe nicht vor irgendwelche Daten zu übertragen...
...leider habe ich keine Ahnung wie ich die Karte ansprechen soll...
Da gibt es doch was mit CAPI, oder ?
Oder gibts dafür eine DLL (das wäre super)?

Ich hoffe es gibt hier jemanden, der sich damit zumindest halbwegs auskennt.

Viele Grüße an alle Profaner...

C. Edelmann


Thorsten HG
Datum:10.12.01 20:25 Antwortenals Email verschicken (mrk@mrk-soft.de) 


Hi,

eine ISDN Kate lässt sich nur über die CAPI ansprechen,
da dort die Funktionen der Karte hinterlegt sind.
Wenn ich jedoch schon damals die CAPI Dokumentation
richtig verstanden habe, läuft der Zugriff über CallBacK
ab !!!




Christian Edelmann
Datum:10.12.01 22:02 Antwortenals Email verschicken (idel@idel-online.de) 


Erstmal Danke für Deine schnelle Antwort !

Was ist CallBack ???
Wie funktioniert das ?

Wie spreche ich die CAPI an? Ist das so eine Art DLL?




Sven Schmidts
Datum:11.12.01 08:12 Antwortenals Email verschicken (schmidts@flat2serv.de) 


Hallo,

CAPI kannst Du nicht ansteuern, weil es ein CallBack Verfahren ist. Sprich: Die CAPI Schnittstelle reagiert auf Anrufe und benachrichtigt registrierte Programme über dieses Ereigniss, liefert bei der Gelegenheit jede Menge Daten mit. Da bekommst Du mehrere Probleme, so scheitert es erstmal daran, dass Profan² dieses "CallBack" nicht kann.

CallBack: Du gibst den Zeiger auf eine Prozedur weiter (z.B. an die CAPI) und die ruft dann die Prozedur von draussen mit div. Parametern auf. Profan's Prozeduren haben aber keinen Zeiger, weil sie anders verwaltet werden.

Das ist das Problem.

Mfg.
Sven Schmidts


Thorsten HG
Datum:11.12.01 08:20 Antwortenals Email verschicken (mrk@mrk-soft.de) 


Moin,

Callback heist soviel wie: Das ein Unterprogramm / DLL, usw.
als Rückgabe nicht etwa einen Wert liefert, sondern
einen Funktion , Programmcode ausführen möchte und zwars
an der angegebenden Adresse, die zu Anfang übergeben wurde.

Dazu ist Profan aber leier nicht in der Lage, also ist
Callback mit Profan NICHT möglich. den eine Prozedure
al Adressea nzugeben ist ebend nicht möglich ....

(jedenfalls normalerweise, Irgendwer hatte sich mal an
DirectDraw mit Porofan versucht und als Call-Back Adresse
im Profan Programm dieekten Assemlber-Code in
Bereichsvariabeln abgelegt, der dort ausgeführt wurde.
Fand ich ehrlich faszinierend, nur ist sowas einfach
zu Aufwendig und der Code ist schwer zu warten.)

Ich schau mal nach, ob ich die Doku noch finde, wenn ich
wieder "To Home" bin, (heute Abend), nur ist die komplett,
wie fast alles, in Englisch.



Sebastian König
Datum:11.12.01 16:21 Antwortenals Email verschicken (feedback@sekoenig.de) 


Hallo,

> (jedenfalls normalerweise, Irgendwer hatte sich mal an
> DirectDraw mit Porofan versucht und als Call-Back Adresse
> im Profan Programm dieekten Assemlber-Code in
> Bereichsvariabeln abgelegt, der dort ausgeführt wurde.
> Fand ich ehrlich faszinierend, nur ist sowas einfach
> zu Aufwendig und der Code ist schwer zu warten.)

der besagte Quellcode stammt von mir und beschäftigt sich mit MDI (Multiple Document Interface) und Profan²; zu finden ist er hier. Für DirectDraw mit Profan² benötigt man nicht unbedingt Callback-Funktionen...

Wie auch immer, mit dieser Methode (Maschinencode in Bereichsvariablen) wäre es zwar wahrscheinlich sogar möglich CAPI mit Profan² zu benutzen, der Aufwand wäre jedoch immens, da man alle wichtigen Teile des Programms als Maschinencode schreiben müsste... Es wäre dann weniger aufwendig, das ganze Programm in Assembler zu schreiben ;-)

MfG

Sebastian


Christian Edelmann
Datum:11.12.01 19:18 Antwortenals Email verschicken (idel@idel-online.de) 


Danke erstmal für die Infos !

Also : CallBack mit Profan ist unmöglich...

...aber was ist, wenn man ein anderes Programm (z.B. in Delphi, C, C++, Pascal, o.ä.) als Schnittstelle benutzt ?

Also in etwa so :

CAPI <---> Interface Programm <---> Profan Programm

Man müsste doch irgendwie Daten zwischen einem Delphi o.ä. Programm und einem Profan Programm austauschen können, oder ?

Jetzt sollte man nur noch Defphi & Co beherrschen...ich kanns nämlich nicht !

Im Internet unter
http://home.t-online.de/home/Peter.Zwosta/index.htm
hab ich einen Delphi - Quelltext für einen Anrufmonitor gefunden. Das wäre wahrscheinlich genau das Richtige...
Kann man dieses Programm so umfunktionieren, dass es bei einem eingehenden Anruf die MSN an Profan übergibt ?

Wäre toll !!!


Sebastian König
Datum:12.12.01 19:17 Antwortenals Email verschicken (feedback@sekoenig.de) 


Hallo,

ich habe auf Basis eines VB-Codes gerade ein wenig mit CAPI experimentiert und dabei bemerkt, dass man kein Callback benötigt, um eingehende Anrufe zu registrieren - es ist ausreichend, in festen Zeitabständen zu kontrollieren, ob neue CAPI-Messages vorhanden sind...

Ich bin nun so weit, dass ich bei einem Anruf tatsächlich eine entsprechende Nachricht von der CAPI erhalte - es sollte so auch möglich sein, die Nummer des Anrufers anzuzeigen.

Heute Abend habe ich leider keine Zeit mehr, mich weiter mit dem Thema zu beschäftigen, aber wenn alles funktioniert kann ich hier morgen wahrscheinlich einen Code posten, der eingehende Anrufe inkl. Rufnummer anzeigt.

MfG

Sebastian


Sebastian König
Datum:13.12.01 21:36 Antwortenals Email verschicken (feedback@sekoenig.de) 


Hallo,

ich habe es zwar aus Zeitmangel leider noch nicht geschafft, den Code vollständig fertigzustellen, aber es funktioniert schon ganz gut. Sowohl anrufende als auch gerufene Nummer werden bei einem Anruf korrekt angezeigt.

Ihr könnt den Quellcode hier herunterladen. Bei mir (Windows XP, Fritz!Card PCI) funktionert es wunderbar.

Folgendes werde ich voraussichtlich morgen noch einbauen:
-Auf einen eingehenden Anruf sollte man eine Antwort-Nachricht senden
-Wenn der Anrufer kein ISDN verwendet, kann natürlich seine Nummer nicht angezeigt werden - darauf sollte man mit einer entsprechenden Nachricht reagieren...

Viel Spaß mit dem Code!

MfG

Sebastian


Sven Schmidts
Datum:14.12.01 14:19 Antwortenals Email verschicken (schmidts@flat2serv.de) 


Respekt!


Sebastian König
Datum:14.12.01 17:32 Antwortenals Email verschicken (feedback@sekoenig.de) 


Hallo,

> Respekt!
Danke :-)

Ich habe den Quellcode nun fertiggestellt. Die Anrufe werden nicht mehr blockiert und auf analoge Telefone und ISDN-Telefone, die keine Nummer senden, wird nun korrekt reagiert.

Außerdem habe ich einige kleinere Fehler korrigiert...

Hier der Download-Link für die fertige Version des Quellcodes:
http://www.sekoenig.de/download/capi.zip

MfG

Sebastian


Christian Edelmann
Datum:16.12.01 14:49 Antwortenals Email verschicken (idel@idel-online.de) 


Vielen Dank!!!

Ich habe dein kleines Programm ausprobiert und es funktioniert einwandfrei. Genau so habe ich mir das vorgestellt. Ich bin jetzt gerade dabei mein Programm etwas umzustricken, dass ich dein Proggie einbauen kann.

Es gibt (fast) nichts, das mit Profan² nicht geht...!

Viele Grüße an alle

C. Edelmann


Sven Schmidts
Datum:17.12.01 14:05 Antwortenals Email verschicken (schmidts@flat2serv.de) 


Naja, da fallen mir schon eine Menge Sachen ein, aber gut. Was man nicht kennt, vermisst man nicht *gg*

Mfg.
Sven Schmidts


Christian Edelmann
Datum:17.12.01 19:33 Antwortenals Email verschicken (idel@idel-online.de) 


Also...

ich hab jetzt den Quellcode in mein Programm eingebaut und bin auf folgendes Problem gestoßen :

Man kann 5mal anrufen und alles funktioniert super. Beim 6. mal bekommt man nur noch ein Besetztzeichen und es passiert auch nichts mehr. Ich habe es auch mit dem "originalen" Code (capi.prf) probiert - genau das gleiche Problem. Wenn man das -Programm dann schließt und wieder öffnet funktioniert es - wieder 5mal. Fehlermeldung bekomme ich keine, es passiert nur einfach nix mehr...

Vielleicht hat Sebastian, der Author eine Idee ???

Gruß Idel


Sebastian König
Datum:17.12.01 19:45 Antwortenals Email verschicken (feedback@sekoenig.de) 


Hallo,

ich habe es bei mir mal ausprobiert und bin auf einen ähnlichen Fehler gestoßen: Nach dem 5. Anruf klingelt zwar mein Telefon, aber der Anruf wird auf dem PC nicht angezeigt...

Ich schätze, dass irgendwelche CAPI-Resourcen nicht freigegeben werden, so dass keine Messages mehr an das Programm gesendet werden. Für diese "Theorie" spricht, dass es nach einem erneuten Start wieder funktioniert.

Ich werde mich bei Gelegenheit (wahrscheinlich schon morgen) mal damit beschäftigen und versuchen, das Problem zu beheben.

MfG

Sebastian


Christian Edelmamm
Datum:17.12.01 20:38 Antwortenals Email verschicken (idel@idel-online.de) 


Vielen Dank !




Jürgen
Datum:18.12.01 11:17 Antwortenals Email verschicken  


Baue das mal ein .. da klappt das bei mir ...

proc TerminateMessageProcessor;
Clear ListenREQ#
word ListenREQ#,00 = 26
word ListenREQ#,02 = AppID&
byte ListenREQ#,04 = $5 'CAPI_LISTEN
byte ListenREQ#,05 = $80 'CAPI_REQ
word ListenREQ#,06 = 01
long ListenREQ#,08 = 01
CAPI_PUT_MESSAGE(AppID&,ListenREQ#)
endproc

'---Timer stoppen und Messages stoppen:

KillTimer

TerminateMessageProcessor



Sebastian König
Datum:18.12.01 14:22 Antwortenals Email verschicken (feedback@sekoenig.de) 


Hallo,

> Baue das mal ein .. da klappt das bei mir ...
> [...]

bei mir hat das nicht geholfen, das Problem zu beheben. Aber Du hast natürlich Recht, es ist besser, vor dem Beenden den Listen-Request zu stoppen.
Ich habe das nun in meinen CAPI-Beispiel-Quellcode eingebaut. Vielleicht kannst Du mir noch Deinen vollen Namen nennen, damit ich die Quelle im Code korrekt angeben kann.

Das von Christian angesprochene Problem habe ich auch lösen können; bei mir funktioniert es jetzt. Die Ursache des Problems war, dass ich Vergessen hatte, die Nachricht CAPI_DISCONNECT ($4) abzufangen und eine Antwort zu senden.

Die überarbeitete Version des Quellcodes könnt ihr wieder unter http://www.sekoenig.de/download/capi.zip herunterladen.

MfG

Sebastian



Jürgen K.
Datum:18.12.01 14:42 Antwortenals Email verschicken  


Hallo Sebastian !
Ich habe vor langer Zeit mal mit Profan gearbeitet und
mit der Capi gespielt. Ich möchte Dir meinen Source
geben ... kann man als Include umarbeiten und verwenden.

Du darfst den Source verändern und etwas für die Profan-Welt
bauen ... viel Spaß damit ...

die DEF ... bitte an obere Stelle des Source setzen !!!

Viele Grüße
Jürgen

' Public Variaben
Declare c_CapiName$, i_Capi_ID&, i_Capi_Handle&, i_Message_Nr%

c_CapiName$ = ""
i_Capi_ID& = 00
i_Capi_Handle& = 00
i_Message_Nr% = 00

Proc GET_CAPI_ID
' Für eventuelle Zusatzfunktionen CAPI_ID zeigen
Return i_Capi_ID&
EndProc

Proc GET_CAPI_DLL_HANDLE
' Für eventuelle Zusatzfunktionen CAPI_DLL_HANDLE zeigen
Return i_Capi_Handle&
EndProc

Proc CAPI_INSTALLED
Parameters c_Capi_Dll$
' Initialisieren und CAPI_Handle holen und für Public erklären
c_CapiName$ = c_Capi_Dll$
Declare i_Ret&
i_Ret& = 01
If i_Capi_Handle& = 00
i_Capi_Handle& = @UseDLL(c_CapiName$)
If i_Capi_Handle& > 32
i_Ret& = 00
Else
i_Ret& = 01
Endif
IF i_Ret& = 00
Def @_CAPI_INSTALLED(00) ! c_CapiName$ ,"CAPI_INSTALLED"
i_Ret& = _CAPI_INSTALLED()
IF i_Ret& <> 00
FreeDLL i_Capi_Handle&
i_Capi_Handle& = 00
i_Capi_ID& = 00
Endif
Endif
Else
i_Ret& = 00
Endif
Return i_RET&
EndProc

Proc CAPI_RELEASE
' Abmelden einer Applikation
Declare i_Ret&
i_Ret& = 01
If (i_Capi_Handle& > 00) And (i_Capi_ID& > 00)
Def @_CAPI_RELEASE(01) ! c_CapiName$ ,"CAPI_RELEASE"
i_Ret& = _CAPI_RELEASE(i_Capi_ID&)
If i_Ret& = 00
FreeDLL i_Capi_Handle&
i_Capi_Handle& = 00
i_Capi_ID& = 00
i_Ret& = 00
Endif
Else
If i_Capi_Handle& > 00
FreeDLL i_Capi_Handle&
i_Capi_Handle& = 00
i_Capi_ID& = 00
i_Ret& = 00
Else
i_Ret& = 00
Endif
Endif
Return i_Ret&
EndProc

Proc CAPI_REGISTER
Parameters i_Log_Verbindung&, i_B_Datenblock&, i_Bytes_B_Datenblock&
' Registrierung einer Applikation Capi_ID holen und für Public erklären
Declare i_Ret&, i_Messages_Bytes&
i_Ret& = 01
i_Messages_Bytes& = (1024 + (1024 * i_Log_Verbindung&))
If i_Capi_Handle& > 00
If i_Capi_ID& = 00
Def @_CAPI_REGISTER(05) ! c_CapiName$ ,"CAPI_REGISTER"
If _CAPI_REGISTER(i_Messages_Bytes&,i_Log_Verbindung&,i_B_Datenblock&,i_Bytes_B_Datenblock&,Addr(i_Capi_ID&)) = 00
i_Ret& = 00
Else
i_Capi_ID& = 00
Endif
Else
i_Ret& = 00
Endif
Endif
Return i_Ret&
EndProc

Proc CapiGetManufacturer
Declare c_Text$
c_Text$ = Space$(64)
If i_Capi_Handle& > 00
External(c_CapiName$,"CAPI_GET_MANUFACTURER",Addr(c_Text$))
Endif
Return Trim$(c_Text$)
EndProc

Proc CapiGetVersion
Declare c_Ret$, c_A&, c_B&, c_C&, c_D&
c_Ret$ = ""
If i_Capi_Handle& > 00
External(c_CapiName$,"CAPI_GET_VERSION",Addr(c_A&),Addr(c_B&),Addr(c_C&),Addr(c_D&))
c_Ret$ = Str$(c_A&)+"."+Str$(c_B&)+" Release "+Str$(c_C&)+"."+Str$(c_D&)
Endif
Return Trim$(c_Ret$)
EndProc

Proc CAPI_WAIT_FOR_SIGNAL
' Warten auf ein Signal über CAPI-Aktivitäten
Declare i_Ret&
i_Ret& = 01
If (i_Capi_Handle& > 00) And (i_Capi_ID& > 00)
Def @_CAPI_WAIT_FOR_SIGNAL(01) ! c_CapiName$ ,"CAPI_WAIT_FOR_SIGNAL"
If _CAPI_WAIT_FOR_SIGNAL(i_Capi_ID&) = 00
i_Ret& = 00
Endif
Endif
Return i_Ret&
EndProc

Proc GET_FREE_MESSAGE_NUMBER
' Nächste frei Messagenummer holen
If i_Capi_ID& > 00
i_Message_Nr% = i_Message_Nr% + 01
If i_Message_Nr% > 255
i_Message_Nr% = 01
Endif
Endif
Return i_Message_Nr%
EndProc

Proc CAPI_PUT_MESSAGE
Parameters i_Capi_Message&
' Message an die CAPI senden
Declare i_Ret&
i_Ret& = 00
If (i_Capi_Handle& > 00) And (i_Capi_ID& > 00)
Def @_CAPI_PUT_MESSAGE(02) ! c_CapiName$ ,"CAPI_PUT_MESSAGE"
i_Ret& = _CAPI_PUT_MESSAGE(i_Capi_ID&,i_Capi_Message&)
Endif
Return @VAL(@HEX$(i_Ret&))
EndProc

'####################################### muß noch bearbeitet werden

Proc CAPI_GET_MESSAGE
' Message von der CAPI abholen
Declare i_Capi_Message&
i_Capi_Message& = 00
Declare i_Ret&
i_Ret& = 00
If (i_Capi_Handle& > 00) And (i_Capi_ID& > 00)
Def @_CAPI_GET_MESSAGE(02) ! c_CapiName$ ,"CAPI_GET_MESSAGE"
i_Ret& = _CAPI_GET_MESSAGE(i_Capi_ID&,Addr(i_Capi_Message&))
If i_Ret& = 00
i_Ret& = i_Capi_Message&
Endif
Endif
Return i_Ret&
EndProc

Proc CAPI_GET_PROFILE
Declare c_Buffer$, i_Adresse&
c_Buffer$ = MkStr$(Chr$(00),255)
If i_Capi_Handle& > 00
Def @_CAPI_GET_PROFILE(02) ! c_CapiName$ ,"CAPI_GET_PROFILE"
_CAPI_GET_PROFILE(Addr(c_Buffer$)+01,01)
Endif
i_Adresse& = Addr(c_Buffer$)

Print "Werte :"
Print "ISDN Controler : "; @Word(i_Adresse&,01)
Print "B-Channels : "; @Word(i_Adresse&,03)
Print "Internal Contr.: "; Byte(i_Adresse&,05)
Print "External Equip.: "; Byte(i_Adresse&,06)
Print "Handset supp. : "; Byte(i_Adresse&,07)
Print "DTMF supp. : "; Byte(i_Adresse&,08)
Waitinput
EndProc

'##################### Main

Print "###### müssen 00 sein"
GET_CAPI_ID
Print "GET_CAPI_ID : "; @&(0)
GET_CAPI_DLL_HANDLE
Print "GET_CAPI_DLL_HANDLE : "; @&(0)
Print "############"
GET_FREE_MESSAGE_NUMBER
Print "GET_FREE_MESSAGE_NUMBER : "; @%(0)
CAPI_INSTALLED "CAPI2032.DLL"
Print "CAPI_INSTALLED : "; @&(0)

CapiGetManufacturer
Print "CAPI - Hersteller : "+@$(0)
CapiGetVersion
Print "CAPI - Version : "+@$(0)

GET_CAPI_DLL_


Jürgen K.
Datum:18.12.01 14:45 Antwortenals Email verschicken  


Der Source ist wohl nich ganz angekommen ...
hier der Rest:

'##################### Main

Print "###### müssen 00 sein"
GET_CAPI_ID
Print "GET_CAPI_ID : "; @&(0)
GET_CAPI_DLL_HANDLE
Print "GET_CAPI_DLL_HANDLE : "; @&(0)
Print "############"
GET_FREE_MESSAGE_NUMBER
Print "GET_FREE_MESSAGE_NUMBER : "; @%(0)
CAPI_INSTALLED "CAPI2032.DLL"
Print "CAPI_INSTALLED : "; @&(0)

CapiGetManufacturer
Print "CAPI - Hersteller : "+@$(0)
CapiGetVersion
Print "CAPI - Version : "+@$(0)

GET_CAPI_DLL_HANDLE
Print "GET_CAPI_DLL_HANDLE : "; @&(0)

CAPI_REGISTER 01,01,128
Print "CAPI_REGISTER : "; @&(0)

GET_CAPI_ID
Print "GET_CAPI_ID : "; @&(0)

'CAPI_WAIT_FOR_SIGNAL
'Print "CAPI_WAIT_FOR_SIGNAL : "; @&(0)

CAPI_GET_PROFILE
WaitInput
CAPI_RELEASE
Print "CAPI_RELEASE : "; @&(0)
WaitInput
End



Seiten: 1 2Zurück zur Übersicht