Rufid.dll

  • Wäre einer von Euch so lieb mir zu zeigen wie ich diese dll in Autoit ansteuern kann ?
    Werde aus dem Beispiel in C leider nicht schlau.

    Beispiel in C:
    [spoiler]

    [\spoiler]

    Mein vermutlich peinlicher Versuch:

    [autoit]

    Global $ergebniss
    Global $nummer="02212154784"

    [/autoit][autoit][/autoit][autoit]

    $Open = DllOpen("RufIdent\Rufid.dll")
    DllCall($Open, "str", "UseVersion", "int", "2")
    $pGetRufIdentInfo = DllCall($Open, "str", "SucheTelefonnummer", "str", $nummer,"str", $ergebniss)
    If Not $pGetRufIdentInfo Then
    msgbox(0,"test","fehler",0)
    Else
    msgbox(0,"test",$ergebniss,0)
    endif

    [/autoit][autoit][/autoit][autoit]

    exit

    [/autoit]

    Danke

  • Ich hab zwar die DLL nicht, hätte es aber mal so versucht:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $sNummer = "02212154784"
    Global $hDLL = DllOpen("RufIdent\Rufid.dll")

    [/autoit] [autoit][/autoit] [autoit]

    _UseVersion(2)
    Global $aErgebnis = _SucheTelefonnummer($sNummer)
    _ArrayDisplay($aErgebnis)

    [/autoit] [autoit][/autoit] [autoit]

    DllClose($hDLL)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _UseVersion($iVersion)
    DllCall($hDLL, "none", "UseVersion", "BYTE", $iVersion)
    Return @error
    EndFunc ;==>_UseVersion

    [/autoit] [autoit][/autoit] [autoit]

    Func _SucheTelefonnummer($sNummer)
    Local $tagEintrag = "char markiert;char titel[5];char adel;char namevorsatz;char namezusatz;char geschlecht;char vorname[31];" & _
    "char anrede[11];char name[121];char zusatz[121];char ortsteil[41];char strasse[47];char hausnummer[11];char hausnummerzusatz[21];" & _
    "char land[4];char plz[6];char ort[71];char vorwahl[11];char telzusatz[16];char telefon[21]"

    [/autoit] [autoit][/autoit] [autoit]

    Local $tEintrag = DllStructCreate($tagEintrag)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aRet = DllCall($hDLL, "none", "SucheTelefonnummer", "str", $sNummer, "struct*", $tEintrag, "int*", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aErgebnis[20]

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 20
    $aErgebnis[$i - 1] = DllStructGetData($tEintrag, $i)
    Next
    Return $aErgebnis
    EndFunc ;==>_SucheTelefonnummer

    [/autoit]
  • Oh danke funkey!
    Funktioniert leider noch nicht, aber dein Script erklärt mir doch einiges aus dem C Beispiel.
    z.B. das das ich die Rückgabe als Array erst definieren muss und wie das geht.

    Werde mir nun in der Onlinehilfe sorgsam die von dir verwendeten Funktionen durchlesen und ausprobieren.

  • Funktioniert die Funktion _UseVersion() wenigstens, oder ist da auch noch etwas falsch? Hab nämlich die DLL von hier geladen und da funktionierte nicht mal das DllOpen()!? Kann aber sein, dass die DLL beim Starten noch irgendwelche Abhängigkeiten überprüft und es deshalb nicht funktioniert, keine Ahnung.

  • Ich habe mal ErrorChecks eingebaut, die Dll wird geladen.
    Danach popt ein Fenster auf: "Runtime error 217 at 000112A7".
    Ich würde sagen der bezieht sich auf die Dll.

    Den DllCall endet mit @error

    Habe hier noch ein Beispiel, allerdings nun in Delphi gefunden: klick
    Dort wird das DllStructCreate anders erstellt.
    Ich vermute das ändert sich mit jeder Klicktel und Rufident Version.

    Werde das mal versuchen anzupassen, ob es zu dieser Version richtig ist.
    Die Rufid.dll funktioniert auch nur in Zusammenhang mit einer passenden KlickTel Version.
    Vermute das sie bei dir daher gar nicht erst lädt.

    Man muss erst Klicktel 1x gestartet haben (kann danach auch direkt beendet werden) damit die RufId.dll funktioniert.
    Ich habe z.B. RufId 28 und Klicktel Version Telefon & Branchenbuch Frühjahr 2012.
    Für knapp 12€+Porto in der Bucht :)

    Danke dir auf jeden Fall für deine Mühe!

  • Update:
    Habe mir die 30 Tage Testversion von Delphi installiert und den Delphi Code mal compiliert.
    Das funktioniert einwandfrei, so ist schon mal sichergestellt das dieses Beispiel überhaupt noch funktioniert.
    Werde nun mal schauen wie das mit den Variablen in Autoit ist und ob ich das ohne RuntimeError ans laufen bekomme :)

  • update:
    Sorry das ich hier immer neue Beiträge schreibe, aber wenn ich einen Beitrag bearbeite wirft mir das Forenscript nach dem Absenden jede Menge Zeilenumbrüche in den Text :S

    Also ich gebe das nun auf, dafür reichen meine Kenntnisse leider noch nicht aus.
    Habe hier nun für alle anderen Interessierten eine andere Lösung, nicht so komfortabel wie direkt die dll zu nutzen, aber besser als gar nichts.

    Man benötigt dazu die Pimktel.exe (Nähere Infos dazu hier ), die speichert man im Ordner mit der RufId.dll
    Nun Pimktel.exe starten und mit dem kleinen Autoit Script von HIER kann man dann nach Telefonnummern in KlickTel suchen.

    Alternativ gibt es das Script auch hier:

    [autoit]

    #include "Inet.au3"

    [/autoit][autoit][/autoit][autoit]

    If Not ProcessExists("pimktel.exe") Then
    MsgBox(48, "Hinweis", "pimktel.exe ist nicht gestartet!")
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    $areacode = StringLeft($CmdLine[1], 2)
    If $areacode = 49 Then
    $telnr = StringReplace($CmdLine[1], "49", "0", 1)
    Else
    $telnr = $CmdLine[1]
    EndIf

    [/autoit][autoit][/autoit][autoit]

    $htmsource = _INetGetSource("http://127.0.0.1:10007/" & $telnr)

    [/autoit][autoit][/autoit][autoit]

    $array = StringSplit($htmsource, '=''['']')
    If $array[0] <= 1 Then
    SplashTextOn("Anruf", @CRLF & " Rufnummer unterdrückt," & @CRLF & " oder nicht im Telefonbuch.", 245, 80, 0, 0, 20, -1, -1, 700)
    Sleep(15000)
    SplashOff()
    Exit
    EndIf
    SplashTextOn("Anruf", " " & $array[6] & @CRLF & " " & $array[3] & @CRLF & " " & $array[18] & " " & $array[21] & @CRLF & " " & $array[24] & " " & $array[27], 250, 100, 0, 0, 20, -1, -1, 700)
    Sleep(15000)
    SplashOff()

    [/autoit]
  • Wnn das Delphi-Beispiel mit deiner Version der DLL funktioniert, dann sollte sich bestimmt einer finden, der den Code von Delphi nach AutoIt richtig portieren kann. Für mich ist die Delphi/Pascal-Syntax ein bischen selktsam, ich werde mich aber bei Gelegenheit noch einmal damit versuchen.

  • Wenn du da jemand kennst, der Delphi und Autoit kann, wäre es lieb wenn du denjenigen mal fragen könntest.

    Ich kenne hier leider noch niemand so wirklich.


    Bei deinem Beispiel kommt bei mir bei DllCall der Fehler "1 unable to use the DLL file" zurück.

    Habe dann mal im Web geschaut und rumprobiert.

    Verstand das so, das wenn ich eine Struct habe, ich diese mit einen Pointer abschicken muss.
    In anderen Beispielen war das dann wie du das gemacht hast, ohne den Pointer.

    Irgendwie schrieb da jeder was anderes und als ich dann gelesen habe das "none" der Befehl ist gar nix zurück zu geben...wir aber doch von der Dll die Werte haben wollen und man "int" nehmen solle, habe ich dann kapituliert.


    Habe glaub eine Seite von BugFix dazu gefunden: http://bug-fix.info/dll/dll_tut.html

    Dachte am Ende des Aufrufes sollte noch die Größe des Struct mit bei, aber das klappte so auch nicht.

    Den in der Delphi Sache übermittelt er die Daten an die Dll so:

    Code
    PSucheTelefonnummer( PChar( Edit1.Text ), EList, ECount );

    Wo ich dachte ECount wäre die Länge des Struct.


    Aber mehr als Raten und ausprobieren kann ich da derzeit nicht, das führte bisher zu nix.


    Habe dir anbei auch die Compilierte Delphi.exe mit dem Source hochgeladen.

    Hab derweil mal ein paar Regex für die Pimktel.exe erstellt, falls die noch einer braucht...
    hier sind sie:
    [spoiler]

    [autoit]

    $htmsource = _INetGetSource("http://127.0.0.1:10007/" & $telnr)
    $htmsource = StringReplace($htmsource, "-", ","); bei Gerichten oder Firmen ist oft ein - dabei, bei Namen nur ein ,...
    ;land
    $array = StringRegExp($htmsource, '(?i)intareacode=([^]]*)', 1)
    $Land=$array[0]

    [/autoit][autoit][/autoit][autoit]

    ;regex vorwahl + nummer
    $array = StringRegExp($htmsource, '(?i)areacode=([^]]*)\]\[number=([^]]*)', 1)
    $Vorwahl=$array[0]
    $TelNummer=$array[1]

    [/autoit][autoit][/autoit][autoit]

    ;regex name, nachname...
    $array = StringRegExp($htmsource, '(?i)lastname=([^,]*)\,\s([^]]*)', 1)
    $Vorname=$array[1]
    $Nachname=$array[0]

    [/autoit][autoit][/autoit][autoit]

    ;regex strasse + nummer
    $array = StringRegExp($htmsource, '(?i)street=([^]]*)\]\[streetno=([^]]*)', 1)
    $Strasse=$array[0]
    $StrNummer=$array[1]

    [/autoit][autoit][/autoit][autoit]

    ;regex postalcode
    $array = StringRegExp($htmsource, '(?i)code=([^]]*)\]\[city=([^]]*)', 1)
    $Plz=$array[0]
    $City=$array[1]
    msgbox(0,$Vorwahl & "-" & $TelNummer,"Land: " & $Land & @CRLF & $Vorname & " " &$Nachname & @CRLF & $Strasse & " " &$StrNummer & @CRLF & $Plz & " " &$City )

    [/autoit][autoit][/autoit][autoit][/autoit]

    [\spoiler]

  • Hab mir noch mal den Delphi-Code angeschaut und sehe da eigentlich keinen großen Unterschied.
    Du könntest mal versuchen das

    [autoit]


    Local $aRet = DllCall($hDLL, "none", "SucheTelefonnummer", "str", $sNummer, "struct*", $tEintrag, "int*", 1)

    [/autoit]


    durch das

    [autoit]


    Local $aRet = DllCall($hDLL, "none", "SucheTelefonnummer", "str", $sNummer, "ptr", DllStructGetPtr($tEintrag), "int", 1)

    [/autoit]


    zu ersetzen.

  • Genau das hatte ich auch probiert, nach dem ich mir das Tutorial auf BugFix Seite durchgelesen habe.
    Aber da kommt nur: AutoIT3.exe ended.rc:-1073741819

    Hatte sogar statt "int",1 dann die Größe des Pointers mittels DllStructGetSize versendet.

    Die Telefonnummer wird aber als String in dem C/Delphi Code geschickt ?
    Hatte vorhin noch gelesen das wäre ein Char-Array:

    Zitat

    ;Wie ich das sehe, brauch die Funktion SucheTelefonnummer folgende Parameter:
    ;1. ein char-array mit der Nummer, die ich suchen möchte,
    ;2. eine Structure als output mit den gefundenen Daten
    ;3. ein integer für eine Anzahl (dessen Sinn ich aber nicht verstehe)


    Jedenfalls danke ich dir für deine Hilfe!

  • Sooooo *schnarch* noch eine andere Lösung :)
    Ich nutze nun die NrZuName.dll, die kann man problemlos in Autoit aufrufen und eine zu suchende Nummer Übergeben.
    Leider keine Ahnung woher die nun kommt, hab die in einem Beitrag über Rückwärtssuche in Telefonbüchern gefunden.
    Aufruf erfolgt ganz einfach

    [autoit]

    DllCaLL($hDLL, "int", "SucheNamen", "str", $sNummer)

    [/autoit]


    Ergebniss wird dann als Textfile gespeichert :)

    Gute Nacht :sleeping:

  • Super wenn wenigstens etwas funktioniert!
    Die NrZuName.dll sieht so aus, als ob jemand einfach den C_Code aus Post#1 genommen hätte, leicht geändert und eine DLL darauf erstellt hat. Natürlich nur, wenn diese DLL die andere DLL benutzt.

    Der 3. Parameter in SucheTelefonnummer ist glaube ich die Anzahl der Strukturen, die du übergibst, falls du erwartest, dass die Nummer öfters gefunden wird. Da der Wert ByRef (als Pointer --> int*) übergeben wird kann die Funktion den Wert beschreiben. So kommt z.B. 0 zurück, wenn die Nummer nicht gefunden wurde.

  • Hi funkey,
    danke für die Erklärung, dann kann der dritte Wert ja immer 1 bleiben.
    Da man mit Vorwahl sucht, kann auch nur eine oder keine gefunden werden.
    Es wird also immer nur das Struct 1x benötigt.

    Zumindest echt interessant wie viel Möglichkeiten es gibt, mit der KlickTel und RufIdent zu arbeiten.
    RufIdent erstellt wollt aus den KlickTel Daten eine eigene Telefondatenbank: Fast.dat und Fasti.dat
    Wollte mir das mal ansehen, aber im HexEditor steht da auch nur "Kauderwelsch".
    Vermute daher das die verschlüsselt ist.

    Mit der Dll wird dann wohl darin nach der Nummer gesucht.
    Kurios ist nur das man KlickTel vorher min. 1x gestartet haben muß.
    Zumindest wenn man mit den Dll´s arbeiten möchte.

    Nutzt man nur die Pimktel.exe, die als Server zwischen dem Autoit Anrufmonitor und der RufIdent Dll fungiert, braucht man KlickTel nicht vorher zu öffnen.
    Habe mich daher nun dazu Entschieden diese zu benutzen.

    Interessant für Benutzer die RufIdent nicht haben, wäre es zu wissen wie man sich die Klicktel Datenbank ähnlich Rufident erstellt.
    Aber das soll ein anderer machen :)

    Ich werde in den Anrufmonitor zumindest einen Bereich einbauen, in dem man auswählen kann womit man arbeiten möchte.
    Zum einen die Internet Version von KlickTel, die aber eigentlich gar keine Nummern findet und zum anderen die Software Version von Klicktel mit der passenden RufIdent.

    Jedenfalls hat das alles bisher Spaß gemacht und ich denke die ganzen Beiträge hier, helfen anderen Usern die sichdamit beschäftigen weiter.
    Hättest du mir nicht geantwortet und geholfen, würde hier nur ein Beitrag mit einer Frage stehen.

    Danke dir!